私の質問は、別の/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
実際のルートディレクトリをマウントし、/root
tmpfsルートディレクトリ内のすべてのファイルを削除してから、chroot
段階的に実行/root
して実行します/sbin/init
。