GRUB 2

GRUB 2 (GRand Unified Bootloader) — загрузчик: программа, которая запускается прошивкой и загружает ядро Linux вместе с initramfs. Она показывает меню выбора системы, читает свой конфигурационный файл и умеет работать с файловыми системами — поэтому ядро можно взять откуда угодно, а не только из начала диска.

GRUB 2 — это то, что стоит между прошивкой (UEFI или BIOS) и ядром. Прошивка передаёт управление ему, а он — ядру.

Зачем нужен загрузчик

  • Найти и загрузить ядро. Прошивка лишь запускает файл загрузчика; что именно грузить и с какими параметрами — решает GRUB.
  • Читать файловые системы. GRUB понимает ext4, XFS, Btrfs, FAT, LVM, RAID и даже LUKS — поэтому ядро может лежать на шифрованном разделе.
  • Дать меню выбора. Несколько ядер, несколько систем (Linux + Windows), режим восстановления.
  • Передать ядру параметры. root=, quiet, splash, nomodeset — всё это GRUB подставляет в командную строку ядра.
  • Служить точкой восстановления. Через командную строку GRUB можно загрузить систему вручную, даже если конфиг сломан.

Где живёт GRUB

Что Где
Генерируемый конфиг /boot/grub/grub.cfg — не редактировать руками
Настройки /etc/default/grub
Скрипты-генераторы /etc/grub.d/
Модули и файлы GRUB /boot/grub/
Загрузчик в UEFI /boot/efi/EFI/<дистрибутив>/grubx64.efi
Загрузчик в BIOS первые секторы диска (MBR) + /boot/grub/

В UEFI GRUB — обычное приложение прошивки (файл на ESP), которое запускает BDS. В BIOS — код в MBR и в зазоре между MBR и первым разделом.

Как GRUB загружает систему

  1. Прошивка передаёт управление GRUB.
  2. GRUB читает /boot/grub/grub.cfg и показывает меню (или сразу грузит пункт по умолчанию).
  3. Для выбранного пункта он подгружает модули (insmod) для нужной файловой системы.
  4. Загружает ядро (/boot/vmlinuz-…) и initramfs (/boot/initrd.img-…) в память.
  5. Передаёт ядру командную строку с параметрами и запускает его.

С этого момента GRUB свою работу закончил: дальше работает ядро.

Командная строка GRUB: загрузить систему вручную

Это главный практический навык: он спасает, когда меню сломано, конфиг потерян или система не стартует.

1. Попасть в меню GRUB

  • при включении держите Shift (BIOS) или часто нажимайте Esc (UEFI), чтобы меню появилось, если оно скрыто;
  • в меню нажмите c — откроется командная строка GRUB.

Обратно в меню — Esc, загрузить систему — команда boot.

2. Найти диск и раздел

В командной строке GRUB диски называются иначе, чем в Linux:

GRUB Linux
(hd0) /dev/sda
(hd0,gpt2) /dev/sda2 (таблица GPT)
(hd0,msdos1) /dev/sda1 (таблица MBR)

Смотрим, что есть:

grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2)

grub> ls (hd0,gpt2)/
boot/  etc/  home/  usr/  var/

Ищем ядро и initramfs:

grub> ls (hd0,gpt2)/boot/
vmlinuz-6.1.0-13-amd64  initrd.img-6.1.0-13-amd64  grub/

Имена файлов — те, что вы видите. Их и подставляем дальше.

3. Загрузить ядро

grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz-6.1.0-13-amd64 root=/dev/sda2 ro quiet splash
grub> initrd /boot/initrd.img-6.1.0-13-amd64
grub> boot

