GRUB и параметры ядра в Linux

Сегодня у нас на повестке тема 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 в своих проектах?