← Linux: загрузка
12 мин · просто · Урок 2 из 7

Firmware и диск: BIOS/UEFI, MBR/GPT

POST, BIOS против UEFI, разметка диска MBR и GPT.

С чего начинается включение

Как только на плату подаётся питание, управление берёт firmware: код, зашитый в чип на материнской плате. Первым делом он гоняет POST (power-on self-test), самопроверку железа: память, процессор, базовые контроллеры. Если что-то критично сломано, дальше загрузка не идёт, и вы слышите серию сигналов или видите код ошибки.

После успешного POST firmware ищет, откуда грузиться, и передаёт управление загрузчику. Дальше цепочка простая:

firmware -> загрузчик -> ядро (kernel) -> initramfs

initramfs — это временный корень файловой системы, который распаковывается в память (в rootfs на tmpfs, если в ядре включён CONFIG_TMPFS). Он несёт драйверы, нужные, чтобы смонтировать настоящий корень с диска.

BIOS против UEFI

Firmware бывает двух поколений. Старый режим — BIOS (basic input/output system). Он не понимает файловых систем: просто читает загрузочный код из первого сектора диска и запускает его.

# BIOS не знает про файлы, он читает сырой сектор
dd if=/dev/sda bs=512 count=1 | xxd | head

Новый режим — UEFI (unified extensible firmware interface). Он умеет читать файловую систему на отдельном разделе, который называется EFI System Partition (ESP, обычно FAT32). Там лежат загрузчики как обычные файлы .efi.

# на UEFI-системе ESP смонтирован сюда
ls /boot/efi/EFI/
# BOOT  systemd  ubuntu

У UEFI есть приятный бонус. Ядро Linux можно собрать с так называемым EFI stub, встроенным кодом, который firmware запускает напрямую. Тогда отдельный загрузчик не нужен, UEFI грузит ядро само.

# efibootmgr показывает записи загрузки прямо в firmware
efibootmgr -v
# Boot0001* Linux  HD(1,GPT,...)/File(\EFI\Linux\vmlinuz.efi)

Ловушка: «UEFI это просто BIOS с новым именем». Нет. UEFI понимает разделы и файлы, ведёт собственный список загрузочных записей и может грузить ядро без промежуточного загрузчика.

MBR: старая разметка

Способ разметки диска связан с режимом firmware. Классический — MBR (master boot record). Это самый первый сектор диска размером 512 байт.

Внутри него первые 446 байт занимает код первичного загрузчика, дальше идёт таблица разделов и сигнатура:

# 446 байт кода + 64 байта таблицы + 2 байта подписи = 512
446 + 64 + 2 = 512

У MBR есть жёсткие ограничения. Он адресует диски до 2 ТБ и хранит не больше четырёх первичных разделов.

fdisk -l /dev/sda
# Disklabel type: dos     <- это MBR

GPT: современная разметка

GPT (GUID partition table) снимает ограничения MBR. Разделов можно делать много (обычно до 128 из коробки), диски поддерживаются заметно крупнее 2 ТБ.

Ещё GPT хранит резервную копию таблицы разделов в конце диска. Если основная таблица в начале побьётся, есть шанс восстановиться из копии.

gdisk -l /dev/sda
# Partition table scan:
#   MBR: protective
#   GPT: present         <- разметка GPT, копия таблицы в конце диска

На практике под UEFI размечают диск в GPT: там заводят EFI System Partition, с которой firmware читает загрузчик или ядро. Жёсткой связки тут нет, спецификация UEFI допускает ESP и на MBR-диске, и такие системы встречаются. Но выигрыша это не даёт, поэтому связку «UEFI плюс GPT» и считают нормальной.

Ловушка: «GPT только для больших дисков». Объём тут лишь один из поводов. GPT берут ради числа разделов и ради резервной копии таблицы, даже на диске меньше 2 ТБ.

Разница коротко:

СвойствоMBRGPT
Размер служебной области512 байт (сектор 0)таблица + копия в конце
Предел диска~2 ТБсильно больше
Первичных разделов4обычно до 128
С чем грузитсяBIOSUEFI (нужен ESP)

Что дальше делает система

Когда ядро распаковало initramfs и смонтировало настоящий корень, управление получает первый процесс. На большинстве дистрибутивов это systemd — демон, который управляет остальными демонами по декларативным unit-файлам. Загрузка при этом сильно параллельна: systemd поднимает независимые сервисы одновременно.

systemctl get-default
# graphical.target

Цель загрузки описывается через targets, которые зависят друг от друга:

graphical.target -> multi-user.target -> basic.target -> sysinit.target

Стрелки показывают зависимость, а не строгий порядок шаг-за-шагом. systemd уважает эти зависимости, но всё, что можно, запускает параллельно.

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

POST — самопроверка железа при включении, до всякого загрузчика.

BIOS читает сырой код из MBR, UEFI понимает файлы на EFI System Partition и умеет грузить ядро напрямую через EFI stub.

MBR — сектор 512 байт (446 байт под код), до 2 ТБ и 4 первичных раздела.

GPT снимает эти лимиты и держит копию таблицы в конце диска. Под UEFI на практике берут GPT, хотя формально ESP можно завести и на MBR-диске.

В следующем уроке — как загрузчик передаёт ядру параметры и что попадает в командную строку ядра.

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