Linuxで「init = / bin / bash」を許可するのはなぜですか?
私はこの記事を読んで、答えはこの初期化プログラムを実行するカーネルであると言います。
その後、Linuxには通常、実際のルートファイルシステムにマウントし、ピボットルートをマウントするinitramfsが含まれていると考え始めました。それでは、このinit
主張はどういう意味ですか? initramfsのパス?あるいは、私が推測したように、カーネルが読み取らずに実際のinitを実行するinit initramfsが読み込みます。
また、root=UUID=xxxx
実際のルートファイルシステムを見つけるために実際にカーネルから読んでいるのか、それともinitramfsのinitで読んでいるのかについての議論もあります。
私が望むすべてのパラメータをカーネルパラメータとして渡すことができるようです。それでは、カーネルパラメータはすべて読み込まれますか、それとも少なくとも一部はユーザースペースプログラムにのみ意味がありますか?
答え1
カーネルコマンドラインに渡された引数は、カーネルに意味がある必要はありません。カーネルパラメータ文書説明する
カーネルはカーネルコマンドラインの引数を「--」に解析します。引数が認識されず、「.」が含まれていない場合、引数はinitに渡されます。 "="を持つ引数はinit環境に移動し、他の引数はコマンドラインパラメータとしてinitに渡されます。 "--"以降の内容はすべてinitにパラメータとして渡されます。
init
これは適用されず、root
実際にはカーネルパラメータであり、カーネルによって処理されます。に示すように、ユーザースペースで操作することもできます/proc/cmdline
。 (たとえば、systemdはquiet
出力を減らすためにカーネルパラメータを考慮します。)
initramfsを使用してカーネルを起動するとき、このパラメータroot
は使用されるカーネルによって直接呼び出され、init
失敗時にのみ使用されます。次から処理を開始rdinit
init
kernel_init
、動作原理は次のとおりです。
rdinit
アクセス可能な「ramdisk実行コマンド」(カーネルコマンドラインに指定された値または/init
)がある場合、カーネルはコマンドの実行を試みます。- 失敗し、「実行コマンド」(カーネルコマンドラインに指定された値
init
)がある場合、カーネルはそれを実行しようとし、実行できない場合はパニック状態になります。 - 最後の手段としてカーネルは、 、 、 と が
/sbin/init
実行/etc/init
さ/bin/init
れ/bin/sh
なければ実行を試みます。パニック。
initramfsがあると、これはすべて起こり、ターゲットボリュームはカーネルによってマウントされません。どうしたの?後ろにカーネルが実行する最初のプログラムinit
(通常/init
initramfs のスクリプト) は、カーネルではなくプログラムによって決定されます。ファイルシステムがマウントされている場合は、渡されていない引数を引き続きinit
使用できます。/proc/cmdline
/proc
答え2
カスタムカーネルパラメータを渡すことは、KickStartのインストール中にシステムをカスタマイズする1つの方法です。たとえば、PXEサーバーを設定できます。
linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0
次に、KickStart設定のwhereを使用して、lab
他のシステムビルドとは異なる操作を実行します。
%pre
...
case " $(cat /proc/cmdline)" in
...
*\ lab*)
filesystems_lab
;;
*)
filesystems_common
;;
...
ここでは、異なるシステムタイプと異なるファイルシステムレイアウトが設定されます。関連する単一の名前空間を考慮すると、ローカルカスタマイズはカーネルが使用するものとは異なるラベルを使用すると予想されます。