Как происходит загрузка Linux
Каждый раз, когда вы включаете свой компьютер с Linux, он проходит ряд этапов, прежде чем, наконец, отобразится экран входа в систему, который запрашивает ваше имя пользователя или пароль. Существует 4 различных этапа, которые каждый дистрибутив Linux проходит в типичном процессе загрузки.
В этом руководстве мы выделим различные шаги, предпринятые ОС Linux с момента включения до момента входа в систему. Обратите внимание, что это руководство сфокусировано на загрузчике GRUB2 и systemd init, поскольку они используются в настоящее время подавляющим большинством современных дистрибутивов Linux. Но существуют и другие загрузчики, например, дистрибутивы на основе Arch Linux используют systemd-boot.
Процесс загрузки состоит из следующих 4 шагов, которые мы обсудим более подробно:
- Инициализация системы: UEFI или BIOS (POST)
- Запуск загрузчика (GRUB2 или systemd-boot)
- Инициализация ядра
- Запуск systemd, родителя всех процессов
1. Инициализация системы: UEFI или BIOS
Инициализация системы под UEFI
- Система включена, выполняется самотестирование при включении (POST).
- После POST UEFI инициализирует оборудование, необходимое для загрузки (диск, контроллеры клавиатуры и т. д.).
- Прошивка считывает загрузочные записи в NVRAM, чтобы определить, какое приложение EFI запускать и откуда (например, с какого диска и раздела).
- Загрузочной записью может быть просто диск. В этом случае микропрограмма ищет системный раздел EFI на этом диске и пытается найти приложение EFI в резервном загрузочном пути \EFI\BOOT\BOOTX64.EFI (BOOTIA32.EFI в системах с IA32 (32-разрядным) UEFI). Так работают загрузочные съёмные носители UEFI.
- Прошивка запускает приложение EFI.
- Это может быть загрузчик или само ядро Arch, использующее EFISTUB.
- Это может быть какое-то другое приложение EFI, такое как оболочка UEFI, или менеджер загрузки, например systemd-boot или rEFInd.
Если включена безопасная загрузка, процесс загрузки будет проверять подлинность двоичного файла EFI по подписи.
Инициализация системы под BIOS
- Система включена, выполняется самотестирование при включении (POST).
- После POST BIOS инициализирует оборудование, необходимое для загрузки (диск, контроллеры клавиатуры и т. д.).
- BIOS запускает первые 440 байтов (область кода начальной загрузки основной загрузочной записи) первого диска в порядке дисков BIOS.
- Затем первый этап загрузчика в загрузочном коде MBR запускает свой второй этап (если есть) из одного из следующих источников:
- следующие секторы диска после MBR, то есть так называемый промежуток после MBR (только в таблице разделов MBR).
- загрузочная запись тома раздела или диска без разделов (VBR).
- загрузочный раздел BIOS (только GRUB в BIOS/GPT).
- Запускается фактический загрузчик.
- Затем загрузчик загружает операционную систему путём последовательной или прямой загрузки ядра операционной системы.
Проверка целостности 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 представлен двумя версиями:
Меню 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.
- poweroff.target: выключение системы.
- rescue.target: запускает сеанс спасательной оболочки.
- multi-user.target: настраивает систему на неграфическую (консольную) многопользовательскую систему.
- graphical.target: настройка системы на использование графического многопользовательского интерфейса с сетевыми службами.
- reboot.target: перезагружает систему.
Чтобы проверить текущую цель в вашей системе, выполните команду:
Вы можете переключаться с одной цели на другую, выполнив на терминале следующую команду:
sudo systemctl set-default multi-user.target
Эта команда переводит систему в неграфическое состояние (после перезагрузки).
А эта команда возвращает в загрузку в графический интерфейс:
sudo systemctl set-default graphical.target
Процесс загрузки завершается, когда systemd загружает все демоны и устанавливает значение целевого уровня или уровня выполнения. Именно в этот момент вам будет предложено ввести имя пользователя и пароль, после чего вы получите доступ к своей системе Linux.