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

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

私の質問は、別の/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

答え2

Linuxは元々ブートのためにRAMディスク(initrd「INITial RamDisk」と呼ばれる)を使用しました/。このディスクには、実際のルートパーティション(必要なドライバとファイルシステムモジュールを含む)を見つけるのに十分なスペースがあります。の一時マウントポイントにルートパーティションをマウントし、実際のルートファイルシステムが存在する間に編集する場所になるようにルートと一時マウントポイントを交換するようにinitrd呼び出します。pivot_root(8)initrdumount/

答え3

/ etcの設定ファイルにアクセスせずに、カーネルがどのパーティションがルートパーティションであるかを「知る」方法を尋ねるようです。

カーネルは他のプログラムと同様にコマンドライン引数を受け入れることができます。 GRUBまたは他のほとんどのブートローダは、コマンドライン引数をユーザー入力として受け入れるか、それを保存してメニューを介してさまざまなコマンドライン引数の組み合わせを提供できます。ブートローダは、カーネルをロードするときにコマンドライン引数をカーネルに渡します(このルールの名前やメカニズムはわかりませんが、アプリケーションが実行されているカーネルの呼び出しプロセスからコマンドライン引数を受け取る方法と似ています)。

これらのコマンドラインオプションの1つはrootルートファイルシステムですroot=/dev/sda1

カーネルがinitrdを使用している場合、ブートローダはカーネルに場所を知らせるか、initrdを標準のメモリ位置に配置するのに役立ちます。 (私の考えでは)これは少なくとも私のGuruplugで動作する方法です。

1つを指定せずにルートファイルシステムが見つからないと文句を言うとすぐに、カーネルパニックが発生することは完全に可能です。

このオプションをカーネルに渡す他の方法があります。

答え4

さて、GRUBは/bootを「マウント」せずに「menu.lst」といくつかのモジュールを読むだけで、LINUXカーネルの一部でもありません。カーネルを呼び出すと、ルートパーティションと共に「ルート」引数を渡します。最悪の場合、カーネルは/bootがインストールされていることだけを知っています(笑)。

次:geekosaurは正しいです。 Linuxは初期のRAMディスクに圧縮された画像フォーマットを使用してからpivot_root。したがって、Linuxはイメージから実行を開始し、ローカルディスクドライブで実行されます。

関連情報