init 程序可以是 Linux 中的 shell 腳本嗎?
我正在閱讀有關設置自定義 initramfs 的教程,其中指出:
唯一缺少的是 /init,它是 initramfs 根目錄中的執行檔,一旦載入就會由核心執行。因為 sys-apps/busybox 包含一個功能齊全的 shell,這意味著您可以將 /init 二進製文件編寫為一個簡單的 shell 腳本(而不是將它變成一個用彙程式序或 C 編寫的複雜應用程序,您必須編譯)。
並給出了一個 init 作為 shell 腳本的例子,它以
#!/bin/busybox sh
到目前為止,我的印像是 init 是啟動的主要程序,而所有其他使用者空間程序最終都是 init 的子程序。但是,在給定的範例中,第一個程序實際上是
bin/busybox/ sh
從中產生後來的 init 的。這是一個正確的解釋嗎?例如,如果我當時有可用的解釋器,我可以將 init 編寫為 Python 腳本等嗎?
init 不是“產生”(作為子程序),而是
exec
’d like this:# Boot the real thing. exec switch_root /mnt/root /sbin/init
exec
替換整個過程。最終的 init 仍然是第一個程序 (pid 1),即使它在 Initramfs 中的那些之前。Initramfs
/init
是一個 pid 為 1 的 Busybox shell 腳本,exec
轉為 Busyboxswitch_root
(所以現在switch_root
是 pid 1);該程序會更改您的掛載點,因此/mnt/root
將是新的/
.
switch_root
然後exec
是/sbin/init
你真正的根文件系統;因此,它使您的真正的 init 系統成為 pid 1 的第一個程序,這反過來又可能產生任意數量的子程序。當然,如果您設法將 Python 嵌入到您的 Initramfs 中,也可以使用 Python 腳本來完成。儘管如果您不打算包含busybox,您將不得不煞費苦心地重新實現它的一些功能(例如
switch_root
,以及您通常使用簡單命令執行的所有其他操作)。但是,它不適用於不允許腳本二進製文件 (
CONFIG_BINFMT_SCRIPT=y
) 的核心,或者在這種情況下,您必須直接啟動解釋器並讓它以某種方式載入您的腳本。