flapenguin.me

init - запускаем голый exe на голом ядре

Оригинал https://t.me/bits_and_bicycles/13

root тяжело найти, легко потерять и невозможно забыть. Осталось понять откуда он изначально берётся.

Ответ простой. Ядро #linux'а при старте запускает один единственный процесс со всеми правами на свете. Но мало знать ответ, хочется же пощупать что там происходит на самом деле.

Общество и, возможно, лично Поттеринг хочет, чтобы ты считал, что самому собирать системы сложно. Ведь иначе люди увидят насколько плох GNU-софт, или, ещё хуже, перестанут заносить деньги в Red Hat. На ум сразу приходит LFS, где надо долго и нудно копипастить команды сборки GNU софта спотыкаясь об autohell. В итоге, вроде, и команды сам ввёл, и систему сам собрал, но ни черта не понятно.

Нам с тобой полноценный GNU/Linux собирать не надо, поэтому обойдёмся чернозёмом и палками. Понадобится виртуалка, ядро, и какой-нибудь бинарник для init'а. Возьмём #qemu, собранное ядро украдём из netboot'а #alpine'а, а вместо init'а у нас будет интерактивный шел sh -i из #busybox'а. Последний тоже качнём уже собранный. Потому что навряд ли ты вечер четверга хотел провести в Makefile'ах.

qemu умеет запускать линуксовое ядро из коробки, это значит нам не придётся возиться с grub'ом и bios/efi. Нужно только сварить ramdisk, файловую систему, с которой стартанёт ядро. В него мы положим busybox и init из пары строчек.

Полный скрипт для подготовки и запуска виртуалки занял всего 30 строк. https://github.com/flapenguin/stuff/blob/master/linux-boot/boot-x86_64.sh

Последней строчкой скрипт запускает qemu и... Поздравляю, у тебя root. И виртуалка с голым линуксом в придачу. Всё, можешь писать убийцу systemd.

(убить виртуалку можно через poweroff -f в ней или kill … из соседнего терминала)

$ qemu-system-x86_64 ... -kernel ./deps/x86_64/vmlinuz-lts -initrd ./initrd/x86_64.gz
...
/ # id
uid=0 gid=0