web-dev-qa-db-ja.com

Initrd / Initramfsを使用する代わりに、カーネル自体にファイルシステムドライバーを含めないのはなぜですか?

Linuxカーネルには、ほとんどのデバイスで起動するために必要な最小限のコードが含まれていますが、Initrd/Initramfsを使用する意味がありません。
私が理解している限り、Initrd/Initramfsの仕事は、ルートファイルシステムを実際にロードするためのファイルシステムドライバーを一時的に提供することです。
この場合は、必要なファイルシステムドライバーをカーネル自体に追加するだけではどうでしょうか。
最終的にカーネルとInitrd/Initramfsの両方をロードする必要があるので、両方が同じ量のメモリを使用するため、両方を1つのイメージファイルに統合しないのはなぜですか。


*******更新******

1。 Linuxカーネルを実際に構成するものは何ですか?それは、vmlinuzイメージ(約5〜6 MB)だけですか、それともロード可能なモジュール、vmlinuzイメージ、initrdファイルおよびその他のコンポーネントのコレクションです。
2。カーネルイメージvmlinuzのサイズ(約5〜6MB)がinitrdファイルのサイズ(約18MB)よりも小さいのはなぜですか。カーネルには、ファイルシステムをマウントするためのコードだけが含まれているinitrdと比較して、他の多くのもののコードが含まれています。

2
Shivam Aggarwal

まず、それはファイルシステムドライバだけではありません。また、ファイルシステムが存在するストレージデバイスのドライバーでもあります。また、LVM、暗号化などを使用している場合は、さらに多くの可能性があります。

とにかく、それらをカーネルに組み込むことは間違いなく可能です。私は、slackwareには少なくとも「huge」という名前のカーネルの選択肢があることを知っています。これはまさにそれを実行し、一般的なPCハードウェアのinitramfsを必要としません。

欠点は、そのようなカーネルには、rootとして使用される可能性のあるすべてのファイルシステム、そのファイルシステムを保持する可能性のあるもののデバイスドライバーなど、誰もが必要とする可能性のあるすべてのものが含まれている必要があることです。未使用のコードの量とメモリを浪費します。

カーネルモジュールとしてのみ構築できるドライバーもいくつかあると思いますが、それは実際の技術的な制限よりも設計上の選択です。

編集への回答:

  1. それはおそらくあなたが誰にどのような文脈で尋ねるかによるでしょう。私にとって、それはカーネル空間で実行されるすべてのものであり、すべてのドライバーが含まれます。カーネル開発者は、異なる部分にさらに多くの名前を付けた異なるビューを持っている可能性があります。

  2. 実際、カーネルコードの大部分は、ロード可能なモジュールとドライバーです。それらのいくつかはかなり大きいです。私のシステムでは、btrfsだけで500kB圧縮されています。 NFSはほぼ同じ大きさです。 ext4は300kBです。サポートされているストレージデバイスも膨大な数あり、ルートファイルシステムを取得するためにそれらのいずれかが必要になる場合があります。 Linuxシステムで/lib/modules/*/kernel/drivers/を参照するだけで、表示されます。

2
Olivier

それはちょっとした鶏が先か卵が先かという問題です...多くのドライバーをモジュールにすることができます(そして通常はそうすべきです)。カーネルを無駄なく保ち、メモリを節約します(モジュールが必要になるまで)。ただし、do必要なsomeカーネルに組み込まれたドライバー-特に、起動元のデバイス(CD-ROMドライブ、HDDなど)、使用するファイルシステム(例:iso9660、ext4、...)、およびこれをサポートするために必要な追加のドライバー(例:USBサポート、SCSIサポートなど)。 しないの場合、カーネルは追加のドライバーのモジュールが存在するメディアとファイルシステムにアクセスできないため、それらをカーネルにロードできません。

自分のシステム用にカスタマイズされたカーネルを作成する場合(使用しているハードウェア(HDDタイプ、DVDドライブタイプなど)が事前にわかっている場合)、これは問題ではありません。実際に入手したもの、または必要と思われるもののドライバーが必要です。また、起動時に必要なドライバーをカーネルに含めるだけで済みます。

ただし、ディストリビューションのインストールディスクを作成する場合は、すべて可能ハードウェアユーザーが遭遇する可能性のあるドライバーを含める必要があります。それらすべてをカーネルに含めると、カーネルが絶望的に​​肥大化し、ローエンドシステムでは時間がかかりすぎますRAM。モジュールが必要になる可能性があるため、すべてのドライバーモジュールを作成しても機能しません。解決策はinitrdです!

initrdは、起動時にメモリにロードされるRAMディスクのイメージです。必要になる可能性のあるすべてのドライバーは、これをモジュールとして使用します。カーネルにDVDの読み取り、DVDのファイルシステムの読み取り、およびRAMディスクの読み取り用のドライバーが含まれている限り。 initrdからドライバーモジュールにオンデマンドでアクセスしてロードできるようになります。これにより、ディストリビューションを作成してカーネルを小さくし、実行する可能性のあるすべてのハードウェアのドライバーを含めるという問題が解決されます。

ほとんどのユーザーは、ハードドライブにLinuxをインストールした後もinitrd-bootを使い続けるでしょう...実際に入手したハードウェア用にカスタマイズされたカスタムカーネル(おそらく追加のカーネルモジュールを使用)を構築できるため、これは実際には必要ありません。最初にinitrdをロードする2段階のプロセスでは、起動時に少し余分な時間がかかります。

2
Baard Kopperud