linuxのブートプロセス
ブートプロセスについて調べたことをメモ。
1.BIOS(UEFI)
コンピュータの電源がオンになるとハードウェアの自己診断(テスト)がスタートします。その後ハードディスクを認識した後、BIOSはハードディスク先頭の512B(MBR-マスターブートレコード)をメモリ(0x07C00
)にロード、対象のアドレスにジャンプします。
2.ブートローダー
有名なものだとGrubなどはこのレイヤーに位置します。
先の0x07C00
にロードされた512BのプログラムだけではもちろんあのGrubのような多くの機能を実現することはできません。そこでまずはは簡単な初期化処理の後、メインのプログラムをロードする処理を行って対象のアドレスにジャンプします。(この時点でファイルシステムは認識できる)
ここまで来ると(例えばgrubの場合は)configファイルを解釈し、ブートするosの選択をユーザーに促します。
ユーザーがosの選択を行うとgrubはvmlinuz
(カーネルの一部)とinitramfs
(ブートに用いる一時的なファイルシステム)をメモリ上にロードし、展開されたカーネルの先頭アドレスにジャンプします。
3.カーネルとinitramfs
vmlinuz
は一部の初期化処理の後、カーネル本体の解凍を行いメモリにロード、対象のアドレスにジャンプします。その後残った必要な初期化処理を行うと、initramfs
(initrd
)を一時的なファイルシステムとしてマウントします。
initramfs
にはinit
が存在します。カーネルはinitramfs
のマウント後、このinitramfs
のinit
を実行します。ここでは主にメインのファイルシステムを読み込むのに必要な処理を行い、実際にマウントを行います。
ここでカーネルが直接メインのファイルシステムを読み込まないのは、ファイルシステムが暗号化されていたりと複雑なことが多いためです。ファイルシステムは複数のハードで構成することができますが、仮に通常の
init
(例えばsystemd
)が簡単に読み込めるハードに保存されていたとしても、これらが必要とするファイル群が正しくファイルシステムにマウントされているとは限らないのです。
ファイルシステムの読み込みが完了すればカーネルは通常のinit
を実行することが可能になります。
4.プロセス(PID1)の起動
ここまでファイルシステムが完全に使用できるようになりました。ここでやっと通常のinit
が起動できます。実態としては/sbin/init
ですが、ubuntu20.04の場合は/lib/systemd/systemd
へのシンボリックとなっています。
ロギング
3.カーネルとinitramfsの起動後は通常のlinuxログが吐かれます。以下はその例です。
参照方法 | 内容 |
---|---|
dmesg or/var/log/dmesg | カーネルリングバッファーログ。カーネルによって出力されるログが記録されます。printk() された出力に対応します。 |
/var/log/kern.log | dmesg をファイルとして保存したものです。dmesg はリングバッファーなのである程度昔のログは残らないのに対し、kern.log は比較的長時間残ります。 |
/var/log/syslog | syslog によって回収されたログです。カーネルに関係しないログも含まれています。ちなみにkern.log を管理しているのもsyslog です。 |
参考程度にとどめますが
systemd
を採用しているディストリビューションの場合、カーネルやその他のアプリのログを大元で管理しているのはjournald
です。journald
はシステムのあらゆるログを収集し、syslog
に関係あるログをsyslog
に送ります。
さいごに
ディストリビューションごとの差はあるけどSUSEとかRHELなんかのドキュメントは結構分かりやすい。しっかりまとまってる。
参考
- https://documentation.suse.com/ja-jp/sled/15-GA/html/SLED-all/cha-boot.html
- https://documentation.suse.com/ja-jp/sled/15-GA/html/SLED-all/part-boot.html
- https://qiita.com/taichitk/items/b3b69705be0e270e9f6e
- https://keichi.dev/post/linux-boot/
- https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/installation_guide/s2-boot-init-shutdown-loader