Как происходит процесс загрузки Linux
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Процесс загрузки Linux: от питания до пользовательского пространства
Процесс загрузки Linux — это многоэтапная последовательность, которая превращает "мёртвое железо" в полностью функционирующую операционную систему. Его можно разделить на несколько ключевых фаз, каждая из которых выполняется определённым компонентом.
Этап 1: Аппаратная инициализация (POST)
После нажатия кнопки питания прошивка материнской платы (обычно BIOS или UEFI) берет на себя управление:
- Выполняется Power-On Self-Test (POST) — проверка работоспособности процессора, памяти, дисков и других устройств.
- BIOS (устаревший) ищет загрузочное устройство по жестко заданному порядку (например, HDD → USB → сеть). Он считывает первый сектор диска (MBR, Master Boot Record, 512 байт), где находятся первичный загрузчик (446 байт) и таблица разделов.
- UEFI (современный стандарт) использует EFI System Partition (ESP) — специальный FAT32-раздел, где хранятся файлы загрузчиков (например,
grubx64.efi). Он более быстрый и функциональный.
Этап 2: Загрузчик (Bootloader)
Его задача — найти и загрузить ядро Linux (vmlinuz) и initramfs в память, передав им управление. Самый распространенный загрузчик — GRUB2.
# Пример расположения файлов GRUB2 в UEFI-системе
/boot/efi/EFI/ubuntu/grubx64.efi # Исполняемый файл загрузчика UEFI
/boot/grub/grub.cfg # Основной конфигурационный файл (генерируется автоматически)
Этапы работы загрузчика:
- GRUB Stage 1 (в MBR) загружает Stage 1.5, который понимает файловые системы.
- GRUB Stage 2 загружает свое ядро, парсит
grub.cfg, отображает меню выбора ОС/ядра. - После выбора загрузчик:
* Загружает **ядро** (`vmlinuz-xxx`) и **initramfs** (initial RAM filesystem) в оперативную память.
* Передает ядру параметры командной строки (`root=`, `ro`, `quiet splash` и др.).
* Передает управление точке входа ядра.
Этап 3: Инициализация ядра (Kernel Initialization)
Ядро распаковывается в памяти и начинает работу:
- Декомпрессия и настройка — инициализация подсистем: управления памятью, планировщика задач, прерываний.
- Монтирование initramfs — временная корневая файловая система в памяти. Она содержит минимальный набор инструментов и модулей ядра (
*.ko), необходимых для монтирования реального корневого раздела (например, драйверы для LVM или шифрования).
# Просмотр содержимого initramfs (пример)
lsinitramfs /boot/initrd.img-$(uname -r) | head -20
- Запуск init-процесса из initramfs — обычно это скрипт
/init, который определяет настоящее корневое устройство (/dev/sda2,UUID=...), загружает нужные модули и переключает корень (pivot_rootилиswitch_root) на реальную файловую систему.
Этап 4: Запуск пространства пользователя (Userspace)
Управление передается init-процессу в настоящем корневом разделе. Исторически это был /sbin/init (SysVinit), но сегодня доминируют:
- systemd (наиболее распространен): Первым запускается процесс
systemd(PID 1). Он параллельно запускает целевые юниты (targets), соответствующие уровню загрузки.
# Пример просмотра целей systemd и времени загрузки
systemctl list-units --type=target
systemd-analyze time
- Другие варианты: Upstart (устарел), OpenRC (в Gentoo, Alpine).
Процесс инициализации пространства пользователя:
- Монтирование файловых систем —
/proc,/sys,/dev,/run(tmpfs), а также/,/homeи другие, согласноfstab. - Запуск системных служб — сетевой менеджер, демон журналирования (
rsyslogd/ journald), cron, SSH и т.д. - Запуск уровня multi-user или graphical.target — подготовка текстовых консолей (
getty) или дисплейного менеджера (GDM, LightDM) для входа пользователя.
Этап 5: Завершение загрузки
- При достижении graphical.target запускается дисплейный менеджер, который предоставляет экран входа.
- После успешной аутентификации запускается сессия пользователя (оконный менеджер, DE — GNOME, KDE).
- systemd может создать user slice для управления ресурсами сессии.
Ключевые особенности современной загрузки:
- Параллелизм — systemd запускает многие службы одновременно, сокращая время загрузки.
- Ранний userspace (initramfs) — критичен для сложных конфигураций хранения.
- Событийная модель (systemd) против пошаговой (SysVinit runlevels).
- UEFI + Secure Boot — добавляют проверку цифровой подписи загрузчика и ядра для защиты от руткитов.
Понимание этого процесса критично для DevOps-инженера: оно позволяет эффективно диагностировать сбои загрузки (например, используя загрузочную флешку и chroot), настраивать параметры ядра через grub.cfg, работать с dracut или mkinitcpio для регенерации initramfs, а также глубоко понимать, как взаимодействуют компоненты системы.