GRUB — загрузчик
GRUB — загрузчик Debian/Ubuntu. Его конфиг генерируется из /etc/default/grub командой update-grub. При загрузке можно отредактировать командную строку ядра — добавить init=/bin/bash или убрать "quiet" — это самый мощный инструмент восстановления в Linux.
Системный администратор заблокировал себе доступ, задав неверный пароль root в provisioning-скрипте. Машина загружалась нормально, но войти никто не мог. План восстановления: перезагрузка, нажать e в меню GRUB, добавить init=/bin/bash в строку ядра, загрузиться в однопроцессную оболочку от root, сменить пароль, перезагрузиться. Пять минут, никакой переустановки. Вот GRUB как инструмент восстановления.
Каждый Linux-инженер рано или поздно редактирует командную строку ядра при загрузке. Понимание того, что делает GRUB — и где лежит его конфиг — это разница между пятиминутным исправлением и трёхчасовой переустановкой.
После этого урока ты сможешь описать роль GRUB и его файлы конфигурации, читать и редактировать /etc/default/grub, перегенерировать grub.cfg с помощью update-grub, редактировать командную строку ядра при загрузке для восстановления, и понимать разницу между runtime-конфигом GRUB и исходными файлами.
У GRUB два слоя конфигурации: исходники и сгенерированный файл. Файл, который GRUB реально читает при загрузке — это /boot/grub/grub.cfg — сгенерированный файл. Его никогда не следует редактировать напрямую: он перезаписывается командой update-grub. Источником истины является /etc/default/grub (пользовательские опции) и скрипты-хуки в /etc/grub.d/ (которые генерируют записи меню). Рабочий процесс:
# Редактируем источник
sudoedit /etc/default/grub
# Перегенерируем /boot/grub/grub.cfg из источников
sudo update-grubЕсли твои изменения не переживают обновление ядра — ты редактировал grub.cfg напрямую вместо исходников. Всегда редактируй /etc/default/grub.
Ключевые опции в /etc/default/grub. Файл — это key=value-хранилище, которое источается как shell-скрипт. Самые важные переменные:
# Сколько секунд GRUB ждёт перед автозагрузкой записи по умолчанию
GRUB_TIMEOUT=5
# Запись меню по умолчанию (0 = первая, или строка с заголовком)
GRUB_DEFAULT=0
# Дополнительные параметры, добавляемые к каждой командной строке ядра
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# Параметры для всех ядер, включая записи восстановления
GRUB_CMDLINE_LINUX=""quiet подавляет большинство сообщений ядра в консоли. splash показывает графический экран загрузки. Удали оба, чтобы видеть каждую строку лога ядра — крайне полезно при отладке молчаливого зависания загрузки.
Командная строка ядра — самый мощный рычаг восстановления. Когда GRUB запускает ядро, он передаёт строку параметров, разделённых пробелами. Ядро парсит их рано, до монтирования каких-либо файловых систем. Ключевые параметры, которые ты будешь использовать на практике:
root=/dev/sda2 # какое устройство является корневой файловой системой
ro # монтировать корень только для чтения изначально (нормально)
quiet # подавлять сообщения ядра
init=/bin/bash # заменить PID 1 на оболочку (аварийное восстановление)
single # загрузка в однопользовательский режим (уровень выполнения 1)
systemd.unit=rescue.target # загрузка в rescue target (эквивалент для systemd)Трюк с init=/bin/bash даёт тебе root-оболочку до того, как systemd вообще запустится. Файловая система сначала монтируется только для чтения; перед внесением изменений перемонтируй её на чтение-запись: mount -o remount,rw /.
Как редактировать командную строку ядра при загрузке (без сохранения). Это самый ценный навык в уроке — требует физического или консольного доступа, но никакой предварительной настройки.
- Перезагрузи машину.
- В меню GRUB нажми
eдля редактирования выбранной записи. - Найди строку, начинающуюся с
linux— это командная строка ядра. - Перейди в конец этой строки (клавиша End) и добавь свой параметр, например
systemd.unit=rescue.target. - Нажми
Ctrl+XилиF10для загрузки с изменённой строкой.
Правка не сохраняется — применяется только к этой одной загрузке. Следующая загрузка использует нормальный конфиг. Это именно то, что нужно для восстановления: сделал изменение, загрузился, исправил систему, перезагрузился нормально.
Где GRUB живёт на диске и как устанавливается. GRUB состоит из двух частей: маленький загрузчик первой стадии, записанный в MBR или EFI-раздел, и модули/конфиг в /boot/grub/. На UEFI-системах EFI-исполняемый файл находится в /boot/efi/EFI/ubuntu/grubx64.efi. При замене диска GRUB нужно переустанавливать в загрузочный сектор нового диска:
# Установить GRUB на конкретный диск (BIOS/MBR системы)
sudo grub-install /dev/sda
# Установить GRUB для UEFI систем
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi
# Затем перегенерировать конфиг
sudo update-grubЧастая ошибка после клонирования диска через dd: забыть переустановить GRUB на новый диск. Данные там есть, но на новом диске нет загрузчика в MBR/EFI-разделе.
Восстановление доступа root через командную строку GRUB.
Сценарий: ты или автоматизация задали неизвестный пароль root. SSH недоступен. Есть консольный доступ.
1. Перезагружаем машину.
2. В меню GRUB: нажимаем 'e' для редактирования записи по умолчанию.
3. Находим строку 'linux'. Она выглядит примерно так:
linux /boot/vmlinuz-6.x root=/dev/sda2 ro quiet splash
4. Добавляем в конец этой строки:
init=/bin/bash
Результат:
linux /boot/vmlinuz-6.x root=/dev/sda2 ro quiet splash init=/bin/bash
5. Нажимаем Ctrl+X для загрузки.
6. Попадаем в bash-оболочку от root, файловая система только для чтения.
7. Перемонтируем корень на чтение-запись:
mount -o remount,rw /
8. Меняем пароль:
passwd root
9. Сбрасываем буферы и перезагружаемся:
sync
exec /sbin/initПочему это работает: init=/bin/bash говорит ядру использовать /bin/bash как PID 1 вместо systemd. systemd так и не запускается. Нет входа в систему, нет PAM, нет аутентификации — ты сразу root.
▸Почему это работает
На RHEL/Fedora/CentOS GRUB 2 — тот же загрузчик, но расположение конфига немного отличается: источник по-прежнему /etc/default/grub, но команда перегенерации — grub2-mkconfig -o /boot/grub2/grub.cfg (не update-grub). Сочетание клавиш при загрузке (e для правки, Ctrl+X для загрузки) идентично. Когда ты читаешь руководство по восстановлению RHEL с командой grub2-mkconfig — для Debian/Ubuntu используй update-grub.
▸Частая ошибка
Прямое редактирование /boot/grub/grub.cfg — самая частая ошибка с GRUB. Это работает — до следующей установки нового ядра через apt upgrade, которая автоматически запускает update-grub и без предупреждения перезаписывает твои изменения. Всегда считай grub.cfg артефактом сборки. Твои постоянные изменения принадлежат /etc/default/grub или файлу в /etc/grub.d/.
Ты отредактировал /boot/grub/grub.cfg, добавив параметр ядра. Две недели спустя после обновления ядра параметр исчез. Что пошло не так?
GRUB 2 — загрузчик на Debian/Ubuntu. Его runtime-конфиг /boot/grub/grub.cfg генерируется — никогда не редактируй его напрямую. Редактируй /etc/default/grub и запускай update-grub. Командная строка ядра (строка linux в записи GRUB) — основной рычаг восстановления: нажми e в меню, добавь init=/bin/bash или systemd.unit=rescue.target, затем Ctrl+X для однократной загрузки. Удаление quiet раскрывает все сообщения ядра. При замене диска сначала запусти grub-install, потом update-grub. На RHEL/Fedora эквивалент — grub2-mkconfig.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.