誰かが以下で何が起こっているのか説明できますか?
# This is a very simple, default initramfs
dir /dev 0755 0 0
nod /dev/console 0600 0 0 c 5 1
nod /dev/tty 0666 0 0 c 5 0
nod /dev/null 0600 0 0 c 1 3
nod /dev/mem 0600 0 0 c 1 1
nod /dev/kmem 0600 0 0 c 1 2
nod /dev/zero 0600 0 0 c 1 5
nod /dev/random 0600 0 0 c 1 8
nod /dev/urandom 0600 0 0 c 1 9
dir /dev/pts 0755 0 0
nod /dev/ptmx 0666 0 0 c 5 2
nod /dev/ttyS0 0666 0 0 c 4 64
nod /dev/ttyS1 0666 0 0 c 4 65
nod /dev/ttyS2 0666 0 0 c 4 66
dir /bin 755 0 0
dir /proc 755 0 0
file /bin/hello ${INSTALL_ROOT}/projects/${SAMPLE}/hello/hello 755 0 0
slink /bin/init hello 777 0 0
ここで私たちが実際に達成しようとしているものは何ですか?
これは次のようになります。これ
通常、私たちはinit(コードの最後の行)で(hello)を実行しようとしていることは明らかです。
答え1
このファイルは、カーネルソースツリーの gen_init_cpio プログラムの入力ファイルです。
次に適切なcpioアーカイブを作成します。ファイルシステムの初期化ファイル/ディレクトリ/デバイス(=ノード)/...入力ファイルに一覧表示されます。
構文は次のとおりです。
file <name> <location> <mode> <uid> <gid> [<hard links>]
dir <name> <mode> <uid> <gid>\n
nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>
slink <name> <target> <mode> <uid> <gid>
など。
init
起動時に実際に実行されるプログラムは、initramfsのプログラムによって異なります。ここのプログラムinit
はシンボリックリンク到着するhello
。
答え2
@jofelはこの質問に驚くほど正確に答えました。しかし、実装する必要があるのはカーネル空間からユーザー空間への移行です。カーネルがロードされたら、すべてのシステムが実行できることを確認し、起動しない場合はinit.
起動するシステムを見つけますinit
。つまり、システムと対話できなくなります。
数年前、カーネル開発者は、1001年とさまざまなルートデバイス構成をサポートするのに疲れたと判断しました。可能なルートファイルシステムとルートデバイスタイプの組み合わせの数が多すぎるため、コンピュータの起動処理が複雑すぎます。だから彼らは努力をあきらめた。
Initramfs
2.6以降、すべてのLinuxカーネルに組み込まれました。すべての場合において、その時点からユーザー空間はそこから始まります。カーネルはコンピュータシステムの制御を引き継いだ後、init
静かに座って花火を見て、イベント全体を無視します。
あなたの質問のファイルに記載されているディレクトリツリーは、カーネル自体のLinuxルートディレクトリにコンパイルされます。カーネルが他のすべてを見つけるために努力する唯一のルートデバイスです。init.