現在、私はLinuxのブートプロセスを学んでいます。ここでは、initrdがカーネル(LVM、NFSなど)に必要なドライバを含む一時ルートファイルシステムを作成することを確認しました。その後、カーネルはドライバを使用し、実際のルートファイルシステムをマウントします。
ここで私の質問は、カーネル自体に必要なドライバが含まれてはならない理由と、カーネルがinitrdに依存する理由は何ですか?
ベストアンサー1
次の質問に対する回答もご覧ください。
1. カーネル自体に必要なドライバが含まれてはならない理由
まず、カーネルメモリは要求時にページングされません。これは循環依存関係になります。メモリが不足しているときにディスクドライバがディスクにページアウトすると、後で再ロードできません。
(そしてLinuxカーネルの内部では、保存パスを含まず、安全に呼び出すことができるいくつかの上位層を定義しようとしません。おそらく可能です。Windowsではそうします。この上位層が何であるかわかりません。おそらく動的に定義します。 WindowsがNFSの交換などの奇妙なアイデアをサポートしていない可能性があります。
代わりにモジュールのロードをサポートします。この特定のマシンにNFSが必要ない場合は、それをマウントする必要はありません。
最新のディストリビューションでは、合計約100MBのRAMが節約されます。 (占有スペースを見てください/lib/modules/$VERSION/
。最新のディストリビューションでは、モジュールはファイルの.xz
ように圧縮されています。)
2.そしてなぜinitrdに依存するのか
initrdを使用する最も明白な理由はカーネルモジュールですが、2番目の側面もあります。
これにより、ユーザースペースは、ルートファイルシステムにアクセスするために任意に複雑なストレージスタックを構築できます。たとえば、DHCP を使用して NFS をサポートする IP アドレスを取得したり、ディスク暗号化パスワードの入力を求められます。
同様に、カーネルはユーザーインターフェイスコードなどの過度の膨張を防ぐことを試みます。
メモリ使用量は唯一の理由です。カーネル/ユーザー空間パーティションは、さまざまな用途に使用されます。たとえば、カーネルはカーネルの問題のみを扱うプロジェクトです。ユーザースペースは何でも構いません。 「一般的な」Linuxディストリビューションでも、Androidオペレーティングシステムなど、まったく別個のプロジェクトにすることもできます。
これは、カーネル+コアユーザースペースを一緒に保持するBSDなどの他のオペレーティングシステムとは異なります。 BSDはこれを説明できますカーネルとユーザー空間での単一フラグのデイ変換による2038問題の処理。