カーネルはルートパーティションをどのようにマウントしますか?

カーネルはルートパーティションをどのようにマウントしますか?

私の質問は、別の/bootパーティションからLinuxシステムを起動することです。ほとんどの構成ファイルが別々の/パーティションにある場合、カーネルは起動時にどのように適切にマウントしますか?

これについての詳細な説明があれば良いでしょう。何か基本的なものが抜けたような感じがします。私が最も重要に考えているのは、作業のプロセスと順序です。

ありがとうございます!

編集:私が尋ねる必要があるのは、ルートカーネルパラメータで使用される開発ファイルについての詳細です。たとえば、ルートパラメータをroot = / dev / sda2と指定したとします。カーネルは/dev/sda2ファイルのマッピングをどのように持っていますか?

ベストアンサー1

古代には、ルートファイルシステムのデバイスメジャー/マイナー番号を知ってカーネルに組み込まれたすべてのデバイスドライバを初期化した後、デバイスをインストールするようにカーネルがハードコーディングされていました。このrdevユーティリティを使用すると、カーネルイメージを再コンパイルしなくても、カーネルイメージのルートデバイス番号を変更できます。

結局、ブートローダが表示され、コマンドラインをカーネルに渡すことができます。引数が渡されると、root=組み込み値ではなくルートファイルシステムがどこにあるかをカーネルに伝えます。アクセスを必要とするドライバはまだカーネルに組み込まれている必要があります。引数はディレクトリの通常のデバイスノードのように見えますが、ルートfsがマウントされる前には明らかにディレクトリが/devないので、カーネルはそこに開発ノードを見つけることができません。/dev代わりに、よく知られている特定のデバイス名がカーネルにハードコーディングされ、文字列がデバイス番号に変換される可能性があります。したがって、カーネルはそのようなものを認識できますが、ボリュームUUIDなどのよりエキゾチックなものは認識/dev/sda1できません。/dev/mapper/vg0-root

後でinitrd写真に登場します。ブートローダは、initrd一種の圧縮ファイルシステムイメージであるカーネルと共にイメージをロードします(gzipで圧縮されたext2イメージ、gzipで圧縮されたromfsイメージ、squashfsが最終的に支配的です)。カーネルはこのイメージをRAMディスクに解凍し、RAMディスクをルートfsとしてマウントします。画像には、実際のものよりもいくつかの追加のドライバと起動スクリプトが含まれていますinit。これらのブートスクリプトは、ハードウェアを識別し、RAIDアレイやLVMなどのエントリをアクティブにし、UUIDを検出し、実際のルートディレクトリを見つけるためにカーネルコマンドラインを解析するなど、さまざまなタスクを実行します。これで、UUID、ボリュームラベル、その他の高度なコンテンツを介してルートディレクトリを指定できるようになりました。次に、実際のルートファイルシステムをここにマウントし、システムコールを実行して/initrdカーネルpivot_rootを交換し、/実際のルートでexecを実行し、RAMディスクをアンマウントして解放します。/initrd/sbin/init/initrd

最後に、今日私たちはこれを持っていますinitramfs。これは似ていますinitrdが、RAMディスクにロードされた圧縮ファイルシステムイメージの代わりに圧縮されたcpioアーカイブです。 tmpfsをrootとしてマウントし、そこにアーカイブを抽出します。pivot_rootダーティハッキングと見なされるものを使用する代わりに、ブートスクリプトはinitramfs実際のルートディレクトリをマウントし、/roottmpfsルートディレクトリ内のすべてのファイルを削除してから、chroot段階的に実行/rootして実行します/sbin/init

おすすめ記事