【Linux】システムの起動(BIOS、UEFI)

Linuxにおけるシステムの起動についてまとめました。

Linuxシステムの起動

Linuxシステムの起動の流れは大まかに整理すると以下のとおりです。

①電源投入。 ②ファームウェア (BIOS)が起動しハードウェアの確認と初期化を行う。その後にブートローダを呼び出す。 ③ブートローダが起動し、メモリ初期化、システムクロック等の設定を行い、初期RAMディスクをマウントする。その後、カーネルを呼び出す。 ④カーネルが「init/systemd」を実行し、LinuxOSが起動する。

起動手順(BIOSの場合)

より細かく説明すると以下のとおり。

  • 電源投入
  • マザーボードのファームウェア(BIOS/UEFI)の起動
    • POST(Power On Self Test:ハードウェア診断と初期化)を実行。
    • 起動ドライブ(SSD、HDD、CD-ROMなど)を探索し、ファーストブートドライブとして起動。
    • BIOSの場合、ブートドライブの先頭ブロック(MBR:Master Boot Record)に書き込まれた第1ステージ・ブートローダをメモリにロードし、ブートストラップローダ(MBR領域にあるプログラム)に制御を移す。
  • 第1ステージ・ブートローダが動作
    • 「/boot」パーティションから第2ステージ・ブートローダーをメモリにロード。
  • 第2ステージ・ブートローダが動作
    • カーネルの選択画面を表示し、選択されたカーネルのカーネルバイナリーファイル(/boot/vmlinuz-バージョン)を第2ステージ・ブートローダが「/boot」ディレクトリ内から見つけてロードする。
  • カーネルの動作
    • メモリの初期化など、pci情報などからハードウェアの初期設定を実施し、メモリにロードされている「initrd」をマウントする。
  • initrd (カーネルプロセスの起動)
    • ルートファイルシステムを読み取り専用でマウントし、「/sbin/init」プログラムを実行。
  • init (カーネルプロセスの起動)
    • Linux上で動くすべてのプログラムは、initプログラムから実行される(PIDは必ず1となる)。そのため、「initはすべてのプロセスの親である」と表現される。
  • /etc/inittab (他のプロセスの起動)
    • initが起動すると「/etc/inittab」を読み込むす。
    • 「/etc/rc.d/rc.sysinit」スクリプトを実行。
  • rcスクリプト (initプロセス)
    • rcはRun Controlの略。
    • initが「/etc/inittab」で指定されているrcスクリプト(/etc/rc.d/rc.sysinit、/etc/rc.d/rc)を実行し、システムの初期設定(デバイスドライバのロードなど)を行う
    • 「rc.sysinit」スクリプトは「/etc/rc.d/init.d/functionsスクリプト」が実行する。

コメント