Разберём по строкам:

  • set root=(hd0,gpt2) — раздел, с которого GRUB читает файлы (то есть где лежит /boot);
  • linux … — путь к ядру относительно этого раздела, затем параметры ядра;
  • root=/dev/sda2 — корневая файловая система для ядра. Здесь имена уже линуксовые: root= — это не то же самое, что set root у GRUB. Надёжнее указывать root=UUID=…, чтобы имя диска не сбилось;
  • ro — смонтировать корень только для чтения (ядро потом перемонтирует), quiet splash — тихая загрузка с заставкой (см. Splash);
  • initrd … — путь к initramfs;
  • boot — запустить.

Если не знаете UUID, посмотрите его из работающей системы (sudo blkid) или из другого терминала. В крайнем случае указывайте root=/dev/sda2 — для простых случаев сработает.

4. Найти раздел по UUID прямо в GRUB

Чтобы не угадывать имена дисков:

grub> search --fs-uuid --set=root 1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
grub> linux /boot/vmlinuz-6.1.0-13-amd64 root=UUID=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d ro quiet splash
grub> initrd /boot/initrd.img-6.1.0-13-amd64
grub> boot

search сам найдёт раздел по UUID и сделает его текущим — то же самое, но без ручного set root.

5. Если система загрузилась — закрепить результат

Ручная загрузка действует только до перезагрузки. Чтобы исправить навсегда, уже из системы:

# Debian, Ubuntu и производные
sudo update-grub

# любой дистрибутив
sudo grub-mkconfig -o /boot/grub/grub.cfg

Полезные команды в командной строке GRUB

Команда Что делает
ls список дисков и разделов
ls (hd0,gpt2)/boot/ содержимое каталога
set показать текущие переменные
set root=(hd0,gpt2) выбрать раздел для чтения файлов
search --fs-uuid --set=root <uuid> найти раздел по UUID
cat (hd0,gpt2)/etc/os-release прочитать файл (проверить, тот ли раздел)
linux / initrd / boot загрузить ядро, initramfs и запустить
insmod <модуль> подгрузить модуль (например, ext2, lvm)
normal вернуться в обычный режим меню
help справка

Настройки и генерация конфига

Правят не grub.cfg, а /etc/default/grub — из него конфиг генерируется:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE=menu
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_DISABLE_OS_PROBER=false
  • GRUB_TIMEOUT — сколько секунд ждать выбора;
  • GRUB_CMDLINE_LINUX_DEFAULT — параметры ядра по умолчанию (здесь же включается заставка splash);
  • GRUB_DISABLE_OS_PROBER=false — искать другие системы (Windows) и добавлять их в меню.

После правки — sudo update-grub.

Если GRUB пропал

Признаки: «no such device», «unknown filesystem», grub rescue> вместо меню, либо система грузится сразу в Windows.

  1. Загрузитесь с live-USB.
  2. Найдите корневой раздел и войдите в него:
    sudo mount /dev/sda2 /mnt
    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
    sudo chroot /mnt
    
  3. Установите загрузчик заново:
    # UEFI
    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=linux
    
    # BIOS
    grub-install /dev/sda
    
  4. Пересоберите конфиг: grub-mkconfig -o /boot/grub/grub.cfg.

Что запомнить

  • GRUB 2 — загрузчик между прошивкой и ядром; он читает файловые системы и умеет грузить ядро откуда угодно.
  • grub.cfg генерируется из /etc/default/grub — руками его не правят.
  • Командная строка GRUB (c в меню) позволяет загрузить систему вручную: set root → linux → initrd → boot.
  • root= у ядра и set root у GRUB — разные вещи: первое называет корень для ядра, второе — раздел, с которого читает файлы сам GRUB.
  • Ручная загрузка временная: чтобы закрепить, нужно update-grub из системы.

Смотрите также

  • Загрузка — весь процесс по шагам
  • UEFI · BIOS — кто запускает GRUB
  • BDS — как прошивка выбирает загрузчик
  • Initramfs — initramfs, который GRUB загружает вместе с ядром
  • Ядро — что происходит после передачи управления
  • Splash — заставка при загрузке
Оценка статьи 0

Комментарии

Пока комментариев нет.