Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загрузку. Именно во время загрузки запускаются все те механизмы, что приводят ОС в движение. Процесс этот сложный, многоступенчатый и порой запутанный. Изучать его интересно, а открытия, которые ты сделаешь при этом, могут сильно тебя удивить.

В целом загрузку среднестатистического дистрибутива Linux можно разделить на пять стадий:

  1. Загрузчик.
  2. Запуск и первичная инициализация ядра.
  3. Обнаружение оборудования, загрузка драйверов и подключение файловых систем.
  4. Запуск системных служб (демонов).
  5. Старт графической или консольной пользовательской сессии.

Мы пройдемся по всем стадиям и узнаем, что происходит во время загрузки типичного дистрибутива 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 (о нем чуть позже), загружает их в память и передает управление ядру.

Чтобы увидеть меню Grub в Ubuntu, необходимо удерживать Shift
Чтобы увидеть меню Grub в Ubuntu, необходимо удерживать Shift

 

Почему 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
Содержимое initramfs

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

Скрипт init из initramfs
Скрипт init из initramfs

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


9 комментариев

  1. inkognito.o

    24.10.2017 at 00:48

    очень интересная статья. Коротко и ясно. Спасибо Женя!

    А можно написать статью про GNU HURD?
    Эту ОС скоро можно будет назвать зрелой!

  2. robotobor

    24.10.2017 at 06:31

    Спасибо, побольше бы таких статей )

  3. odin

    24.10.2017 at 09:15

    Спасибо за статью!

  4. bars

    25.10.2017 at 13:13

    Спасибо за классную статью!

  5. rio

    25.10.2017 at 14:35

    очень толково, спасибо!

  6. apl

    31.10.2017 at 11:39

    Лично для меня ничего нового.
    А вот как Евгений это преподнёс — моё почтение, снимаю шляпу.
    Кратко, внятно, доступно.
    Талант преподавателя.

    Статья отличная, побольше бы таких.

  7. enc

    02.11.2017 at 15:22

    Спасибо! Статья собрала воедино все кусочки знаний который у меня были и расставила все по полкам. Узнал что то новенькое %)

  8. petrenkoai

    07.11.2017 at 14:08

    initramfs находится в каталоге /boot и стало быть файловая система данного каталога уже доступна раз уж она загружается. Зачем тогда грузить initramfs, если можно загрузить vmlinuz с того же каталога?

  9. prejux

    31.12.2017 at 12:40

    Отличная статья!

Оставить мнение

Check Also

Весеннее обострение. Как работают две критические уязвимости в Spring Framework

Spring — популярнейший фреймворк для разработки на Java, на котором базируются сотни решен…