Введение
Процесс загрузки операционной системы Linux — это сложная, многоэтапная процедура, в которой задействованы как низкоуровневые компоненты аппаратного обеспечения, так и высокоуровневые программные системы. Современный стандарт загрузки большинства дистрибутивов Linux строится на связке двух ключевых компонентов: загрузчика GRUB(GRand Unified Bootloader) и системы инициализации systemd. Именно эта связка обеспечивает гибкость, надёжность и высокую скорость старта системы, а также предоставляет пользователю и администратору мощные инструменты для диагностики и управления.
В данной статье мы подробно рассмотрим каждый этап загрузки Linux, начиная с момента включения компьютера и заканчивая появлением графического рабочего стола или приглашения к входу в систему. Особое внимание уделим взаимодействию GRUB и systemd, их роли в процессе, а также возможностям настройки и отладки.
1. Аппаратный старт: BIOS и UEFI
1.1. Роль прошивки
Когда вы нажимаете кнопку питания на компьютере, управление передаётся микропрограмме, зашитой в материнскую плату. Исторически это была BIOS (Basic Input/Output System), но на современных системах практически повсеместно используется UEFI (Unified Extensible Firmware Interface).
BIOS — это старый стандарт с рядом ограничений (например, невозможность загрузки с дисков объёмом более 2 ТБ, медленная инициализация). При запуске BIOS выполняет процедуру POST(Power-On Self-Test), проверяя базовое оборудование (процессор, память, видеокарту), после чего ищет загрузочный сектор на первом загрузочном устройстве.
UEFI — это современный стандарт, который представляет собой, по сути, миниатюрную операционную систему. Он хранит свои настройки в специальном разделе на диске (NVRAM), поддерживает графические меню, работу с файловыми системами (FAT32) и протокол безопасной загрузки (Secure Boot). UEFI ищет загрузчик не в первом секторе диска, а по специальному пути в разделе EFI System Partition (ESP).
1.2. Поиск загрузчика
Независимо от типа прошивки, её главная задача на этом этапе — найти и передать управление программе-загрузчику. В случае UEFI она ищет исполняемый файл загрузчика (обычно `*.efi`) в каталоге `/EFI/BOOT/` или `/EFI/<имя_дистрибутива>/`. Для Linux-систем часто используется "shim"-загрузчик, подписанный ключом Microsoft, чтобы обойти ограничения Secure Boot и затем загрузить основной GRUB.
2. Этап загрузчика: GRUB
2.1. Что такое GRUB?
GRUB — это универсальный загрузчик, способный загружать не только Linux, но и другие операционные системы (Windows, BSD). Он является "мостом" между прошивкой компьютера и ядром операционной системы.
GRUB работает в несколько стадий:
1. Стадия 1 (Stage 1): Находится в загрузочном секторе диска (MBR) или в специальном разделе UEFI. Её задача — найти и загрузить следующую стадию.
2. Стадия 1.5 (Stage 1.5): Содержит драйверы для чтения файловых систем (ext4, btrfs, xfs и др.). Это позволяет GRUB находить свои конфигурационные файлы на диске.
3. Стадия 2 (Stage 2): Основная часть загрузчика. Она содержит полноценный интерфейс, парсер конфигурационных файлов и логику загрузки ядер.
2.2. Конфигурация GRUB
Основным файлом конфигурации является `/boot/grub/grub.cfg`. Важно понимать, что этот файл не редактируется вручную . (прим. не ГигаЧат, вполне он редактируется вручную, но предварительно бекапится и всё делается с умом)) Он генерируется автоматически специальными скриптами (например, `grub-mkconfig` или `update-grub`) на основе файлов в каталогах `/etc/default/grub` и `/etc/grub.d/`.
В `grub.cfg` содержатся пункты меню для каждой установленной ОС и ядра Linux. Типичная запись для загрузки Linux выглядит примерно так:
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a1b2c3d4' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
linux /boot/vmlinuz-5.15.0-76-generic root=UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef ro quiet splash $vt_handoff
initrd /boot/initrd.img-5.15.0-76-generic
}
Разберём ключевые параметры:
* `insmod`: Загрузка модулей GRUB (драйверов файловых систем).
* `set root`: Указание раздела, на котором находится ядро.
* `linux /boot/vmlinuz-...`: Путь к файлу ядра и параметры его запуска.
* `initrd /boot/initrd.img-...`: Путь к начальному RAM-диску (initramfs).
2.3. Параметры ядра (Kernel Parameters)
Параметры, передаваемые ядру через GRUB (например, `root=`, `ro`, `quiet`), критически важны для успешной загрузки.
* `root=UUID=...`: Указывает ядру UUID раздела, который нужно смонтировать как корневую файловую систему (`/`). Использование UUID предпочтительнее имён устройств (`/dev/sda1`), так как они могут меняться.
* `ro`: Монтирует корневую файловую систему в режиме "только чтение" на начальном этапе для проверки целостности.
* `quiet` и `splash`: Отключают подробный вывод лога загрузки и показывают красивую заставку.
* `single` или `1`: Переводит систему в однопользовательский режим (режим восстановления).
3. Загрузка ядра и initramfs
После того как пользователь выбрал пункт меню или истёк таймаут, GRUB загружает два файла в оперативную память:
1. Ядро (vmlinuz): Сжатый образ ядра Linux.
2. Initramfs (Initial RAM Filesystem): Временная файловая система в оперативной памяти.
3.1. Роль ядра
Ядро распаковывается в память и начинает свою работу. Оно инициализирует центральный процессор, настраивает управление памятью (*paging*, *slab allocator*), обнаруживает оборудование через ACPI/DTS таблицы и инициализирует драйверы устройств, встроенные в него напрямую.
3.2. Роль initramfs
Initramfs — это архив (обычно cpio), который содержит минимальный набор утилит и модулей ядра (`*.ko`). Его главная задача — подготовить окружение для монтирования реальной корневой файловой системы.
Внутри initramfs находится исполняемый файл `/init`. Это первый процесс пользовательского пространства (PID 1 на данном этапе). Его работа заключается в следующем:
1. Загрузить необходимые модули ядра для доступа к контроллерам дисков (SATA, NVMe), RAID-массивам или системам шифрования (*LUKS*).
2. Собрать сложные устройства (например, собрать *mdadm*-массив или открыть зашифрованный том).
3. Найти корневой раздел по UUID или метке, переданному через параметр `root=`.
4. Смонтировать корневую файловую систему в режиме "только чтение" (`ro`).
5. Проверить файловую систему на ошибки (если нужно).
6. **Передать управление системе инициализации**, находящейся на смонтированном корневом разделе.
Для этого используется специальная команда:
`exec switch_root /new_root /sbin/init`
Здесь `/new_root` — это точка монтирования реальной корневой ФС, а `/sbin/init` — первый процесс системы инициализации.
4. Этап инициализации: systemd
После того как ядро смонтировало корень и передало управление `/sbin/init`, начинается работа systemd. В современных дистрибутивах это замена старой системе SysVinit.
4.1. Философия systemd
Systemd — это не просто система запуска скриптов. Это "системный менеджер", который управляет всем жизненным циклом системы от загрузки до выключения.
Основные принципы работы systemd:
* Юниты (Units): Всё в systemd является "юнитом" (служба, сокет, устройство, точка монтирования). Управление происходит через файлы `.service`, `.mount`, `.socket` и т.д., расположенные в `/etc/systemd/system/` и `/lib/systemd/system/`.
* Зависимости: Systemd строит дерево зависимостей между юнитами, что позволяет запускать сервисы параллельно, а не последовательно, как в SysVinit. Это значительно ускоряет загрузку.
* Цели (Targets): Аналог уровней запуска (runlevels) из SysVinit. Например, `multi-user.target` соответствует уровню 3 (консоль), а `graphical.target` — уровню 5 (графическая оболочка).
4.2. Процесс загрузки systemd
Сразу после запуска systemd выполняет следующие шаги:
1. Инициализация менеджера: Устанавливает себя как PID 1 (процесс усыновляет все осиротевшие процессы).
2. Монтирование виртуальных файловых систем: Монтирует `/proc`, `/sys`, `/dev`. Создает динамические устройства через `udev` (который теперь является частью systemd).
3. Монтирование локальных файловых систем: Читает `/etc/fstab` и монтирует все разделы, указанные там (кроме корня).
4. Запуск базовых служб: Запускает критически важные службы: `systemd-journald` (логирование), `systemd-udevd` (управление устройствами), `systemd-networkd` или `NetworkManager` (сеть), `dbus` (шина сообщений).
5. Переход к целевой цели: Systemd запускает юнит `default.target`. Обычно это `graphical.target`.
4.3. Графическая сессия
Для запуска графического интерфейса systemd активирует юнит `display-manager.service`. Этот сервис запускает дисплейный менеджер (Display Manager), такой как GDM (GNOME Display Manager), SDDM (KDE Display Manager) или LightDM.
Дисплейный менеджер отвечает за:
* Запуск сервера Xorg или Wayland.
* Отображение экрана входа в систему (Greeter).
* Управление пользовательскими сессиями.
После ввода логина и пароля запускается менеджер сеансов (`gdm-session-wor` или аналогичный), который стартует оконный менеджер/композитор и рабочий стол пользователя.
---
Заключение
Процесс загрузки Linux на основе связки GRUB + systemd представляет собой четко структурированную последовательность действий: от низкоуровневой инициализации оборудования прошивкой UEFI/BIOS до высокоуровневого управления сервисами современным системным менеджером.
GRUB обеспечивает гибкость выбора операционной системы и параметров ядра, выступая надежным посредником между железом и софтом. Initramfs берет на себя сложную задачу по подготовке окружения для монтирования корня, поддерживая современные технологии хранения данных вроде LVM и шифрования.
Systemd же завершает процесс, превращая разрозненные скрипты запуска в стройную систему зависимостей, обеспечивая рекордную скорость старта и мощные инструменты администрирования (`systemctl`, `journalctl`), которые стали стандартом де-факто в мире Linux сегодня. Понимание этого процесса позволяет не только эффективно решать проблемы при сбоях загрузки, но и глубоко настраивать систему под любые задачи.
PS
Уважаемые Читатели, в данный момент я готовлю очередную статью. И планирую опубликовать её как обычно в первый рабочий день недели. Но чтобы канал представлял собой интерес для Уважаемых Читателей во время вынужденного затишья, мне показалось хорошей идеей публиковать короткие новостные и разнотематические посты, которые готовятся с помощью GigaChat . Картинка для превью статьи сгенерирована Шедеврум. Канал MAX для всего того, что не поместилось на канал ДЗЕН.