open atlas
↑ К треку
Linux: операционная система LIN · 02 · 02

GRUB — загрузчик

GRUB — загрузчик Debian/Ubuntu. Его конфиг генерируется из /etc/default/grub командой update-grub. При загрузке можно отредактировать командную строку ядра — добавить init=/bin/bash или убрать "quiet" — это самый мощный инструмент восстановления в Linux.

LIN Middle ◷ 22 min
Уровень
ОсновыJuniorMiddleSenior

Системный администратор заблокировал себе доступ, задав неверный пароль root в provisioning-скрипте. Машина загружалась нормально, но войти никто не мог. План восстановления: перезагрузка, нажать e в меню GRUB, добавить init=/bin/bash в строку ядра, загрузиться в однопроцессную оболочку от root, сменить пароль, перезагрузиться. Пять минут, никакой переустановки. Вот GRUB как инструмент восстановления.

Каждый Linux-инженер рано или поздно редактирует командную строку ядра при загрузке. Понимание того, что делает GRUB — и где лежит его конфиг — это разница между пятиминутным исправлением и трёхчасовой переустановкой.

Цель

После этого урока ты сможешь описать роль GRUB и его файлы конфигурации, читать и редактировать /etc/default/grub, перегенерировать grub.cfg с помощью update-grub, редактировать командную строку ядра при загрузке для восстановления, и понимать разницу между runtime-конфигом GRUB и исходными файлами.

1

У 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.

2

Ключевые опции в /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 показывает графический экран загрузки. Удали оба, чтобы видеть каждую строку лога ядра — крайне полезно при отладке молчаливого зависания загрузки.

3

Командная строка ядра — самый мощный рычаг восстановления. Когда 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 /.

4

Как редактировать командную строку ядра при загрузке (без сохранения). Это самый ценный навык в уроке — требует физического или консольного доступа, но никакой предварительной настройки.

  1. Перезагрузи машину.
  2. В меню GRUB нажми e для редактирования выбранной записи.
  3. Найди строку, начинающуюся с linux — это командная строка ядра.
  4. Перейди в конец этой строки (клавиша End) и добавь свой параметр, например systemd.unit=rescue.target.
  5. Нажми Ctrl+X или F10 для загрузки с изменённой строкой.

Правка не сохраняется — применяется только к этой одной загрузке. Следующая загрузка использует нормальный конфиг. Это именно то, что нужно для восстановления: сделал изменение, загрузился, исправил систему, перезагрузился нормально.

5

Где 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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 3 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources1
expand
  1. 01

Trademarks belong to their respective owners. Editorial reference only.