Задумывались ли вы о том, как происходит загрузка операционной системы? Как компьютер узнаёт о том, где находится операционная система? Давайте рассмотрим процесс запуска Linux от включения компьютера и до входа в систему.
Практически каждый этап загрузки может идти несколькими путями. Например, вы узнаете о том, чем отличается BIOS от UEFI, что делает GRUB и чем его можно заменить, почему одного лишь ядра Linux недостаточно для функционирования операционной системы.
Процесс загрузки Linux
Процесс загрузки операционной системы можно разбить на 5 этапов, причём первые три зависят от материнской платы. Ниже вы можете видеть схематичное изображение этапов загрузки Linux.
Как видите, до того, как загрузится ядро, процесс имеет существенные отличия. И всё же любая загрузка системы начинается с включения компьютера.
Первый этап: включение компьютера
Запуск компьютера с BIOS и UEFI отличается. Первый BIOS появился в середине 70-х годов, а MBR стали использовать с 1983 года. Стоит ли говорить о том, что для современного компьютера предпочтительнее использовать UEFI и GPT. А теперь перейдём непосредственно к рассмотрению первого этапа загрузки.
BIOS + MBR
BIOS – это базовая система ввода-вывода. Она представляет из себя набор программ для взаимодействия с устройствами компьютера. BIOS хранится на микросхеме EEPROM материнской платы. При каждом запуске компьютера плата автоматически отправляет код процессору на исполнение. Далее BIOS проводит проверку оборудования (тест POST) и обращается к жёсткому диску или твердотельному накопителю. От него ему нужны первые 512 байт, именно там находится главная загрузочная запись (MBR). Ниже вы можете видеть структуру MBR.
Если подпись MBR равна 55AAh, то система начинает выполнять код первичного загрузчика. В случае с Linux, MBR передаёт управление основному загрузчику GRUB. Он располагается сразу после MBR. До начала первого раздела на накопителе есть не менее 32 килобайт свободного места (современные системы оставляют 1 Мбайт), этого достаточно для того, чтобы разместить GRUB.
Таблица разделов в MBR имеет крайне скромный размер, есть место всего на 4 позиции. В связи с этим нельзя разметить накопители объёмом более 2 терабайт. К тому же она использует устаревшую адресацию, с цилиндрами, головками и секторами жёсткого диска.
На компьютерах с UEFI поддержка MBR никуда не делась, но для этого вам придётся активировать BIOS или CSM mode, в зависимости от производителя материнской платы. Это нужно для совместимости со старыми операционными системами.
UEFI + GPT
Интерфейс расширяемой прошивки EFI (позднее унифицированный UEFI) – это разработка Intel. Он был создан потому, что BIOS имеет ряд недостатков. К ним можно причислить работу в 16-битном режиме, последовательную проверку устройств и загрузку только через MBR.
Физически поменялось не многое, разве что FLASH-накопитель для хранения прошивки стал больше. Зато программная часть претерпела значительные изменения. UEFI работает в 32- и 64-битном режиме, поддерживает таблицу разделов GPT, может иметь красивый графический интерфейс, оболочку EFI Shell и управление с помощью мыши. К тому же опрос оборудования происходит гораздо быстрее.
Оглавление таблицы GPT располагается в первом логическом блоке (LBA 1). В GPT перешли к использованию логических блоков, к тому же их понимают современные жёсткие диски и SSD. Нулевой блок по-прежнему отдаётся под MBR, но в этот раз он выполняет защитную функцию, чтобы старые операционные системы не переписали GPT.
Каждой записи таблицы даётся 128 байт, что позволяет разметить накопители практически неограниченного объёма. Да и самих записей может быть больше 100.
В конце таблицы находится контрольная сумма. Если будет обнаружено несоответствие, то система попробует обратиться к резервной копии таблицы, расположенной в последних блоках накопителя.
После проверки устройств, UEFI может самостоятельно обратиться к таблице разделов GPT. В ней её интересует EFI раздел. Обычно под него выделяется 520-540 Мбайт. Такой размер связан с тем, что ранние версии EFI могли выдавать ошибку при работе с меньшим объёмом. Но Windows уже отходит от этой традиции и ограничивается 100 Мбайтами.
В разделе EFI обязательно должна быть папка EFI/BOOT, в ней находится загрузчик по умолчанию. Но никто не мешает добавить свой загрузчик, например, для Ubuntu и Windows.
К минусам UEFI можно отнести Secure Boot. Загрузчик без подписи просто не сможет быть использован. Эти меры направлены в первую очередь на компьютеры с Windows, чтобы не допустить использование старых систем на новых омпьютерах. Для Linux в этом случае приходится искать подписанный загрузчик или отключать Secure Boot, если имеется такая возможность.
Ещё одним способом загрузки является PXE – загрузка через сетевой интерфейс. Первичный загрузчик находится в ПЗУ сетевой карты. С его помощью карта через протокол TFTP получает основной загрузчик.
Этот способ загрузки будет работать как с BIOS, так и с UEFI. Он полезен для работы с тонкими клиентами и для установки операционной системы по сети.
Второй этап: загрузчик
Загрузчик подготавливает систему к загрузке ядра операционной системы. Например, для Linux он может передавать параметры запуска ядра. В зависимости от того, что используется, BIOS или UEFI, выбор загрузчика отличается.
Как можете видеть, в Ubuntu есть как .efi загрузчик, так и GRUB.
GRUB – это основной загрузчик для большинства дистрибутивов Linux. Он примечателен тем, что позволяет не только запустить ядро Linux или другой операционной системы, но ещё и сам по себе способен выполнять некоторые операции. Он имеет собственную командную строку и в теории позволяет устранить собственные ошибки. GRUB существует в версиях как для BIOS, так и UEFI. Но последний не имеет цифровой подписи для Secure Boot.
Syslinux Project
Дальше выполняется загрузка ядра Linux. Ядро лежит в папке boot под названием vmlinuz. «vm» в начале говорит о том, что ядро будет размещено в виртуальной памяти. А «z» на конце означает то, что ядро запаковано в архив и требует распаковку. Это возможно благодаря тому, что в начале архива находится исполняемый код.
В процессе запуска ядра настраивается оборудование, запускается менеджер памяти, планировщик задач и многое другое, необходимое для функционирования операционной системы.
Ядро Linux монолитное, драйверы устройств хранятся прямо в нём. Однако, это утверждение верно лишь отчасти. Большая часть периферийных устройств не имеет драйверов в ядре Linux. Вместо этого в оперативной памяти распаковывается ещё один файл во временной файловой системе – initrd.img.
После запуска всех необходимых служб временный раздел удаляется. Но это происходит не всегда. Например, он остаётся после запуска в режиме liveCD и при использовании тонкого клиента.
Четвертый этап: запуск пользовательских служб
Ядро загрузилось и работает. Но этого недостаточно для работы с операционной системой. Вы по-прежнему не можете взаимодействовать с ней на прикладном уровне. Для того, чтобы можно было что-то сделать в Linux, управление получает подсистема инициализации и управления службами. Обычно этот процесс имеет идентификационный номер PID-1.
Systemd
Systemd – это самая популярная система инициализации. Она хорошо распараллеливает задачи и практически вытеснила другие решения. Запускаются десятки служб. Например, такие, которые управляют звуковыми устройствами, мультимедийными клавишами, запускают графическую оболочку. Большая часть файлов подсистемы представлена конфигурационными файлами, ссылающимися на конкретные утилиты и сервисы, но есть и собственные службы.
Стоит пару слов уделить D-Bus. Эта служба позволяет процессам взаимодействовать друг с другом. Например, через неё служба управления звуковыми устройствами узнаёт о том, что была нажата клавиша увеличения громкости, распознанная другой службой. Такой подход позволяет создавать простые, но эффективные службы.
А ещё в комплект утилит Systemd входит супервизор. Он следит за тем, чтобы все критически важные службы работали. Если он заметит, что какой-то службы не хватает, то сразу же запустит её снова. Его также применяют для поддержания работы серверов.
Sysvinit, OpenRC и другие
Sysvinit считается устаревшей системой. Она следует принципам, заложенным ещё в 80-х годах для операционной системы Unix System V. Запуск служб происходит последовательно, а настройка производится с помощью скриптов, что несколько проще, чем у systemd.
Для дистрибутива Gentoo разрабатывается система инициализации OpenRC. Её можно назвать осовремененной sysvinit. Но важно понимать, что рядовому пользователю система инициализации безразлична, она интересует лишь тех, кто добавляет свои службы и утилиты в дистрибутив Linux.
О других системах, вроде Runit, Daemontools или S6, справедливо предыдущее утверждение, к тому же их доля совсем невелика. Хотя они тоже имеют свои особенности. После этого процесс загрузки Linux практически завершен.
Пятый этап: экранный менеджер и окружение рабочего стола
Нельзя списывать со счетов и дисплейный менеджер. Это по сути первая программа с графическим интерфейсом. Она отвечает за вход в систему. Хотя и до её запуска проводились некоторые работы, был запущен сервер X11 для обращения к видеокарте и обработки команд управления c мыши и клавиатуры.
После ввода пароля запускается оконный менеджер с библиотеками отображения (обычно GTK3 или Qt) и непосредственно само окружение рабочего стола. Эти службы отвечают за то, чтобы вы могли перемещать окна, перетаскивать файлы, иметь несколько рабочих столов и тому подобное. Всё, загрузка Linux выполнена и операционная система полностью готова к использованию!
Выводы
В этой статье мы рассмотрели процесс загрузки Linux поверхностно, но этого достаточно, чтобы иметь общее представление об этом сложном многоступенчатом процессе. Несмотря на то, что каждый элемент выполняет свою функцию, после подготовки он передаёт управление следующему. Это позволяет автоматизировать загрузку и в целом упростить её.
Что же касается выбора между BIOS и UEFI, то последний однозначно выигрывает. Как минимум потому, что он практически не тратит время на проверку оборудования, а также позволяет практически сразу передать управление ядру Linux.