Linuxでのブートプロセスを勉強しています。「RAMはフロッピーディスクより数桁速いので、システム操作はRAMディスクの方が速い」という文に出くわしました。
とにかく、カーネルはルートファイルシステムを RAM にロードして実行します。では、カーネルがルート ファイル システムを RAM にロードする場合、なぜルート ファイルシステムをロードするために ramdisk が必要なのでしょうか?
SUSE Linuxのドキュメントには、Linux が RAM ディスクで起動される理由がよく説明されています。
Linux カーネルが起動し、ルート ファイル システム (/) がマウントされるとすぐに、プログラムを実行し、さらにカーネル モジュールを統合して追加機能を提供できます。ルート ファイル システムをマウントするには、特定の条件を満たす必要があります。カーネルは、ルート ファイル システムが配置されているデバイス(特に SCSI ドライバー)にアクセスするために、対応するドライバーを必要とします。カーネルには、ファイル システム(ext2、reiserfs、romfs など)を読み取るために必要なコードも含まれている必要があります。ルート ファイル システムがすでに暗号化されていることも考えられます。この場合、ファイルシステムをマウントするにはパスワードが必要です。
SCSI ドライバーの問題については、さまざまな解決策が考えられます。カーネルには考えられるすべてのドライバーを含めることができますが、異なるドライバーが互いに競合する可能性があるため、これは問題になる可能性があります。また、これによりカーネルが非常に大きくなります。もう 1 つの可能性は、それぞれが 1 つまたは少数の SCSI ドライバーを含む、異なるカーネルを提供することです。この方法には、多数の異なるカーネルが必要であるという問題があり、異なる最適化されたカーネル (Athlon 最適化、SMP) によって問題が増加します。 SCSI ドライバーをモジュールとしてロードするという考えは、最初の ramdisk の概念によって解決される一般的な問題 (ルート ファイル システムがマウントされる前でもユーザー空間プログラムを実行する) につながります。
これにより、ルートファイルシステムが配置されているデバイスにアクセスできるようになるまでルートファイルシステムをロードできず、ルートファイルシステムがロードされるまでそのデバイスにアクセスできないという潜在的なニワトリが先か卵が先かという状況が回避されます。
初期 RAM ディスク(initdisk または initrd とも呼ばれます)は、上記の問題を正確に解決します。Linux カーネルには、実際のルート ファイル システムがマウントされる前に、小さなファイル システムを RAM ディスクにロードし、そこでプログラムを実行するオプションがあります。initrd のロードは、ブートローダー (GRUB、LILO など) によって処理されます。ブート ローダーは、ブート メディアからデータをロードするための BIOS ルーチンのみを必要とします。ブートローダーがカーネルをロードできる場合、初期 RAM ディスクもロードできます。特別なドライバーは必要ありません。
もちろん、ブート プロセスを実行するために RAMDisk が厳密に必要というわけではありません。たとえば、必要なすべてのハードウェア ドライバーと起動時に読み込まれるモジュールを含むカーネルをコンパイルできます。しかし、どうやらこれはほとんどの人にとって大変な作業であり、RAMDisk はよりシンプルでスケーラブルなソリューションであることが証明されました。
ほとんどの Linux ディストリビューションが起動時に ramfs (initramfs) を使用する理由は、その内容がカーネル ファイルに含まれるか、ブートローダーによって提供される可能性があるためです。したがって、カーネルがどこかからロードする必要がなく、ブート時にすぐに利用できます。
これにより、カーネルは、デバイスの構成、モジュールのロード、すべてのファイルシステムを含む気の利いた RAID アレイのセットアップ、暗号化されたルートファイルシステムへのパスワードをユーザーに要求するなどのユーザー空間プログラムを実行できます。
この構成が完了すると、最初のスクリプトが exec()s /sbin/init (現在構成済みで使用可能な) ルート ファイルシステムから呼び出されます。
ディスク コントローラと rootfs のドライバ自体が、カーネル イメージに含まれるのではなく、initramfs のモジュールを介してロードされるシステムをかなり多く見てきました。
ブートするのに initramfs は厳密には必要ありません。カーネル イメージに rootfs にアクセスするために必要なすべてのドライバーが含まれていて、それをマウントするために特別な構成やユーザー入力 (RAID アレイや暗号化されたファイルシステムなど) が必要ない場合は、多くの場合、それが可能です。 rootfs から /sbin/init を直接起動します。
以下も参照してください。
http://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
http://www.kernel.org/doc/Documentation/initrd.txt
補足として、一部のシステム (レスキュー ディスク、組み込みなど) は、実際のルート ファイルシステムが削除される可能性があるか、書き込み可能でないメディア (CD、フラッシュ MTD など) にある場合、ルート ファイルシステムとして ramfs を使用する場合があります。