zaLinux.ru

Как происходит загрузка Linux


Каждый раз, когда вы включаете свой компьютер с Linux, он проходит ряд этапов, прежде чем, наконец, отобразится экран входа в систему, который запрашивает ваше имя пользователя или пароль. Существует 4 различных этапа, которые каждый дистрибутив Linux проходит в типичном процессе загрузки.

В этом руководстве мы выделим различные шаги, предпринятые ОС Linux с момента включения до момента входа в систему. Обратите внимание, что это руководство сфокусировано на загрузчике GRUB2 и systemd init, поскольку они используются в настоящее время подавляющим большинством современных дистрибутивов Linux. Но существуют и другие загрузчики, например, дистрибутивы на основе Arch Linux используют systemd-boot.

Процесс загрузки состоит из следующих 4 шагов, которые мы обсудим более подробно:

  1. Инициализация системы: UEFI или BIOS (POST)
  2. Запуск загрузчика (GRUB2 или systemd-boot)
  3. Инициализация ядра
  4. Запуск systemd, родителя всех процессов

1. Инициализация системы: UEFI или BIOS

Смотрите также: «Что такое UEFI и чем он отличается от BIOS?»

Инициализация системы под UEFI

  1. Система включена, выполняется самотестирование при включении (POST).
  2. После POST UEFI инициализирует оборудование, необходимое для загрузки (диск, контроллеры клавиатуры и т. д.).
  3. Прошивка считывает загрузочные записи в NVRAM, чтобы определить, какое приложение EFI запускать и откуда (например, с какого диска и раздела).
  • Загрузочной записью может быть просто диск. В этом случае микропрограмма ищет системный раздел EFI на этом диске и пытается найти приложение EFI в резервном загрузочном пути \EFI\BOOT\BOOTX64.EFI (BOOTIA32.EFI в системах с IA32 (32-разрядным) UEFI). Так работают загрузочные съёмные носители UEFI.
  1. Прошивка запускает приложение EFI.
  • Это может быть загрузчик или само ядро Arch, использующее EFISTUB.
  • Это может быть какое-то другое приложение EFI, такое как оболочка UEFI, или менеджер загрузки, например systemd-boot или rEFInd.

Если включена безопасная загрузка, процесс загрузки будет проверять подлинность двоичного файла EFI по подписи.

Инициализация системы под BIOS

  1. Система включена, выполняется самотестирование при включении (POST).
  2. После POST BIOS инициализирует оборудование, необходимое для загрузки (диск, контроллеры клавиатуры и т. д.).
  3. BIOS запускает первые 440 байтов (область кода начальной загрузки основной загрузочной записи) первого диска в порядке дисков BIOS.
  4. Затем первый этап загрузчика в загрузочном коде MBR запускает свой второй этап (если есть) из одного из следующих источников:
  • следующие секторы диска после MBR, то есть так называемый промежуток после MBR (только в таблице разделов MBR).
  • загрузочная запись тома раздела или диска без разделов (VBR).
  • загрузочный раздел BIOS (только GRUB в BIOS/GPT).
  1. Запускается фактический загрузчик.
  2. Затем загрузчик загружает операционную систему путём последовательной или прямой загрузки ядра операционной системы.

Проверка целостности BIOS (POST)

Процесс загрузки обычно инициализируется, когда пользователь нажимает кнопку включения — если ПК уже был выключен — или перезагружает систему с помощью графического интерфейса или командной строки.

Когда система Linux включается, включается BIOS (базовая система ввода-вывода) и выполняет самотестирование при включении (POST). Это проверка целостности, которая выполняет множество диагностических проверок.

POST проверяет работоспособность оборудования таких компонентов, как жёсткий или твердотельный накопитель, клавиатура, оперативная память, порты USB и любое другое оборудование. Если какое-либо аппаратное устройство не обнаружено или если есть неисправность в каком-либо из устройств, например, повреждённый жёсткий диск или твердотельный накопитель, на экране появляется сообщение об ошибке, предлагающее вам вмешаться.

В некоторых случаях раздаётся звуковой сигнал, особенно в случае отсутствия модуля RAM. Однако, если ожидаемое оборудование присутствует и функционирует должным образом, процесс загрузки переходит к следующему этапу.

2. Загрузчик (GRUB2 или systemd-boot)

Если компьютер запускает UEFI, то обычно она запускает приложение EFI, как правило располагающееся по пути \EFI\BOOT\BOOTX64.EFI (/boot/EFI/BOOT/BOOTX64.EFI) на загрузочном диске.

