【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スクリプト」が実行する。

起動手順(UEFIの場合)

  • 電源投入
  • マザーボードのファームウェア(UEFI)の起動
    • POST(Power On Self Test:ハードウェア診断と初期化)を実行。
    • ハードウェアの確認と初期化。
    • GPTパーティションを検索します。複数のブート・デバイスが存在する場合、UEFIブート・マネージャは、ブート・マネージャで定義された順序に基づいて、使用する適切なESPを決定します。efibootmgrツールでは、デフォルト定義を使用しない場合に、別の順序を定義できます。
  • セキュア・ブート
    • セキュア・ブートが無効の場合、ESPでGRUB 2ブート・ローダーを実行。
    • セキュア・ブートが有効の場合、ブート・マネージャーがブート・ローダーから証明書を要求し、証明書が有効な場合は、ブート・ローダーが実行され、次にロードするように構成されているカーネルが検証される。
  • カーネル
    • ブート・ローダーはvmlinuzカーネル・イメージ・ファイルをメモリーにロードし、initramfsイメージ・ファイルのコンテンツを一時的なメモリー・ベースのファイル・システム(tmpfs)に抽出する。
  • 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スクリプト」が実行する。

関連ページ

【LinuC】試験対策と例題まとめ
LinuCの試験対策と例題(学習サイト)についてまとめました。
LPICの試験対策と例題まとめ
LPICの試験対策と例題(学習サイト)についてまとめました。
【Linux超入門】システムの基礎とよく使うコマンドなど徹底解説
Linuxシステムの基礎とよく使うコマンドなどについて入門者向けに解説します。

コメント