Найти в Дзене
Вот и Linux за окном

Загрузка Linux с использованием GRUB и systemd: подробный разбор процесса

Процесс загрузки операционной системы Linux — это сложная, многоэтапная процедура, в которой задействованы как низкоуровневые компоненты аппаратного обеспечения, так и высокоуровневые программные системы. Современный стандарт загрузки большинства дистрибутивов Linux строится на связке двух ключевых компонентов: загрузчика GRUB(GRand Unified Bootloader) и системы инициализации systemd. Именно эта связка обеспечивает гибкость, надёжность и высокую скорость старта системы, а также предоставляет пользователю и администратору мощные инструменты для диагностики и управления. В данной статье мы подробно рассмотрим каждый этап загрузки Linux, начиная с момента включения компьютера и заканчивая появлением графического рабочего стола или приглашения к входу в систему. Особое внимание уделим взаимодействию GRUB и systemd, их роли в процессе, а также возможностям настройки и отладки. Когда вы нажимаете кнопку питания на компьютере, управление передаётся микропрограмме, зашитой в материнскую плат
Оглавление

Введение

Процесс загрузки операционной системы 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 для всего того, что не поместилось на канал ДЗЕН.