Если это BIOS, то после завершения POST, BIOS проверяет MBR (главную загрузочную запись) на предмет загрузчика и информации о разделах диска.

MBR — это 512-байтовый код, расположенный в первом секторе жёсткого диска, обычно это /dev/sda или /dev/hda, в зависимости от архитектуры вашего жёсткого диска. Обратите внимание, однако, что иногда MBR может находиться на Live USB или DVD-диске Linux.

В Linux существует 2 основных типа загрузчиков: GRUB2 и systemd-boot. Загрузчик GRUB2 — распространён в дистрибутивах на основе Debian. Загрузчик systemd-boot применяется в Arch Linux и основанных на этой ОС дистрибутивах.

Загрузчик GRUB2


GRUB2 означает GRand Unified Bootloader version 2. Как только BIOS обнаруживает загрузчик grub2, он запускается и загружает его в основную память (RAM).

Современный GRUB2 может работать и с UEFI (с помощью efibootmgr). В Arch Linux поддержка BIOS и UEFI собрана в один пакет grub. В Debian и производных дистрибутивах GRUB представлен двумя версиями:

  • grub-pc (BIOS версия)
  • grub-efi (UEFI версия)

Меню grub2 позволяет вам делать несколько вещей. Оно позволяет вам выбрать версию ядра Linux, которую вы хотите использовать. Если вы несколько раз обновляли свою систему, вы можете увидеть в списке разные версии ядра. Кроме того, он даёт вам возможность редактировать некоторые параметры ядра, нажимая комбинацию клавиш клавиатуры.

Кроме того, в настройке с двойной загрузкой, когда у вас есть несколько установок ОС, меню grub позволяет вам выбрать, в какую ОС загружаться. Файл конфигурации grub2 — это файл /boot/grub2/grub2.cfg. Основная цель GRUB — загрузить ядро Linux в основную память.

Загрузчик systemd-boot

systemd-boot (сокращенно sd-boot) — простой менеджер загрузки UEFI. Он предоставляет графическое меню для выбора записи для загрузки и редактор командной строки ядра. Systemd-boot поддерживает системы только с прошивкой UEFI.


systemd-boot загружает информацию о загрузочной записи из системного раздела EFI (ESP), обычно монтируемого в /efi/, /boot/ или /boot/efi/ во время запуска ОС, а также из расширенного раздел загрузчика, если он существует (обычно монтируется в /boot/). Фрагменты файла конфигурации, ядра, initrds и другие образы EFI для загрузки обычно должны находиться на ESP или разделе расширенного загрузчика. Ядра Linux должны быть собраны с CONFIG_EFI_STUB, чтобы их можно было напрямую запускать как образ EFI. Во время загрузки systemd-boot автоматически собирает список загрузочных записей из следующих источников:

  • Загрузочные записи, определённые с помощью файлов описания спецификации загрузчика, расположенных в /loader/entries/ на ESP и в разделе расширенного загрузчика. Обычно они описывают образы ядра Linux со связанными образами initrd, но также могут описывать произвольные другие исполняемые файлы EFI.
  • Унифицированные образы ядра в соответствии со спецификацией загрузчика в виде исполняемых двоичных файлов EFI в /EFI/Linux/ на ESP и в разделе расширенного загрузчика.
  • Диспетчер загрузки Microsoft Windows EFI, если он установлен.
  • Диспетчер загрузки Apple MacOS X, если он установлен.
  • Бинарный файл EFI Shell, если он установлен
  • Перезагрузка в опцию настройки прошивки UEFI, если она поддерживается.

systemd-boot поддерживает следующие функции:

  • Основные изменения конфигурации диспетчера загрузки (например, настройка тайм-аута, выбор загрузочной записи по умолчанию и т. д.) Могут быть сделаны непосредственно из пользовательского интерфейса загрузчика во время загрузки, а также во время выполнения системы с переменными EFI.
  • Диспетчер загрузки интегрируется с командой systemctl для реализации таких функций, как systemctl reboot --boot-loader-entry=… (для перезагрузки в определённый пункт меню загрузки, например, «перезагрузка в Windows») и systemctl reboot --boot-loader-menu=… (для перезагрузки в меню загрузчика), реализовав интерфейс загрузчика.
  • Переменная EFI, установленная загрузчиком, сообщает ОС о разделе ESP, используемом во время загрузки. Затем она используется для автоматического монтирования правильного раздела ESP в /efi/ или /boot/ во время работы ОС.
  • Диспетчер загрузки предоставляет информацию о времени загрузки, затраченном на прошивку UEFI, с помощью Boot Loader Interface. Эта информация может быть отображена с помощью systemd-analyze
  • В диспетчере загрузки реализован подсчёт загрузки и автоматический откат к более старым рабочим записям загрузки в случае сбоя.
  • Диспетчер загрузки дополнительно считывает случайное начальное число из раздела ESP, объединяет его с «системным токеном», хранящимся в постоянной переменной EFI, и извлекает случайное начальное число для использования ОС в качестве инициализации пула энтропии, обеспечивая полный пул энтропии во время ранней загрузки.

