私の理解では、initramfsは「実際の」ルートファイルシステムをロードする責任があります。
ここで、ルートを定義する場所が2つあります。まず、/etc/fstab
にエントリを配置します。次に、デバイスをカーネルブートコマンドに配置します。 root=/dev/sda1
。
Initramfsがルートファイルシステムの場所を決定するために使用するのはどれですか?ルートカーネルパラメータを使用する場合、/etc/fstab
にエントリがあるのはなぜですか? 2番目のオプション(/etc/fstab
を読み取る)は、initramfsが最初にマウントしようとしているルートデバイスそのものに/etc/fstab
ファイルがあるため、非常に非論理的です。
非常に紛らわしいもの。
あなたが述べたように、initramfsの目的は「実際の」ルートファイルシステムをマウントすることです(他のこともできますが、これは一般的なタスクです)。
Initramfsがない場合、カーネルは通常、パーティションを読み取り専用としてマウントし、制御を/sbin/init
に渡します。 initramfsは、通常、ルートファイルシステムが通常のパーティション(mdraid、lvm、暗号化など)でない場合、カーネルからこのタスクを引き継ぎます。
これで、initramfsのバックグラウンドは別として、/etc/fstab
はルートファイルシステムにあります。そのため、initramfsを起動しても、そのルートファイルシステムは存在しないため、fstabに到達できません(鶏と卵の問題)。
代わりに、使用するinitramfsのカーネルブート引数にパラメーターを渡す必要があります。通常、これはroot=/dev/sdX
のようなものです。ただし、ルートデバイスがどこにあるかを自動的に把握するために何かを行う場合もあるため、パラメーターはまったくありません。これは単なるソフトウェア(通常はスクリプト)なので、ルートデバイスをマウントするために必要なことは何でも実行できます。
これで、前述のように、カーネルは実際のルートを読み取り専用としてマウントします。 initramfsはまさにこれを行うべきです。 initramfsが完了すると、システムはinitramfsがまったくなかったかのようにブートを続行し、/sbin/init
が起動します。次に、このinitはすべての通常のブートスクリプトを開始します。/etc/fstab
を読み取り、ルートを読み取り/書き込みに切り替え、他のすべてのファイルシステムをマウントするのは、これらのスクリプトの1つの仕事です。
それはそうかもしれないし、そうでないかもしれません。 Initramfsはさまざまな方法で構築できるため(カーネルはそれをロードして、何でも実行する/init
を実行します)。ただし、パラメータを使用する方が一般的です。これにより、柔軟性が高まります。つまり、何かが変更された場合でも、ブートエントリを編集するだけで、問題なく機能します。組み込みのハードコードされたルートでは、これは必ずしも可能ではありません。
Fstabエントリは、マウントオプション(移動中に変更できるものもあります)やfsck
順序など、他の項目も決定するため、どちらの方法でも必要になる場合があります。また、それが完全に不必要だったとしても(そして、Initramfsがそれを処理する場合、それがなくても機能する可能性があります)、完全を期すために、そこにエントリを保持します。
/ etc/fstabを静的マウントと見なすことができます。これは、そのようなタスクを実行する唯一の方法ですが、実際には、mountコマンドを実行するだけではなく、fstabで欠落している多くのファイルシステムが表示されます。 udevやudiskなどのサービスは、/ etc/fstabファイルを無視して「自動マウント」の多くを管理します...
したがって、何かがマウントされているか、または頻繁にマウントされていない場合は、/ etc/fstabとは関係ありません。
initramfsは、「真の」rootfsがマウントされるまでのブートプロセス中に使用される一時的なrootfsにすぎません。