Как только загрузчик загрузил ядро в память и передал необходимые параметры, управление системой переходит к ядру. Давайте рассмотрим, что происходит дальше.
Инициализация ядра и Initramfs
Классическая проблема при загрузке заключается в том, что ядру нужны драйверы для доступа к аппаратным устройствам, но эти драйверы часто находятся на устройстве хранения данных, к которому ядро пока не может получить доступ. Для решения этой проблемы в Linux используется временная корневая файловая система.
В старых системах для этого использовался initrd (initial RAM disk — начальный RAM-диск). Ядро загружало этот образ диска, находило необходимые драйверы, а затем переключалось на реальную корневую файловую систему. Современные системы, включая дистрибутивы вроде Ubuntu, используют initramfs (initial RAM filesystem — начальная RAM-файловая система). В отличие от initrd, initramfs представляет собой архив cpio, который распаковывается непосредственно в памяти во временную файловую систему. Этот подход более эффективен, поскольку позволяет избежать накладных расходов на создание и монтирование блочного устройства. initramfs содержит только основные модули, необходимые ядру для доступа к фактическому загрузочному разделу (boot partition) и другому оборудованию.
Монтирование корневой загрузочной файловой системы
Загрузив драйверы из initramfs, ядро может найти и смонтировать основную корневую загрузочную (boot root) файловую систему. Расположение этой файловой системы обычно передается как параметр загрузчиком, который можно настроить в таких файлах, как /etc/default/grub.
Сначала ядро монтирует корневой загрузочный раздел в режиме "только для чтения". Это мера предосторожности, которая позволяет утилите fsck (проверка файловой системы) запуститься и проверить целостность файловой системы без риска повреждения данных. После успешного завершения проверки ядро повторно монтирует файловую систему в режиме чтения-записи.
Наконец, когда корневая файловая система становится полностью доступной, ядро запускает самую первую программу пользовательского пространства: init. Эта программа отвечает за запуск остальной части системы.