GNU/Linux >> Linux の 問題 >  >> Linux

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

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

最終的にブートローダーが登場し、コマンドラインをカーネルに渡すことができました. root= の場合 引数が渡され、組み込み値の代わりにルート fs がどこにあるかをカーネルに伝えました。アクセスするために必要なドライバーは、カーネルに組み込む必要がありました。引数は /dev の通常のデバイス ノードのように見えますが、 ディレクトリ、明らかに /dev はありません ルート fs がマウントされる前のディレクトリにあるため、カーネルはそこで開発ノードを検索できません。代わりに、特定の既知のデバイス名がカーネルにハードコードされているため、文字列をデバイス番号に変換できます。このため、カーネルは /dev/sda1 のようなものを認識できます 、しかし /dev/mapper/vg0-root のようなよりエキゾチックなものではありません またはボリューム UUID。

その後、initrd 写真に入ってきました。カーネルとともに、ブートローダーは initrd をロードします これはある種の圧縮されたファイルシステム イメージでした (gzip された ext2 イメージ、gzip された romfs イメージ、最終的に squashfs が支配的になりました)。カーネルはこのイメージを ramdisk に解凍し、ramdisk をルート fs としてマウントします。このイメージには、実際の init ではなく、追加のドライバーとブート スクリプトが含まれていました。 .これらのブート スクリプトは、ハードウェアを認識し、RAID アレイや LVM などをアクティブ化し、UUID を検出し、カーネル コマンド ラインを解析して実際のルートを見つけるためにさまざまなタスクを実行しました。次に、実際のルート fs を /initrd にマウントしました。 、次に pivot_root を実行しました カーネルをスワップするシステムコール //initrd 、次に exec /sbin/init /initrd をアンマウントします。 ラムディスクを解放します。

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


Linux は最初に RAM ディスク (initrd と呼ばれる) で起動します。 、「INITial RamDisk」の場合) / .このディスクには、実際のルート パーティション (必要なドライバーとファイル システム モジュールを含む) を見つけるのに十分なだけのディスクがあります。 initrd 上の一時的なマウント ポイントにルート パーティションをマウントします。 、次に pivot_root(8) を呼び出します initrd を残して、ルート マウント ポイントと一時マウント ポイントを入れ替えます。 umount になる位置に ed と / の実際のルート ファイルシステム .


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

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

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

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

指定しないと、ルート ファイルシステムが見つからないと文句を言い始めた直後にカーネル パニックが発生する可能性があります。

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


Linux
  1. カーネルはどれくらいの RAM を使用しますか?

  2. ps コマンドはどのように機能しますか?

  3. ループバック インターフェイスはどのように機能しますか

  1. スティッキービットはどのように機能しますか?

  2. sudoの内部はどのように機能しますか?

  3. ティーコマンドはどのように機能しますか?

  1. Nautilus のようにコマンドラインからマウントする方法は?

  2. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  3. mysql ルート パスワードを変更する方法