Linux

帶有核心和 BusyBox 的最小 Linux:/etc/inittab 被忽略,僅 /init 被執行

  • December 2, 2017

我設法創建了一個小型且功能齊全的實時 Linux CD,其中僅包含核心(使用預設選項編譯)和 BusyBox(使用預設選項 + 靜態編譯,所有小程序都存在,包括/sbin/init)。我創建initrd和填充沒有問題/dev/proc而且/sys我的/initshell 腳本也沒有任何問題。

最近我讀到 BusyBox 支持/etc/inittab配置(至少在某種程度上),我非常想做以下任何一項:

  • 忘記我的/initshell 腳本,完全依賴/etc/inittab配置。
  • 同時使用/initshell 腳本和/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

這是我的/initshell腳本的內容:

#!/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)將從其父程序( /initPID 為 1)繼承 PID,這就是我們所要做的。

我在初始配置中遇到的問題(請參閱問題)是由於我的/init腳本所做的最後一件事是生成/bin/sh分配了全新 PID 的新程序。從這一點來看,/sbin/init直接從互動式控制台執行是不可能的,因為即使我們執行命令行exec /sbin/init,我們實現的最好的方法是分配已經分配給 shell 的相同 PID,並且這個 PID 絕對不是 PID 1。

長話短說 -exec /sbin/init直接從命令行執行,僅此/init而已。

引用自:https://unix.stackexchange.com/questions/146284