20.10.2025
статья
Как я (случайно) чуть не собрал свой дистрибутив Linux

Всем привет, и поздравляю вас с окончанием поддержки Windows 10! В этот день Microsoft решила оставить без поддержки всего лишь 400 миллионов компьютеров и еще чуть меньше тех, которые из-за системных требований не могут работать на Windows 11. В честь такого замечательного дня я решил вспомнить одну историю о том как я (случайно) начал собирать свой дистрибутив Linux.

Дело начиналось довольно спокойно - я, как и многие из вас, хотел понять, как работают современные операционные системы, и вместе с моим американским другом по имени ChatGPT решил написать мини-ядро на ассемблере для экспериментов. После очередной надписи "No bootable device" в QEMU тот самый американский друг решил показать главную свою особенность - а именно то, что вместо решения сложных задач, он ищет на замену более легкие. Так и произошло здесь - после очередной ошибки он решил в конец ответа дописать, что можно просто использовать Linux как альтернативу, и добавил несколько команд для компиляции ядра. Я, как человек, который несколько лет использует Linux, конечно, заинтересовался скомпилировать ядро, на котором работает мой же ПК.

ChatGPT скинул инструкции по компиляции ядра. Они были даже проще чем компиляция других программ, ведь сторонних библиотек, требующих установку в систему, там нет - нужно просто склонировать репозиторий, опционально - подредактировать конфиг под себя, и запустить компиляцию. Через несколько минут, в результате вывода огромного количества логов, я получил, то, ради чего, как я понял позже, и шел весь этот процесс - это целый один файл!

Как оказалось, этот файл - это сжатое ядро, которое загрузчик распаковывает при загрузке. Именно это ядро и хранит в себе всю основу Linux! В современных дистрибутивах этот файл называется vmlinuz и хранится в папке /boot (в Debian-based это еще и /). Но в моем случае, по умолчанию он назывался bzImage, что все равно не меняло его суть.

Я сразу попробовал запустить ядро в QEMU, и первое что я получил, это, конечо, не опереционная система, а Kernel Panic! И это означает только одно - ядро функционирует! Тогда я сразу же начал дальше разбираться в теме, но давайте я слегка подробнее расскажу, как работает загрузка Linux, чтобы вы точно не запутались.

Для загрузки нужно, по сути, всего два файла - vmlinuz и initramrs (или же его еще называют initrd). Про первый я уже рассказал, теперь расскажу про второй. initramfs - это образ системы, которая загружается в оперативную память при загрузке и подготавливает систему к работе, после чего управление передается уже системе инициализации на реальном диске с системой. initramfs содержит в себе файл, который запускается первым - обычно это /init. Он может быть и бинарником, и скриптом, главное, чтобы он был исполняемем.

Только, в отличии от vmlinuz, initramfs нужно собирать самому. Я решил добавить в него самый минимальный набор того, что нужно чтобы просто проверить систему - а именно я добавил туда так называемый BusyBox - набор утилит, которые лежат в одном файле. После этого я добавил sh (оболочку для консоли) в init-скрипт, и... система показала мне консоль! Конечно, она по сути ничего не умела - не было ни интернета, нормальный программ и даже просто возможности сохранять файлы. Но сам факт того, что на этот раз система не упала с Kernel Panic меня очень сильно порадовал!

А дальше уже начинается процесс кастомизации своего дистрибутива. Конечно, консоль в нем не запускается, как я уже и сказал, initramfs нужен для подготовки компьютера для работы. Но, самое главное, мы поняли как оно работает, и можно приступать к разработке дальше!

В нашем случае программы в initramfs добавляется по мере необходимости, поэтому мы сразу сделаем переход на файловую систему (да, представим, что она у нас есть) и начнем настраивать уже ее! Для этого в BusyBox есть встроенная команда switch_root, которая передает управление системой другому корневому каталогу. Перед этим - монтируем раздел с системой.

Однако, как вы могли заметить, я еще даже не создал образа флешки с дистрибутивом. Для этого я решил использовать один из самых простых путей - grub-mkrescue. Эта утилита позволяет создать образ загрузочной флешки с необходимыми файлами, и в нашем случае - еще и с операционкой. Здесь я уже не буду подробно описывать процесс, но если кратко - создаем пару папок и конфиг, запускаем команду и получаем на выходе .iso файл, который можно записать на флешку или запустить на эмуляторе.

А дальше уже все зависит от целей дистрибутива - добавление программ в сам дистрибутив. Я решил начать с малого - добавил туда coreutils и bash, которые были собраны из исходников.

На этом я пожалуй закончу - такая небольшая история о том, как я для эксперимента решил собрать свой дистрибутив. На этом на самом деле история не закончена и если хотите, я могу написать вторую часть, уже более подробную!

Всем пока, и всех с днем окончания поддержки Windows 10!