Bootintプロセス中に、初期RAMディスクにinit
スクリプトがあります。最後の操作では、次のように表示されます。
# Chain to real filesystem
exec run-init ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."
Ramdiskコンテンツ内のすべてのスクリプトを検索しますが、そのようなファイル名や関数名が見つかりません。実際にrun-init
とは何ですか?
run-init
はバイナリ実行可能ファイルで、/ usr/lib/klibc/bin/run-initとinitramfsにあり、提供されますUbuntuのklibc-utils
パッケージ。これはスクリプトではないため、内部を直接確認することはできません。apt source klibc-utils
を実行するか、 https://git.kernel.org/でアップストリームリポジトリを参照することで、ソースコードをチェックアウトできます。 cgit/libs/klibc/klibc.git 。
したがって、メイン関数は run-init.c にありますが、これはrun_init
関数の単なるラッパーであり、ここに runinitlib.c に存在します
run_init
は多くの作業を行います:
依存関係があるため、このすべての作業をスクリプトで行うのは非常に複雑になると思いますが、バイナリ実行可能ファイルで非常に簡単にできます。
dpkg-query
によれば、それはklibc-utils
パッケージの一部です。ソースコードを掘り下げると、execv
を呼び出して、実際のファイルシステムでinitプロセスを開始することがわかります。それに失敗すると、run-init
が返され、最終行でpanic
がトリガーされます。
Ubuntu 14.04LTS空のフォルダーにファイルを作成[get-it.sh]
#!/bin/sh
cp /boot/initrd* initrd.cpio.gz
mkdir initrd
cd initrd
zcat ../initrd.cpio.gz | cpio -di
find | grep run-init
cd ..
実行します:bash get-it.sh
ファイルrun-initは./bin/run-initにあります
また、インストールCDからinitrdを取得できます