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