Содержание статьи
В целом загрузку среднестатистического дистрибутива Linux можно разделить на пять стадий:
- Загрузчик.
- Запуск и первичная инициализация ядра.
- Обнаружение оборудования, загрузка драйверов и подключение файловых систем.
- Запуск системных служб (демонов).
- Старт графической или консольной пользовательской сессии.
Мы пройдемся по всем стадиям и узнаем, что происходит во время загрузки типичного дистрибутива Linux, немного отклонившись в сторону BSD, macOS и Android по пути. Во многих случаях это позволит понять, почему процесс загрузки Linux именно такой, какой есть.
1. Загрузчик
Все начинается с загрузчика, которому во время старта машины BIOS передает управление. В старые времена, когда Linux был не так популярен, в качестве загрузчика использовался LILO (Linux Loader) — простой, очень примитивный и не позволяющий менять конфигурацию загрузки на лету. Фактически конфигурационный файл был вшит в сам загрузчик, и его приходилось переустанавливать после каждой смены настроек: обновил ядро, забыл переустановить, и твой ноутбук больше не грузится.
Сегодня загрузкой Linux практически в любом дистрибутиве занимается Grub, изначально разработанный для операционной системы GNU/Hard. Grub гораздо сложнее LILO и фактически сам является полноценной ОС. Он не просто читает конфиг загрузки (обычно это /boot/grub/grub.cfg
) прямо с диска, но и позволяет исправить этот конфиг на месте. Grub имеет встроенную командную строку, работает с десятком различных файловых систем и позволяет формировать сложные цепочки загрузки.
Как только пользователь выбирает нужный пункт меню (либо по истечении тайм-аута), Grub находит связанный с этим пунктом меню образ ядра Linux на диске (обычно это файл /boot/vmlinuz
), а также закрепленный за ним образ initramfs (о нем чуть позже), загружает их в память и передает управление ядру.

Почему vmlinuz?
Название файла с образом ядра имеет исторические корни. Изначально образ ядра классического UNIX назывался просто unix, но, когда появилась версия ядра для процессоров с защитой памяти, чтобы избежать путаницы, название сменили на vmunix. Буква z вместо x на конце, в свою очередь, означает, что образ сжат с помощью утилиты gzip (алгоритм Deflate, тот же, что в классическом ZIP).
2. Ядро и initramfs
Получив управление, ядро начинает первичную инициализацию: запускается подсистема управления памятью, настраивается обработчик прерываний, инициализируются необходимые для дальнейшей работы ядра структуры данных. Когда эта работа будет закончена, ядро распаковывает архив initramfs (обычно он имеет имя вида /boot/initramfs-linux.img
и представляет собой архив cpio, сжатый с помощью gzip) в файловую систему в оперативной памяти (tmpfs), делает ее корневой файловой системой и запускает скрипт /init
(в различных дистрибутивах имя может отличаться).
Initramfs включает в себя базовый набор компонентов Linux-дистрибутива: стандартные системные каталоги /bin
, /lib
, /etc
и так далее, простейший командный интерпретатор (обычно ash), набор команд BusyBox, несколько вспомогательных библиотек и набор модулей ядра (драйверов), предназначенных для работы с различными накопителями и файловыми системами.

Смысл существования initramfs в том, чтобы решить проблему курицы и яйца: загрузить драйверы для подключения реальной корневой файловой системы до того, как она будет подключена. Именно это и происходит, когда система запускает скрипт /init
. Он определяет установленные в систему накопители, загружает в ядро драйверы для работы с ними, а затем подключает нужный раздел нужного накопителя (о том, какой именно, ядро узнает благодаря переданному при загрузке параметру root) к корню, перекрывая таким образом содержимое initramfs. Затем скрипт запускает /sbin/init
, с которого и начинается следующий шаг загрузки ОС.

Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
inkognito.o
24.10.2017 в 00:48
очень интересная статья. Коротко и ясно. Спасибо Женя!
А можно написать статью про GNU HURD?
Эту ОС скоро можно будет назвать зрелой!
robotobor
24.10.2017 в 06:31
Спасибо, побольше бы таких статей )
odin
24.10.2017 в 09:15
Спасибо за статью!
bars
25.10.2017 в 13:13
Спасибо за классную статью!
rio
25.10.2017 в 14:35
очень толково, спасибо!
apl
31.10.2017 в 11:39
Лично для меня ничего нового.
А вот как Евгений это преподнёс — моё почтение, снимаю шляпу.
Кратко, внятно, доступно.
Талант преподавателя.
Статья отличная, побольше бы таких.
enc
02.11.2017 в 15:22
Спасибо! Статья собрала воедино все кусочки знаний который у меня были и расставила все по полкам. Узнал что то новенькое %)
petrenkoai
07.11.2017 в 14:08
initramfs находится в каталоге /boot и стало быть файловая система данного каталога уже доступна раз уж она загружается. Зачем тогда грузить initramfs, если можно загрузить vmlinuz с того же каталога?
prejux
31.12.2017 в 12:40
Отличная статья!