Привет, Хабр!

Сегодня у нас на повестке тема GRUB в Linux. GRUB — это первый, кого видит твоя система после BIOS/UEFI. Он решает, какое ядро загружать, какие параметры передавать, и вообще, даст ли он тебе шанс на нормальный рабочий день или отправит в режим паники.

GRUB нужен, если:

  • Нужно загрузить систему с особыми параметрами.

  • Нужно добавить поддержку нескольких ОС в меню загрузки.

  • Надо включить/выключить режим отладки ядра.

  • Любите жить опасно и копаетесь в экспериментальных функциях Linux.

Структура конфигурации GRUB:

Основной конфиг: /etc/default/grub

Этот файл — первая остановка при настройке GRUB. Открываем:

sudo nano /etc/default/grub

Пример стандартного конфига:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

Обозначение параметров:

  • GRUB_DEFAULT=0 — загружается первая запись в меню GRUB.

  • GRUB_TIMEOUT=5 — пауза в секундах перед автозагрузкой.

  • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" — параметры, которые передаются ядру (по умолчанию он загружается без лишнего вывода).

  • GRUB_CMDLINE_LINUX — дополнительные параметры, которые работают во всех режимах.

Это далеко не все параметры. Ниже будет спойлер со всеми параметрами.

Изменения в файле не вступят в силу сами по себе. После редактирования надо обновить конфиг:

sudo update-grub

Для Fedora или CentOS:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

Бывает, что система не загружается, но есть время на спасение. В такие моменты жмём e в меню GRUB, находим строку вида:

linux /boot/vmlinuz-5.15.0-52-generic root=UUID=xxxx-xxxx-xxxx-xxxx ro quiet splash

И меняем параметры ядра прямо в загрузчике. Например, если система зависает из‑за ACPI, можно добавить:

acpi=off

После чего грузимся с помощью Ctrl + X или F10. Эти изменения действуют только для текущей загрузки.

Все параметры GRUB:

Скрытый текст

Если уже загрузились и хотите узнать, какие параметры применились:

cat /proc/cmdline

Применение

Несколько вариантов применения:

Если провайдер не поддерживает IPv6, а система продолжает упрямо пытаться его использовать:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1"

Обновляем GRUB, перезагружаем систему.

Если вам нужно больше информации при загрузке системы:

GRUB_CMDLINE_LINUX_DEFAULT="debug ignore_loglevel"

После этого получите максимально подробный лог загрузки.

Если у вас простая система, можно попробовать грузиться без initrd:

  1. В /etc/default/grub добавляем:

    GRUB_CMDLINE_LINUX_DEFAULT="noinitrd"
  2. Пересобираем загрузочный образ:

    sudo update-initramfs -u
  3. Обновляем GRUB и перезагружаемся.

Безопасность GRUB

Если не хотите, чтобы кто‑то случайно (или специально) изменил параметры ядра:

  1. Создаём хеш пароля:

    sudo grub-mkpasswd-pbkdf2
  2. Открываем файл /etc/grub.d/40_custom:

    sudo nano /etc/grub.d/40_custom
  3. Добавляем:

    set superusers="admin"
    password_pbkdf2 admin grub.pbkdf2.sha512.10000.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  4. Обновляем GRUB:

    sudo update-grub

Теперь при попытке редактирования параметров загрузки GRUB попросит пароль.

GRUB Modules

GRUB умеет очень многое, но многие даже не подозревают, что можно подгружать модули прямо в загрузчике.

Загрузка по сети через PXE:

insmod pxe
insmod net
insmod tftp
set net_pxe_ifname=eth0
set net_pxe_ip=192.168.1.100
set net_pxe_server=192.168.1.1
set net_pxe_gateway=192.168.1.1
set root=(tftp,192.168.1.1)/

Можно добавить другие полезные модули:

  • lvm — для работы с логическими томами.

  • cryptodisk — для расшифровки зашифрованных дисков перед загрузкой.

  • usb — если грузимся с USB‑диска.

Кастомизация экрана загрузки GRUB

Стандартное меню GRUB скучное?

  1. Кладём красивую картинку в /boot/grub/ (лучше PNG 1024×768).

  2. Открываем /etc/default/grub и добавляем:

    GRUB_BACKGROUND="/boot/grub/background.png"
  3. Обновляем конфиг:

    sudo update-grub

Теперь при загрузке будет фон вместо унылого чёрного экрана.

Можно поменять цвета текста в файле /etc/grub.d/05_debian_theme:

set menu_color_normal=white/black
set menu_color_highlight=yellow/blue

(меняем белый текст на чёрном фоне на жёлтый текст на синем фоне)

Если что-то пошло не так

Сломали GRUB?

  1. Загружаемся с LiveCD или флешки с Linux.

  2. Открываем терминал и монтируем системный раздел:

    sudo mount /dev/sdXn /mnt
    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
  3. Заходим в chroot‑окружение:

    sudo chroot /mnt
  4. Переустанавливаем GRUB:

    grub-install /dev/sdX
    update-grub
  5. Перезагружаемся. Система снова жива.

Если GRUB сломался окончательно, можно загрузить ядро вручную из UEFI:

  1. Загружаемся в UEFI Shell или LiveCD.

  2. Выполняем:

    linux /boot/vmlinuz-5.15.0-52-generic root=/dev/sda2 ro
    initrd /boot/initrd.img-5.15.0-52-generic
    boot
  3. Если сработало — переустанавливаем GRUB:

    sudo grub-install /dev/sda
    sudo update-grub

А как вы использовали GRUB в своих проектах?


Пользуясь случаем, рекомендую обратить внимание на открытые уроки по Linux, которые пройдут в феврале в Otus:

  • 17 февраля: «Каталоги /proc, /sys и /dev: виртуальные файловые системы Linux». Подробнее

  • 24 февраля: «Оптимизация производительности Nginx/Angie». Подробнее

Комментарии (4)


  1. gudvinr
    11.02.2025 21:25

    GRUB нужен

    Для систем с UEFI уже нет.

    Всё это можно сделать через EFI параметры, если собрать UKI, или обойтись systemd-boot, который идёт в нагрузку к остальным компонентам systemd


    1. 13werwolf13
      11.02.2025 21:25

      я бы добавил ещё что ванильный граб очень медлителен при поднятии ядра и initrd с luks encrypted разделов, он просто не использует аппаратное ускорение AES для декодировки. в то время как sd-boot вроде бы как таких проблем не имеет (не проверял лично).


  1. zaraysky
    11.02.2025 21:25

    Под спойлером со всеми параметрами пусто?


  1. Sly_tom_cat
    11.02.2025 21:25

    GRUB — это первый, кого видит твоя система после BIOS/UEFI. 

    Нет. По крайней мере не везде.

    Например в ubuntu - EFI -> SHIM -> GRUB.
    И такой или подобный комбайн есть в других дистрибутивах.