慣例先上成果圖XD
https://asciinema.org/a/439607
終於開機開到shell啦~
上篇說要比對Alpine Linux的rootfs bringup,於是這篇我們便來挖一次Alpine的rootfs是怎麼走的。
首先要勘誤的是,我搞錯了Alpine用OpenRC的方式,既上次作porting已經過了兩年,中間經歷硬碟爆掉、所以port完真的忘了。總之,Alpine是採用busybox
的inittab
跟OpenRC
混搭的方式來使用,所以 /sbin/init
依舊是busybox的symbolic。
那麼,既然是inittab,我們就來看看Alpine on ARM那邊成功開機時,/etc/inittab
的長相:
# /etc/inittab
::sysinit:/sbin/openrc sysinit
::sysinit:/sbin/openrc boot
::wait:/sbin/openrc default
# Set up a couple of getty's
tty1::respawn:/sbin/getty 38400 tty1
tty2::respawn:/sbin/getty 38400 tty2
tty3::respawn:/sbin/getty 38400 tty3
tty4::respawn:/sbin/getty 38400 tty4
tty5::respawn:/sbin/getty 38400 tty5
tty6::respawn:/sbin/getty 38400 tty6
# Put a getty on the serial port
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot
# Stuff to do before rebooting
::shutdown:/sbin/openrc shutdown
# enable login on alternative console
ttyAMA0::respawn:/sbin/getty -L 0 ttyAMA0 vt100
按照inittab的書寫慣例:<id>:<runlevels>:<action>:<process>
他會在啟動時,要openrc執行
/etc/runlevels/sysinit/
/etc/runlevels/boot/
/etc/runlevels/default/
底下的target files,從下一張開始,我將會開始作一些openrc的說明與最後的眉角修訂。
但看這裡,我比較關心的是相關的檔案在不在,然而在emergency shell當中大致嚕過一遍,發現其實openrc depends的東西都好好的活在那邊。
此時回到之前認真看Alpine Init的知識儲備,發現問題點卡在這個條件判斷:
if [ ! -x "${sysroot}${KOPT_init}" ]; then
因為我目前是透過QEMU強灌 init=/init
進去,所以這邊他會嘗試去找 /sysroot/init
而非/sysroot/sbin/init
,導致他最後拐進emergency shell。
知道這個眉角後,其實最快的方式,就是在上面把它override掉:
KOPT_init="/sbin/init"
然後從包一次initramfs,結果就如開頭所示,tada~~成功開機啦~