Linux

init 程序可以是 Linux 中的 shell 腳本嗎?

  • July 19, 2018

我正在閱讀有關設置自定義 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轉為 Busybox switch_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) 的核心,或者在這種情況下,您必須直接啟動解釋器並讓它以某種方式載入您的腳本。

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