すべてのカーネル引数は本当にカーネルによって使用されていますか?


11

Linuxが「init = / bin / bash」を許可するのはなぜですか?

私はこれを読んだ、答えはそれがこのinitプログラムを実行しているカーネルだと言っている。

それから私は不思議に思い始めました、Linuxには通常initramfsが付属しています。では、このinit議論はどういう意味ですか?initramfsのパス?または、私が推測したように、実際のinitを実行するために、カーネルではなくinitramfsのinitによって読み取られます。

また、root=UUID=xxxx引数は、実際のルートファイルシステムを見つけるために、カーネルによって読み取られたか、initramfsのinitによって読み取られただけですか?

必要な引数をカーネル引数として渡すことができるようですが、それらはすべてカーネルによって読み取られますか、それとも少なくとも一部はユーザー空間プログラムでのみ意味がありますか?

回答:


18

カーネルコマンドラインで渡されるパラメーターは、カーネルにとって意味がある必要はありません。カーネルパラメーターのドキュメントには、

カーネルは、カーネルコマンドラインから「-」までのパラメーターを解析します。パラメータを認識せず、 '。'が含まれていない場合、パラメータはinitに渡されます。 '='のパラメータはinitの環境に入り、その他はinitのコマンドライン引数として渡されます。「-」以降はすべて、initの引数として渡されます。

これはには適用されませんinitし、root実際にカーネルパラメータであり、カーネルによって処理されています。それらはに表示されるため、ユーザー空間によっても動作でき/proc/cmdlineます。(したがって、たとえばsystemdはquietカーネルパラメータを考慮に入れて出力を減らします。)

カーネルがinitramfsで起動れた場合、パラメーターはカーネルによって直接使用さrootず、パラメーターは失敗した場合にのみ使用されます。起動はで処理され、次のように機能します。initrdinitinitkernel_init

  • アクセス可能な「ramdisk executeコマンド」(rdinitカーネルコマンドラインで指定された値、または/init)がある場合、カーネルはそれを実行しようとします。
  • それが失敗し、「実行コマンド」(initカーネルコマンドラインで指定された値)がある場合、カーネルはそれを実行しようとし、実行できない場合はパニックになります。
  • 最後の手段として、カーネルが実行しようと/sbin/init/etc/init/bin/init、と/bin/sh。これらのどれも実行できない場合、パニックになります。

initramfsがある場合、これはすべてそこで発生し、ターゲットボリュームはカーネルによってマウントされません。カーネルが最初のプログラム(通常、initramfs内のスクリプト)を実行した後に何が起こるかは、カーネルではなくプログラム次第です。渡されない引数は、ファイルシステムがマウントされている場合でも使用できます。init/initinit/proc/cmdline/proc


また、少し興味があります。init-in-the-initramfsがset-uid-non-rootファイルの場合はどうなりますか?実行可能ビットのないファイル?とにかくルートとして実行されますか?ELFが壊れている、またはELFが見つからない、ld-linux.soまたは再帰が深すぎるスクリプトなど、実行できないものがある場合はどうなりますか?
爆鱼芋条德里克

3
カーネルがinitramfsから "init ="で指定されたプログラムをロードしないと確信しています。initramfsが使用されている場合、ユーザー指定のinitプログラムが実行される前に、通常どおりに実行されているように見えます(これを実行するのがカーネルか、initramfs内のコードかはわかりません)。
プラグウォッシュ

@爆鱼芋条德里克/initramdiskから起動するときの代わりに代替プログラムを指定するには、rdinit=/path/to起動パラメーターを使用できます。
pizdelect

3

カスタムカーネル引数を渡すことは、KickStartインストール中にシステムをカスタマイズする1つの方法です。たとえば、PXEサーバーは次のように設定できます。

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

どこlabその後、他のシステムのビルド用には別のことを行うためにキックスタート設定で使用されます。

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

ここでは、他のシステムタイプで使用されているものとは異なるファイルシステムレイアウトをセットアップします。関連する単一の名前空間が与えられている場合、ローカルのカスタマイズにはカーネルで使用されるラベルとは異なるラベルが使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.