Linux
帶有核心和 BusyBox 的最小 Linux:/etc/inittab 被忽略,僅 /init 被執行
我設法創建了一個小型且功能齊全的實時 Linux CD,其中僅包含核心(使用預設選項編譯)和 BusyBox(使用預設選項 + 靜態編譯,所有小程序都存在,包括
/sbin/init
)。我創建initrd
和填充沒有問題/dev
,/proc
而且/sys
我的/init
shell 腳本也沒有任何問題。最近我讀到 BusyBox 支持
/etc/inittab
配置(至少在某種程度上),我非常想做以下任何一項:
- 忘記我的
/init
shell 腳本,完全依賴/etc/inittab
配置。- 同時使用
/init
shell 腳本和/etc/inittab
配置。
/etc/inittab
現在是實際問題 -當我的發行版啟動時,它似乎被完全忽略了。症狀是:
- 當我刪除
/init
並離開/etc/inittab
時,我最終會出現核心恐慌。我的假設是核心根本不執行/sbin/init
,或者/sbin/init
沒有找到(或讀取)/etc/inittab
。- 我讀到 BusyBox 即使沒有
/etc/inittab
. 因此,我將兩者都刪除了/init
,/etc/inittab
然後猜猜是什麼 - 核心再次恐慌。- 我試圖
/sbin/init
從我的 shell 中執行,經過幾次猜測,其中包括,exec /sbin/init
我最終以核心恐慌告終。文件系統上存在和不存在 /etc/inittab 的情況。setsid /sbin/init``exec setsid /sbin/init
這是我的
/init
shell腳本的內容:#!/bin/sh dmesg -n 1 mount -t devtmpfs none /dev mount -t proc none /proc mount -t sysfs none /sys setsid cttyhack /bin/sh
在這一點上,我不在乎內容是什麼
/etc/inittab
,只要我有辦法知道那裡的配置確實有效。我嘗試了幾種/etc/inittab
配置,均基於我在此處找到的資訊。我的 /etc/inittab 至少包含這一行:
::sysinit:/bin/sh
再次 - 我最終導致核心恐慌,似乎
/etc/inittab
被忽略了。任何關於如何強制我的小型現場發行版與 BusyBox 一起正常工作的建議
/etc/inittab
都非常感謝!更新:
- 只是為了說清楚 -我目前的shell 腳本無論有沒有. 一切正常,我的控制台執行良好,我沒有遇到任何意想不到的麻煩。正如我上面所描述的,唯一的問題是完全被忽略了。
/init``/etc/inittab``/bin/ash``/etc/inittab
- 我檢查了 3 個不同的實時 Linux 發行版:Slax、Finnix 和 SysResCD。他們都有
/init
,沒有人有/etc/inittab
。此外,這篇 Wiki 文章/sbin/init
總結了我根本沒有援引的懷疑。
好的,我做了很多廣泛的研究,發現出了什麼問題。讓我們一個一個開始:
- 當我們使用
initramfs
引導方案時,核心呼叫的第一個程序是/init
腳本。核心永遠不會嘗試/sbin/init
直接執行。/init
被分配程序標識符 1。這非常重要!- 現在的問題是
/sbin/init
只能以 PID 1 啟動,PID 1
但我們已經/init
以 PID 1 執行。exec /sbin/init
解決辦法是在我們還在裡面的時候執行命令行/init
。這樣,新程序(即/sbin/init
)將從其父程序(/init
PID 為 1)繼承 PID,這就是我們所要做的。我在初始配置中遇到的問題(請參閱問題)是由於我的
/init
腳本所做的最後一件事是生成/bin/sh
分配了全新 PID 的新程序。從這一點來看,/sbin/init
直接從互動式控制台執行是不可能的,因為即使我們執行命令行exec /sbin/init
,我們實現的最好的方法是分配已經分配給 shell 的相同 PID,並且這個 PID 絕對不是 PID 1。長話短說 -
exec /sbin/init
直接從命令行執行,僅此/init
而已。