私は、カスタムinitramfsのセットアップに関するチュートリアルを行っていました。
欠落しているのは/ initだけです。これは、initramfsのルートにある実行可能ファイルで、ロードされるとカーネルによって実行されます。sys-apps / busyboxには完全に機能するシェルが含まれているため、これは/ initバイナリを単純なシェルスクリプトとして記述できることを意味します(コンパイルする必要があるAssemblerまたはCで記述された複雑なアプリケーションにする代わりに)。
で始まるシェルスクリプトとしてのinitの例を示します #!/bin/busybox sh
これまでのところ、initが起動されるメインプロセスであり、他のすべてのユーザースペースプロセスは最終的にinitの子であるという印象を受けました。ただし、指定された例では、最初のプロセスは実際にbin/busybox/ sh
は、後のinitが生成されるプロセスです。
これは正しい解釈ですか?たとえば、その時点で利用可能なインタプリタがあれば、Pythonスクリプトなどとしてinitを記述できますか?
initは(子プロセスとして)「生成」されるのではなく、次exec
のようになります。
# Boot the real thing.
exec switch_root /mnt/root /sbin/init
exec
プロセス全体を適切に置き換えます。最後のinitは、Initramfsのプロセスに先行していても、まだ最初のプロセス(pid 1)です。
Initramfs/init
は、pid 1を使用するBusyboxシェルスクリプトであり、Busyboxに送信さexec
れます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
)を許可しないカーネルでは機能しません。そのような場合は、インタープリターを直接起動して、何らかの方法でスクリプトをロードする必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加