Привет, Хабр!
Сегодня у нас на повестке тема 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:
GRUB_DEFAULT=0
Номер или имя меню по умолчанию.0первая запись,savedпоследняя загруженная.GRUB_SAVEDEFAULT=true
Сохранять последнюю выбранную запись как новую по дефолту.GRUB_TIMEOUT=5
Время показа меню в секундах.-1т.е ждать бесконечно.GRUB_TIMEOUT_STYLE=menu
Стиль меню:menuпоказать меню,countdownтаймер,hiddenскрыть.GRUB_DISTRIBUTOR=
Идентификатор дистрибутива (например,lsb_release -i -sдля Ubuntu).GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Параметры ядра для стандартной загрузки.GRUB_CMDLINE_LINUX=""
Параметры ядра для всех вариантов загрузки (включая recovery).GRUB_DISABLE_OS_PROBER=false
Разрешить поиск других ОС на диске (автоматическое добавление Windows/Linux).GRUB_BACKGROUND=
Путь к фоновому изображению (например,/boot/grub/background.png).GRUB_GFXMODE=1920x1080
Разрешение экрана меню загрузчика.GRUB_DISABLE_RECOVERY=false
Показывать пункты recovery-режима.GRUB_HIDDEN_TIMEOUT=0
Время до показа меню, если установлена одна ОС (устаревший параметр).GRUB_HIDDEN_TIMEOUT_QUIET=true
Скрывать таймер в скрытом режиме.GRUB_THEME=
Путь к теме оформления (например,/boot/grub/themes/ubuntu/theme.txt).
Если уже загрузились и хотите узнать, какие параметры применились:
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:
