
私はLinuxブートプロセスを理解しようとしていますが、多くのドキュメントを読んだ後でもまだ理解できないことが1つあります。
デフォルトではBIOS - > Grub MBR - > Grub CONF - >カーネル...
grubconfは次のようになります
title CentOS (2.6.32-358.2.1.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.2.1.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-358.2.1.el6.i686.img
したがって、ドキュメントと私が読んだ投稿の私の理解に基づいて、カーネルはルートファイルシステムとしてinitramfsと共にロードされマウントされます。その後、initが実行され、システムを起動して実行するための一連のさまざまなタスクが実行されます。
私の質問は:カーネルはどのようにロードされますか?
私は、カーネルが/boot/vmlinuz-2.6.32-358.2.1.el6.i686
私のデバイス(hd0,0)にあるので、アクセスできるように最初にファイルシステムをマウントする必要があるということです。
(私の考えでは)Grubがhd0,0パーティションをマウントしている場合は、まずinitramfsを使用してPivot_rootを実行し、次にカーネルパラメータで指定された実際のroot = fsを使用して別のPivot_rootを実行しますか?
これらすべてがどのように連携するかをよりよく理解するのに役立つすべての説明/リンクを歓迎します。
答え1
Grubには独自のファイルシステムドライバがあります。 Linuxを使用しません。 Grubは、次のコマンドに従ってカーネルとinitrdをメモリにロードします。Linuxカーネルブートプロトコル。カーネルの一部はあらかじめ定義されたアドレスにロードされ、Grubはカーネルが残りの部分を見つけることができる場所を知るようにいくつかのパラメータを設定します。
カーネルが起動したら、独自のドライバを使用してルートパーティションをインストールします(現在のモジュールがないため、ドライバはモジュールにはなりません)。ルートパーティションは次のとおりです。initrd、initramfsまたは(initramfsまたはinitrdがない場合)、root
コマンドライン引数(root
または引数がない場合はコンパイルされたデフォルト)で示されるブロックデバイス。
答え2
grubが行うことは、アクセス/boot
(読み取り専用で十分であり、grubはここでファイルシステム全体を処理する必要はありません)から関連ファイルをインポートするだけです。カーネルとinitramfsをメモリにロードし、新しくロードされたカーネルに制御を渡します。
新しくロードされたカーネルはinit
initramfsで実行され、最終的にpivot_root
完了します/
。