← Linux: загрузка
10 мин · intro · Урок 1 из 7

Как загружается Linux: обзор

Обзор всей цепочки загрузки: от firmware до PID 1.

Зачем знать цепочку загрузки

Сервер не грузится, а на консоли чёрный экран или строчка про grub rescue. Чтобы починить, нужно понимать, на каком шаге всё встало. Загрузка Linux — это цепочка передач управления: каждый этап поднимает следующий и уходит. Проблема всегда живёт на конкретном звене, и звеньев всего несколько.

Ещё это карта того, где что настраивается. Порядок дисков правится в firmware, меню выбора ядра живёт в загрузчике, драйверы для корневого диска собираются в initramfs, а автозапуск служб описан у init. Ошибёшься этажом, будешь править не тот конфиг.

firmware BIOS или UEFI GRUB грузит ядро ядро память, драйверы initramfs корень в памяти systemd PID 1 порядок дисков меню и параметры модули ядра драйверы корня unit-файлы
Каждое звено поднимает следующее и уходит. Внизу — что настраивается на этом этаже.

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.

В следующих уроках трека разберём каждое звено отдельно и по шагам.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

Опиши процесс загрузки Linux от нажатия кнопки питания до приглашения логина.

LIN-021
02

BIOS vs UEFI — в чём разница?

LIN-023
03

Что такое systemd vs init? В чём преимущество systemd?

LIN-020

Прошли материал до конца? Отметьте урок пройденным.