iT邦幫忙

2021 iThome 鐵人賽

DAY 24
1

慣例先上成果圖XD
https://asciinema.org/a/439607
終於開機開到shell啦~

上篇說要比對Alpine Linux的rootfs bringup,於是這篇我們便來挖一次Alpine的rootfs是怎麼走的。

首先要勘誤的是,我搞錯了Alpine用OpenRC的方式,既上次作porting已經過了兩年,中間經歷硬碟爆掉、所以port完真的忘了。總之,Alpine是採用busyboxinittabOpenRC混搭的方式來使用,所以 /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~~成功開機啦~


上一篇
Alpine Linux Porting (1.11?)
下一篇
Alpine Linux Porting (1.999) The light at the end of tunnel
系列文
Port Alpine Linux to open source RISC-V platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
高魁良
iT邦新手 2 級 ‧ 2021-10-03 21:08:31

:tada
/images/emoticon/emoticon42.gif

我要留言

立即登入留言