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


29

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

これに関する詳細は素晴らしいでしょう。基本的なものが欠けているように感じます。主に業務のプロセスと順序に関心があります。

ありがとう!

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


以下の人々はinitrdを扱っていますが、initrdが使用される理由についてはほとんど議論されていません。私の印象は、Debianのようなディストリビューションは同じアーキテクチャの多くの異なるマシン上で1つのカーネルを使用したいからです。これは、カーネルモジュールを介してハードウェアサポートをモジュール化することにより可能になります。initrdは起動するのに多くのハードウェアサポートを必要としません。一度起動すると、必要なハードウェアモジュールをロードして続行します。これに対する詳細/修正を歓迎します。
ファヒムミタ

/なしの/ bootディレクトリはないため、/を最初にマウントしないと/ bootをマウントできません。
-psusi

回答:


20

Linuxは、最初にramdisk(initrd「INITial RamDisk」の)と呼ばれる)で起動し/ます。このディスクには、実際のルートパーティション(必要なドライバーとファイルシステムモジュールを含む)を見つけるのに十分な容量があります。それが一時的なマウントポイントにルートパーティションをマウントしinitrd、次に呼び出すpivot_root(8)残し、ルート一時マウントポイントを交換するinitrdことができる立場にumount編との実際のルートファイルシステム/


2
LFS(linuxfromscratch.org)のようなinitrdがない場合はどうなりますか?
氏Shickadance

@氏。Shickadance:LFSがどのように動作するかを検討していないので、カーネルに必要なすべてのモジュールがコンパイルされている(またはGRUB 2を介してロードされているため、多くのディストリビューションがまだ気付いていない可能性が高い)ことを確認していると思います実際のルートパーティションで開始できます。
ギーコサウルス

4
@氏。シッカダンス。initrdを持たないのはLFSだけではありません。自分のカーネルをコンパイルする人には、initrdを使用しないという選択肢があります。これは私がGentooで行っていることです。
jonescb

1
@Faheem:grub2モジュールはカーネルモジュールと同じではありません。grub2がカーネルモジュールをロードする機能はある程度ありますが、Linuxカーネルで機能するか、* BSD(カーネルモジュールをロードするブートローダーが通常)でのみ機能するかはわかりません。ロードされたモジュールのアドレスマップの場所をカーネルに教える必要があり誰もがgrub2に移行する必要があると思います(grub1は一部のディストリビューションではまだ標準です)。
ギーコサウルス

1
ピボットルートがダーティハックと見なされていたため、initrdはinitramfsに置き換えられました。
-psusi

41

古代では、カーネルはデバイスのメジャー/マイナー番号を知るためにハードコードされ、カーネルに組み込まれたすべてのデバイスドライバーを初期化した後にそのデバイスをマウントしていました。この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をマウントし/initrdpivot_rootシステムコールを実行してカーネルをスワップし//initrd、次に/sbin/init実際のルートでexec を実行する/initrdと、ramdiskがアンマウントされて解放されます。

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


1
chrootの後、tmpfsは自動的にアンマウントされますか?消えてしまうだけですか?
ジグガンジャー

@jiggunjer、いや、まだそこにあり、(/ rootディレクトリを含むことを除いて)ただ空であり、もはや使用されていません。
-psusi

あなたが言及したルートfsのすべての反復について、新しいことを学びました。素晴らしい答えです!
jpaugh

3

/ etcの構成ファイルにアクセスせずに、どのパーティションがルートパーティションであるかをカーネルがどのように「認識する」のかを尋ねているように聞こえます。

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

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

カーネルがinitrdを使用している場合、ブートローダーはカーネルにそれがどこにあるかを伝えるか、または標準メモリの場所にinitrdを置く責任があります(私は思う)-それは少なくとも私のGuruplugで動作する方法です。

ルートファイルシステムが見つからないという不満を言った直後に、指定しないでカーネルパニックを起こすことは完全に可能です。

このオプションをカーネルに渡す他の方法があるかもしれません。


3
これは、initrd / initramfsがない場合の正しい説明ですが、パズルの一部が欠落しています。通常、カーネル/dev/sda1は、ファイルシステムのエントリであるなどのデバイスを識別します。あなたは何ができるcp -p /dev/sda1 /tmp/foo/tmp/foo同じデバイスを表します。カーネルコマンドラインでは、カーネルは、通常のデバイス命名規則に従う組み込みパーサーを使用しますsda1。これは、最初のSCSIのようなディスクの最初のパーティションを意味します。
ジル 'SO-悪であるのをやめる'

@Gillesなので、最新のカーネルはUUIDに基づいてボリュームのマウントを処理できませんか?なしinitrdまたはinitramfs私は意味します。/dev/sdxフォームの「単純な」パーティションである必要がありますか?
ジグガンジャー

1
@jiggunjer最新のカーネルは、UUIDによるボリュームの検索をサポートしています。をご覧くださいinit/do_mounts.c
ジル 'SO-悪であるのをやめる'

1

Grubは/bootパーティションをマウントし、カーネルを実行します。Grubの構成では、ルートデバイスとして使用するものをカーネルに指示します。

たとえば、Grubの場合menu.lst

kernel /boot/linux root=/dev/sda2

1

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

次に:geekosaurが正しい、Linuxは圧縮イメージ形式の初期RAMディスクを使用し、を呼び出して実際のルートファイルシステムをマウントしますpivot_root。したがって、Linuxはイメージから実行を開始し、次にローカルディスクドライブから実行を開始します。


1
Grubには、特にgrub2でファイルシステムを「マウント」する機能があります。もちろん、/ doing /でできることは、1つのストライプまたは別のストライプのブート可能なカーネルを探すことだけですが、それでもマウントされています。また、Linuxは、ハードドライブに不可欠なドライバーをモジュールとしてコンパイルしない限り、initrdを必要としません。
シャドゥール

5
ibm.com/developerworks/linux/library/l-linuxbootこれは、ブート時にLinuxカーネルが行うことのかなり簡潔な要約です。
jsbillings

2
@Shadur、マウントマンページより:Unixシステムでアクセス可能なすべてのファイルは、/をルートとする1つの大きなツリー、ファイル階層に配置されます。これらのファイルは、複数のデバイスに分散できます。mountコマンドは、あるデバイスで見つかったファイルシステムを大きなファイルツリーにアタッチするのに役立ちます。 -GRUBで使用されるファイルシステムはファイル階層に関連付けられていないため、マウントされていません。
-D4RIO

1
@ Shadur、BTW:initrdは別のルートファイルシステムであるため必要ではないことは明らかですが、カーネルは起動に必要なものをロードしてからブートし、最後に他のすべてをロードするため、一般的に小さなブートタイムルートとして使用されます
D4RIO

1
@ d4rioこれらはLinuxではなくGRUBによってマウントされます。grubを単なるブートローダーではなく独自のマイクロカーネルOSと見なすと理解しやすくなります。
シャドゥール

1

ブートローダーは、grub、lilo、その他何であれ、カーネルにroot=フラグを参照する場所を指示し、オプションでinitrdカーネルを起動する前に初期RAMディスクをメモリにロードします。

その後、カーネルはロードし、そのハードウェアとデバイスドライバーをテストし、表示できるものがないかシステムを調べます(この診断情報は、入力することで確認できますdmesg;最近では、表示するには速すぎてスクロールする可能性があります)。root=パラメータ。

initrdが存在する場合、最初にマウントされ、ルートファイルシステムがマウントされる前に、その上にあるすべてのモジュール/デバイスドライバーがロードおよびプローブされます。これにより、ハードドライブのドライバーをモジュールとしてコンパイルし、起動することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.