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. После того как выбранное ядро Linux загружено загрузчиком, оно должно самораспаковаться из сжатой версии перед выполнением любой задачи. После самораспаковывания выбранное ядро монтирует корневую файловую систему и инициализирует программу /sbin/init, обычно называемую init.

Init всегда запускается первой программой, и ей назначается ID процесса или PID 1. Это процесс init, который порождает различных демонов и монтирует все разделы файловых систем, указанные в файле /etc/fstab.

Затем ядро монтирует начальный RAM-диск (initrd), который является временной корневой файловой системой, пока не будет смонтирована настоящая корневая файловая система. Все ядра находятся в каталоге /boot вместе с начальным образом RAM-диска.

4. запуск Systemd

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

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: перезагружает систему.

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

systemctl get-default

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

sudo systemctl set-default multi-user.target

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

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

sudo systemctl set-default graphical.target

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

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

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

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