// 03 из 08
GRUB2
3.1 Проблема "курицы и яйца"
ПРОБЛЕМА: ┌──────────────────────────────────────────┐ │ Чтобы загрузить ОС — нужен загрузчик │ │ Загрузчик хранится на диске │ │ Чтобы читать диск — нужны драйверы │ │ Драйверы — часть ОС │ │ Круг замкнулся! │ └──────────────────────────────────────────┘ РЕШЕНИЕ GRUB2: Разбить загрузку на маленькие этапы, каждый из которых загружает следующий
3.2 Три стадии GRUB2
STAGE 1: boot.img (446 байт в секторе MBR)
┌─────────────────────────────────────────┐
│ • Самый маленький код │
│ • Умеет только одно: найти core.img │
│ • Знает адрес на диске где лежит core │
│ • Загружает core.img в память │
└─────────────────────┬───────────────────┘
│
▼
STAGE 1.5: core.img (~32 КБ)
┌─────────────────────────────────────────┐
│ • Содержит драйверы файловых систем: │
│ ext4, xfs, btrfs, fat32... │
│ • Умеет читать файлы с диска │
│ • Загружает файлы Stage 2 из /boot/grub/│
└─────────────────────┬───────────────────┘
│
▼
STAGE 2: /boot/grub/ (полный GRUB)
┌─────────────────────────────────────────┐
│ • Читает /boot/grub/grub.cfg │
│ • Отображает меню выбора ОС │
│ • Загружает vmlinuz + initramfs в RAM │
│ • Передаёт ядру параметры │
│ • Передаёт управление ядру │
└─────────────────────────────────────────┘
3.3 Меню GRUB
┌────────────────────────────────────────────┐ │ GNU GRUB version 2.06 │ │ │ │ ┌────────────────────────────────────────┐ │ │ │*Ubuntu, with Linux 5.15.0-generic │ │ │ │ Ubuntu, with Linux 5.15.0 (recovery) │ │ │ │ Ubuntu, with Linux 5.10.0-generic │ │ │ │ Windows Boot Manager │ │ │ └────────────────────────────────────────┘ │ │ │ │ Use ↑↓ arrows. Enter - boot, e - edit │ └────────────────────────────────────────────┘
3.4 Конфигурация GRUB
Файл /etc/default/grub:
GRUB_DEFAULT=0 # загружать первый пункт GRUB_TIMEOUT=5 # ждать 5 секунд GRUB_TIMEOUT_STYLE=menu # показывать меню GRUB_CMDLINE_LINUX="" # параметры для ядра GRUB_GFXMODE=1920x1080 # разрешение экрана
После изменений: sudo update-grub
3.5 Параметры ядра (kernel parameters)
root=/dev/sda1 ← где корневой раздел quiet ← не показывать сообщения splash ← показывать заставку ro ← монтировать root только для чтения init=/bin/bash ← запустить bash вместо init (восстановление)
3.6 Файл grub.cfg
# Пример записи в grub.cfg
menuentry 'Ubuntu 22.04' {
linux /boot/vmlinuz-5.15 root=/dev/sda1 quiet splash
initrd /boot/initramfs-5.15.img
}