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 загружает систему
- Прошивка передаёт управление GRUB.
- GRUB читает
/boot/grub/grub.cfgи показывает меню (или сразу грузит пункт по умолчанию). - Для выбранного пункта он подгружает модули (
insmod) для нужной файловой системы. - Загружает ядро (
/boot/vmlinuz-…) и initramfs (/boot/initrd.img-…) в память. - Передаёт ядру командную строку с параметрами и запускает его.
С этого момента 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.
- Загрузитесь с live-USB.
- Найдите корневой раздел и войдите в него:
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 - Установите загрузчик заново:
# UEFI grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=linux # BIOS grub-install /dev/sda - Пересоберите конфиг:
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из системы.
Комментарии
Пока комментариев нет.