古代では、カーネルはデバイスのメジャー/マイナー番号を知るためにハードコードされ、カーネルに組み込まれたすべてのデバイスドライバーを初期化した後にそのデバイスをマウントしていました。このrdev
ユーティリティを使用すると、カーネルイメージのルートデバイス番号を再コンパイルせずに変更できます。
最終的にブートローダーが登場し、コマンドラインをカーネルに渡すことができました。root=
引数が渡された場合、それはカーネルに組み込み値の代わりにルートfsがある場所を伝えました。ドライバーは、それにアクセスする必要があり、カーネルにまだ組み込まれていなければなりませんでした。引数は/dev
ディレクトリ内の通常のデバイスノードのように見えますが、明らかに/dev
ルートfsがマウントされる前にディレクトリがないため、カーネルはそこでdevノードを検索できません。代わりに、特定のよく知られているデバイス名がカーネルにハードコードされているため、文字列をデバイス番号に変換できます。このため、カーネルはなどのようなものを認識できますが、ボリュームUUID /dev/sda1
などのよりエキゾチックなものは認識できません/dev/mapper/vg0-root
。
後で、initrd
写真に入ってきました。カーネルとともに、ブートローダーはinitrd
イメージをロードします。イメージは、何らかの圧縮ファイルシステムイメージです(gzip圧縮されたext2イメージ、gzip圧縮されたromfsイメージ、squashfsが最終的に支配的になりました)。カーネルはこのイメージをRAMディスクに解凍し、RAMディスクをルートfsとしてマウントします。このイメージには、実際のの代わりにいくつかの追加のドライバーとブートスクリプトが含まれていましたinit
。これらのブートスクリプトは、ハードウェアを認識し、RAIDアレイやLVMなどをアクティブにし、UUIDを検出し、カーネルコマンドラインを解析して実際のルートを見つけるためのさまざまなタスクを実行しました。次に、実際のルートfsをマウントし/initrd
、pivot_root
システムコールを実行してカーネルをスワップし/
、/initrd
、次に/sbin/init
実際のルートでexec を実行する/initrd
と、ramdiskがアンマウントされて解放されます。
最後に、今日はがありinitramfs
ます。これはに似ていinitrd
ますが、ramdiskにロードされる圧縮ファイルシステムイメージではなく、圧縮されたcpioアーカイブです。tmpfsがルートとしてマウントされ、アーカイブがそこに抽出されます。pivot_root
ダーティハックと見なされていたを使用する代わりに、initramfs
ブートスクリプトは実際のルートをにマウント/root
し、tmpfsルート内のすべてのファイルを削除chroot
して/root
から、にexecし/sbin/init
ます。