3. Инициализация ядра

Ядро — это основа любой системы Linux. Оно связывает оборудование ПК с базовыми процессами. Ядро контролирует все процессы в вашей системе Linux.

Все ядра (разных версий, а также fallback и lts ядра) находятся в самораспаковывающемся сжатом формате для экономии места. Ядра расположены в каталоге /boot вместе с исходным образом RAM-диска и картами устройств жёстких дисков.


После того, как выбранное ядро загружено в память и начало выполняться, оно должно сначала извлечь себя из сжатой версии файла, прежде чем оно сможет выполнить какую-либо полезную работу. После извлечения ядра оно загружает systemd, который является заменой старой программы инициализации SysV, и передаёт ему управление.

Это конец процесса загрузки. На данный момент ядро Linux и systemd работают, но не могут выполнять какие-либо продуктивные задачи для конечного пользователя, поскольку больше ничего не работает.

Процесс запуска следует за процессом загрузки и переводит компьютер Linux в рабочее состояние, в котором его можно использовать для продуктивной работы.

4. запуск Systemd

Наконец, ядро загружает Systemd, заменяющий старый SysV init.

systemd является матерью всех процессов и отвечает за приведение хоста Linux в состояние, в котором можно выполнять продуктивную работу. Некоторые из её функций, которые гораздо более обширны, чем старая программа init, заключаются в управлении многими аспектами работающего хоста Linux, включая монтирование файловых систем, а также запуск и управление системными службами, необходимыми для работы хоста Linux. Любые задачи systemd, не связанные с последовательностью запуска, выходят за рамки этой статьи.

Сначала systemd монтирует файловые системы, определённые в /etc/fstab, включая все файлы подкачки и разделы. На этом этапе он может получить доступ к файлам конфигурации, расположенным в /etc, включая свои собственные. Он использует свой файл конфигурации /etc/systemd/system/default.target, чтобы определить, в каком состоянии или цели он должен загрузить хост. Файл default.target представляет собой всего лишь символическую ссылку на настоящий целевой файл. Для настольной рабочей станции это обычно будет graphical.target, что эквивалентно уровню выполнения 5 в старой системе инициализации SystemV. Для сервера по умолчанию, скорее всего, будет multi-user.target, который похож на уровень запуска 3 в SystemV. emergency.target аналогичен однопользовательскому режиму.

Обратите внимание, что цели и службы являются системными единицами.

Итак, Systemd использует файл /usr/lib/systemd/system/default.target для определения состояния или цели, в которую должна загружаться система Linux.

  • Для настольной рабочей станции (с графическим интерфейсом пользователя) целевое значение по умолчанию graphical.target.
  • Для сервера целью по умолчанию является multi-user.target.

Все возможные виды целей systemd:

  • poweroff.target: выключение системы.
  • rescue.target: запускает сеанс спасательной оболочки.
  • multi-user.target: настраивает систему на неграфическую (консольную) многопользовательскую систему.
  • graphical.target: настройка системы на использование графического многопользовательского интерфейса с сетевыми службами.
  • reboot.target: перезагружает систему.
  • halt.target: останавливает систему, не отключая её

Чтобы проверить текущую цель в вашей системе, выполните команду:

systemctl get-default

Вы можете переключаться с одной цели на другую, выполнив на терминале следующую команду:

sudo systemctl set-default multi-user.target

Эта команда переводит систему в неграфическое состояние (после перезагрузки).

А эта команда возвращает в загрузку в графический интерфейс:

sudo systemctl set-default graphical.target

Процесс загрузки завершается, когда systemd загружает все демоны и устанавливает значение целевого уровня или уровня выполнения. Именно в этот момент вам будет предложено ввести имя пользователя и пароль, после чего вы получите доступ к своей системе Linux.


Рекомендуемые статьи:

2 Комментарии

  1. Вадим

    В конце спутался автор? init и systemd это ведь взаимозаменяющие вещи, зачем ядро будет запускать init, а потом еще запускать SystemD, которая является более продвинутой системой инициализации, чем init, который считается устаревшей?

    1. Alexey (Автор записи)

      Приветствую! Вы правы. Поправил заметку.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *