Как загружается Linux: обзор
Обзор всей цепочки загрузки: от firmware до PID 1.
Зачем знать цепочку загрузки
Сервер не грузится, а на консоли чёрный экран или строчка про grub rescue. Чтобы починить, нужно понимать, на каком шаге всё встало. Загрузка Linux — это цепочка передач управления: каждый этап поднимает следующий и уходит. Проблема всегда живёт на конкретном звене, и звеньев всего несколько.
Ещё это карта того, где что настраивается. Порядок дисков правится в firmware, меню выбора ядра живёт в загрузчике, драйверы для корневого диска собираются в initramfs, а автозапуск служб описан у init. Ошибёшься этажом, будешь править не тот конфиг.
Firmware: проверка железа и поиск загрузчика
Firmware — это программа в микросхеме материнской платы, которая стартует первой при включении питания. Двух видов: старый BIOS и современный UEFI. Firmware проверяет память и устройства, потом ищет, кому передать управление.
BIOS читает первые 512 байт диска: это MBR (master boot record). Первые 446 байт там отведены под код первичного загрузчика, остальное занимает таблица разделов. UEFI устроен иначе: он читает файл загрузчика из отдельного EFI-раздела.
# посмотреть, в каком режиме грузилась система
$ ls /sys/firmware/efi
efivars ... # каталог есть -> загрузка через UEFI; нет -> BIOS
Загрузчик: GRUB грузит ядро в память
Загрузчик — это программа, которая находит на диске файл ядра, распаковывает его в память и передаёт ему управление. На большинстве систем это GRUB (GRand Unified Bootloader). Он же показывает меню, если ядер несколько.
GRUB читает свой конфиг и знает, где лежит kernel и какие параметры ему передать. Список ядер виден в конфигурации загрузчика.
$ ls /boot
vmlinuz-6.1.0-18-amd64 # само ядро
initrd.img-6.1.0-18-amd64 # образ initramfs (о нём ниже)
grub/ # конфиг GRUB
На UEFI загрузчик иногда не нужен вовсе: ядро собирают с EFI stub, и firmware запускает vmlinuz напрямую как EFI-приложение.
Ядро и initramfs
Ядро (kernel) — это ядро операционной системы: оно управляет памятью, процессами и доступом к железу. Поднявшись, ядро инициализирует процессор, память и базовые драйверы. Но корневой диск оно смонтировать пока не может: драйвер нужного контроллера или модуль LVM/RAID ещё не загружены.
Здесь работает initramfs (initial RAM filesystem), временный корень в оперативной памяти. Ядро распаковывает его в rootfs на tmpfs (при собранной опции CONFIG_TMPFS), запускает оттуда скрипты, подгружает недостающие модули и монтирует настоящий корень с диска.
# заглянуть внутрь образа initramfs
$ lsinitramfs /boot/initrd.img-6.1.0-18-amd64 | head
init
bin/sh
scripts/local
lib/modules/6.1.0-18-amd64/kernel/drivers/...
PID 1: init и systemd
Смонтировав настоящий корень, ядро запускает первый пользовательский процесс. Это init, у него всегда PID 1, и от него деревом расходятся все остальные процессы. На большинстве дистрибутивов роль init играет systemd.
systemd — это демон, управляющий другими демонами. Что запускать и в каком порядке, он берёт из декларативных unit-файлов, а не из последовательного скрипта. Благодаря этому запуск сильно параллелен: независимые службы стартуют одновременно.
Нужное состояние системы описывают targets. Графический вход зависит от многопользовательского режима, тот зависит от базового, а базовый от начальной инициализации: graphical -> multi-user -> basic -> sysinit. Зависимости соблюдаются, но строгой очереди «сначала весь один, потом весь другой» нет.
$ systemctl get-default
graphical.target # целевое состояние по умолчанию
$ systemd-analyze # сколько заняла загрузка
Startup finished in 3.512s (kernel) + 8.740s (userspace) = 12.25s
Миф: «BIOS сам запускает операционную систему»
Firmware не знает, что такое Linux или Windows, и не запускает их. Его задача скромнее: проверить железо и передать управление коду загрузчика из MBR или из EFI-раздела. Всё, что дальше, делают загрузчик, ядро и init.
Поэтому и точки поломки разные. Если firmware не нашёл загрузчик, виноват порядок загрузки или пустой MBR. Если GRUB стартовал, но ядро не поднялось, смотри параметры ядра и initramfs.
Что важно запомнить
Цепочка одна: firmware -> загрузчик -> ядро -> initramfs -> init (PID 1).
Firmware (BIOS или UEFI) только проверяет железо и передаёт управление загрузчику, саму ОС он не запускает.
GRUB грузит ядро в память; на UEFI ядро с EFI stub может стартовать без загрузчика.
initramfs — временный корень в RAM, чтобы подгрузить драйверы и смонтировать настоящий корневой диск.
PID 1 — это init, обычно systemd; он поднимает службы из unit-файлов параллельно, ориентируясь на targets.
В следующих уроках трека разберём каждое звено отдельно и по шагам.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Опиши процесс загрузки Linux от нажатия кнопки питания до приглашения логина.
LIN-021BIOS vs UEFI — в чём разница?
LIN-023Что такое systemd vs init? В чём преимущество systemd?
LIN-020Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс