web-dev-qa-db-ja.com

initramfsは/ etc / fstabを使用しますか?

私の理解では、initramfsは「実際の」ルートファイルシステムをロードする責任があります。

ここで、ルートを定義する場所が2つあります。まず、/etc/fstabにエントリを配置します。次に、デバイスをカーネルブートコマンドに配置します。 root=/dev/sda1

Initramfsがルートファイルシステムの場所を決定するために使用するのはどれですか?ルートカーネルパラメータを使用する場合、/etc/fstabにエントリがあるのはなぜですか? 2番目のオプション(/etc/fstabを読み取る)は、initramfsが最初にマウントしようとしているルートデバイスそのものに/etc/fstabファイルがあるため、非常に非論理的です。

非常に紛らわしいもの。

20
Ahmed Ghonim

あなたが述べたように、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つの仕事です。

15
Patrick

それはそうかもしれないし、そうでないかもしれません。 Initramfsはさまざまな方法で構築できるため(カーネルはそれをロードして、何でも実行する/initを実行します)。ただし、パラメータを使用する方が一般的です。これにより、柔軟性が高まります。つまり、何かが変更された場合でも、ブートエントリを編集するだけで、問題なく機能します。組み込みのハードコードされたルートでは、これは必ずしも可能ではありません。

Fstabエントリは、マウントオプション(移動中に変更できるものもあります)やfsck順序など、他の項目も決定するため、どちらの方法でも必要になる場合があります。また、それが完全に不必要だったとしても(そして、Initramfsがそれを処理する場合、それがなくても機能する可能性があります)、完全を期すために、そこにエントリを保持します。

2
frostschutz

/ etc/fstabを静的マウントと見なすことができます。これは、そのようなタスクを実行する唯一の方法ですが、実際には、mountコマンドを実行するだけではなく、fstabで欠落している多くのファイルシステムが表示されます。 udevやudiskなどのサービスは、/ etc/fstabファイルを無視して「自動マウント」の多くを管理します...

したがって、何かがマウントされているか、または頻繁にマウントされていない場合は、/ etc/fstabとは関係ありません。

initramfsは、「真の」rootfsがマウントされるまでのブートプロセス中に使用される一時的なrootfsにすぎません。

1
sebelk