Привет, Хабр!
Сегодня у нас на повестке тема 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
:
-
В
/etc/default/grub
добавляем:GRUB_CMDLINE_LINUX_DEFAULT="noinitrd"
-
Пересобираем загрузочный образ:
sudo update-initramfs -u
Обновляем GRUB и перезагружаемся.
Безопасность GRUB
Если не хотите, чтобы кто‑то случайно (или специально) изменил параметры ядра:
-
Создаём хеш пароля:
sudo grub-mkpasswd-pbkdf2
-
Открываем файл
/etc/grub.d/40_custom
:sudo nano /etc/grub.d/40_custom
-
Добавляем:
set superusers="admin" password_pbkdf2 admin grub.pbkdf2.sha512.10000.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
Обновляем 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 скучное?
Кладём красивую картинку в
/boot/grub/
(лучше PNG 1024×768).-
Открываем
/etc/default/grub
и добавляем:GRUB_BACKGROUND="/boot/grub/background.png"
-
Обновляем конфиг:
sudo update-grub
Теперь при загрузке будет фон вместо унылого чёрного экрана.
Можно поменять цвета текста в файле /etc/grub.d/05_debian_theme
:
set menu_color_normal=white/black
set menu_color_highlight=yellow/blue
(меняем белый текст на чёрном фоне на жёлтый текст на синем фоне)
Если что-то пошло не так
Сломали GRUB?
Загружаемся с LiveCD или флешки с Linux.
-
Открываем терминал и монтируем системный раздел:
sudo mount /dev/sdXn /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys
-
Заходим в chroot‑окружение:
sudo chroot /mnt
-
Переустанавливаем GRUB:
grub-install /dev/sdX update-grub
Перезагружаемся. Система снова жива.
Если GRUB сломался окончательно, можно загрузить ядро вручную из UEFI:
Загружаемся в UEFI Shell или LiveCD.
-
Выполняем:
linux /boot/vmlinuz-5.15.0-52-generic root=/dev/sda2 ro initrd /boot/initrd.img-5.15.0-52-generic boot
-
Если сработало — переустанавливаем GRUB:
sudo grub-install /dev/sda sudo update-grub
А как вы использовали GRUB в своих проектах?
Пользуясь случаем, рекомендую обратить внимание на открытые уроки по Linux, которые пройдут в феврале в Otus:
Комментарии (4)
Sly_tom_cat
11.02.2025 21:25GRUB — это первый, кого видит твоя система после BIOS/UEFI.
Нет. По крайней мере не везде.
Например в ubuntu - EFI -> SHIM -> GRUB.
И такой или подобный комбайн есть в других дистрибутивах.
gudvinr
Для систем с UEFI уже нет.
Всё это можно сделать через EFI параметры, если собрать UKI, или обойтись systemd-boot, который идёт в нагрузку к остальным компонентам systemd
13werwolf13
я бы добавил ещё что ванильный граб очень медлителен при поднятии ядра и initrd с luks encrypted разделов, он просто не использует аппаратное ускорение AES для декодировки. в то время как sd-boot вроде бы как таких проблем не имеет (не проверял лично).