Linux カーネルは、一種の RAM ディスクを使用して、起動の初期段階でモジュールにアクセスします。好奇心から理解したいのですが、質問があります。initramfs/initrd を含むファイルは、この段階でカーネルからアクセスできる必要があります。これは、カーネルが適切なファイルシステムをサポートしている必要があることを意味します。では、なぜ initramfs の内容を単純なファイルとまったく同じファイルシステムに置くことができなかったのでしょうか?
3 に答える
この段階で、カーネルが initramfs/initrd を含むファイルにアクセスできる必要があります。
これはあなたの混乱の中心のようです: initramfs/initrd を読み取るのはカーネルではなく、ブートローダーです! カーネルは、initramfs/initrd へのアクセス方法を知る必要はありません。それがエクササイズのポイントです!
ブートローダは initramfs/initrd をメモリにロードします。また、ブートローダが initramfs/initrd をロードしたメモリ アドレスをカーネルに伝えることができる、明確に定義された通信プロトコルがあります。
initramfs の場合、initramfs イメージをカーネル イメージに追加することもできます。
まず、ブートローダー(おそらくLILOまたはGrub)がBIOS呼び出しを使用して、ブートドライブからカーネルイメージを読み取ります。次に、システムRAMに配置したばかりのカーネルに制御を渡します。
カーネルは、BIOS呼び出しを使用してディスクにアクセスしません。カーネルが起動すると、システムでデバイスをスキャンし、システム内の各デバイスのデバイスドライバーモジュールをロードし、ルートファイルシステムをマウントして、最初のユーザープロセスを起動します。
しかし、待ってください。カーネルは、ディスクサブシステムのデバイスドライバーモジュールをどのようにロードしましたか?ここには鶏が先か卵が先かという問題があり、ディスクにアクセスして、ディスクにアクセスできるデバイスドライバーを取得する必要があります。
解決策は、これらすべてのドライバーを初期ramdisk(initrd)に配置することです。そのramdiskイメージはブートローダーによって読み取られ、カーネルと一緒にRAMに配置されます。これにより、カーネルはルートファイルシステムに到達するために必要なドライバーのセットを取得します。
これがないと、カーネルに組み込まれているルートファイルシステムにアクセスするために必要なすべてのドライバーが必要になります。
かもね。ブートに initrd イメージは必要ありませんが、ほとんどの場合、initrd イメージが使用されます。ただし、これにより、ファイルシステムにさまざまな設定を行うことができます。たとえば、通常、ext2 以外のファイルシステム (NFS? XFS?) を使用する場合、RAID を使用する場合、ルートファイルシステムを通常とは異なるデバイス (USB ドライブ? Unionfs を使用した CDROM?) でホストする場合は、initrd が必要です。
もちろん、これは適切なファイルシステムまたは RAID ドライバーをカーネルにコンパイルすることで回避できますが、カーネルが大きくなります。