← На главную

Linux загружается и выключается менее чем за секунду

15.06.2026 16:03 · hackernews

Автор статьи решил вспомнить времена, когда компьютеры загружались за секунду, и попытался повторить этот опыт на современном Linux. Вместо полноценной ОС он запускает голое ядро, которое выполняет единственный процесс и выключается — всё менее чем за секунду.

Основа — собственный init на C. Программа печатает сообщение и вызывает reboot(RB_POWER_OFF), чтобы ядро не ушло в панику после завершения процесса. Стандартный initrd с дистрибутива содержит 2163 файла и весит 73 МБ. Автор заменяет его минимальным образом: статически компилирует init, упаковывает через cpio и сжимает gzip. Получается initrd с одним файлом.

Для отладки используется виртуализация через KVM с параметрами -kernel, -initrd и -append "console=ttyS0". Ядро распаковывает initrd в initramfs, находит /init и запускает его. В логе видно: Run /init as init process и через долю секунды — reboot: Power down.

Чтобы получить доступ к устройству, нужно смонтировать devtmpfs прямо из кода: mount("devtmpfs", "/dev", "devtmpfs", 0, NULL). Затем можно открыть /dev/sda (блочное устройство, которое QEMU подсовывает через -hda) и читать данные. Автор проверяет это на образе из случайных байт — чтение успешно завершается меньше чем за секунду.

Затем — загрузка на реальном железе через UEFI. Автор форматирует USB-флешку: раздел типа EFI размером 512 МБ с FAT32, второй раздел — ext3. Единственный способ заставить ноутбук загрузиться — положить файл /EFI/BOOT/BOOTX64.EFI. Unified kernel собирается утилитой ukify, которая упаковывает загрузочный стаб, ядро и initrd в один EFI-бинарник. Копируем его на флешку — и система грузится так быстро, что автору пришлось добавить sleep(5), чтобы успеть сделать фото.

Финальный шаг — сборка собственного минимального ядра. Команда make tinyconfig отключает почти всё, но автор по пунктам включает нужное: поддержку initramfs, ELF-бинарников, TTY, последовательный порт 8250, файловые системы ext3/ext4/FAT, ACPI и UEFI-стаб. Оптимизация компиляции — -Os. Готовое ядро весит 1–2 МБ вместо штатных 16 МБ. Минус — можно не догадаться включить нужную опцию, пока код не упадёт.

Практический смысл: экономия места и времени загрузки, сокращение поверхности атаки. А если вшить initrd прямо в ядро, для запуска программы понадобится ровно один файл.

Читать оригинал →