ブート(Boot)について
ブート(Boot)
システムを立ち上げる処理のこと。
PCに電源をいれてからログインができるようになるまで、PC内ではあらゆる設定をしてくれている。
ブートシーケンス
電源を入れて、ログイン画面もしくはログインプロンプトが起動するまでに様々な設定を行う一連の流れのこと。
気になるのは、どういう流れで何を設定しているのか。
ブートシーケンスの流れ
コンピューター起動の流れ。
コンピューター起動には、物理的なアプローチから論理的なアプローチに切り替わるタイミングがある。
- 電源ON
- BIOSまたはEFIの起動
- デバイスの初期化 ← POST(Power On Self Test)
- ブートローダ
- カーネル(vmlinuz)とinitramfsの読み込み
- カーネルの起動
- initramfsの起動
- systemdの起動、ルートファイルシステムのマウント
- systemdの再起動
- 各種サービスの起動
- ログイン画面もしくはログインプロンプトの起動・表示。
BIOS/EFIの起動
電源ON後、BIOSもしくはUEFIがLinuxのブートローダ(GRUB2)を読み込み起動する。
まとめてファームウェアという。
BIOS
BIOS(Basic Input Output system)はPCのマザーボードに組み込まれている不揮発性メモリ(NVRAM:Non Volatile RAM)*1に格納されたプログラムのこと。
PCの電源をONにすると、BIOSは設定されたデバイスの優先順位に従って、ディスクの先頭ブロックにあるMBR(Master Boot Record)からブートローダを検索し、最初のデバイスローダを起動する。
MBR(Master Boot Record)
外部記憶装置のパーティション管理方式の一つ。
ハードディスクなど外部記憶装置の最も先頭にある。
PCが一番最初に、起動に必要な情報やプログラムを記憶している512byteの領域。
マスターブートレコードとパーティションテーブル*2、ブートサインが記載されている。
これらの情報は現在使用中のディスク組織を記憶している。
EFI
EFI(Extensible Firmware Interface)はBIOSに変わるファームウェア規格。
別名をUEFI(Unified EFI)ともいうが、一般的にEFIとUEFIは同じものを指している。
大容量ディスクへの対応(GPT:GUID Partition Table)、セキュリティの強化(Secure Boot)、リモート診断など機能が拡張されている。
Intel社によって開発された、Unified EFI Forumによって管理されている。
UEFIからOSを起動する時は、NVRAMに設定された優先順位に従ってディスクのUEFIパーティションに格納されているブートローダを起動する。
GPT(GPID Partition Table)
外部記憶装置のパーティション管理方式の一つ。
これもPCが起動して一番最初に読み込まれるハードディスクの場所。
セキュアブート(Secure Boot)
UEFIに組み込まれている公開鍵によって、ブートローダ内のデジタル証明*3を検証することで、不正なブートローダを起動させないようにする仕組み。
デジタル証明書はブートローダに組み込まれている。
BIOSとEFIの違い
BIOS | EFI | |
---|---|---|
パーティション形式 | MBR | GPT |
読み取り先 |
MBR | GPT |
起動ディスクの上限サイズ | 2TB(上限を越すとその分は使用不可) | 上限なし(起動ディスクとして設定したサイズ分全て使用可能) |
セキュアブート機能 | ✖ | ○ |
ネットワーク機能 | ✖ | ○ |
ブートローダ
ディスクからOSをメモリに読み込み、起動する役割。
LinuxではGRUB2(Grand Unified Bootloader)というプログラムがカーネル(vmlinuz)とinitramfsをディスクからメモリにロードし、カーネルを起動する役目。
GRUB2はboot.imgファイルとcore.imgファイル、その他のモジュールから構成されている。
BIOS起動プロセス
boot.imgとcore.imgはGRUB2インストール時にMRB領域に書き込まれる。
- POSTの実行。
- BIOSがブート起動に必要なシステムハードウェアを初期化。
- BIOSが MRB領域にあるboot.imgをメモリにロード、制御をboot.imgに移行。
- boot.imgによる処理実行。
- ディスクからdiskboot.imgをメモリにロード、制御をdickboot.imgに移行。
- core.imgをメモリにロード、制御をcore.imgに移行。
- core.imgによる処理実行。
- GRUB2の自己解凍処理。
- GRUB2の実行準備。
- GRUB2の実行
- ブートローダ(GRUB2)が起動。
- ブートローダがOSのカーネルをロード。
EFI起動プロセス
GRUB2はFAT32*4もしくはvfat*5でフォーマットされたEFIパーティションの中のshim.efiファイルとgrubx64.efiファイルに格納される。
EFI起動はBIOS起動ではないセキュブートのプロセスが追加される。
- POSTの実行。
- EFIがブート起動に必要なシステムハードウェアを初期化。
- EFIがNVRAM内のブートエントリを読み取り、どのEFIアプリケーションを起動するか、どこから起動するかを判断。
- ファームウェアがEFIアプリケーションを起動する。
shim.efi
セキュアブートが有効になっている状態でGRUB2を起動するブートローダ。
セキュアブートが無効になっている状態でも利用可能。
grubx64.efi
セキュアブートが無効になっている状態でGRUB2を起動するブートローダ。
カーネル(kernel)
システム起動時にメモリへ読み込まれ常駐し、CPUやメモリからのシステム始原の監理、デバイスの制御、プロセスのスケジューリングを行うOSの核となるプログラム。
カーネルの構成
- ユーザ管理・プロセス管理・時刻管理・メモリ管理などを行う本体。
- コンパイル時に静的に本体にリンクされるカーネルモジュール。
- コンパイル時に本体にリンクされず、必要な時に動的にメモリに読み込まれて本体にリンクされるローダブルカーネルモジュール(LKM)。
ブートシーケンス中のカーネル処理
- ブートローダがメモリにカーネルをロード
- カーネルの自己解凍
- カーネルの初期化処理
- ページング機能の初期化
- スケジューラの初期化
- 割り込みベクタテーブルの初期化
- タイマーの初期化
- メモリにあるinitramfmの解凍・展開
- initramfmの実行
- systemdの再実行
initramfsの実行
initramfs(Initial RAM FS)はディスク内のルートファイルシステムをルートディレクトリのマウントするためのルートファイルシステム。
カーネルがinitramfsを利用する手順。
- メモリ上に読み込まれたinitramfsを一時的にルートファイルシステムとしてマウント
- initramfsのinit(systemd)プログラムを起動し、各サービスごとにディスク内のルートファイルシステムをマウント
- ルートファイルシステムをinitramfsから、ディスク内のルートファイルシステムに切り替え
systemd
カーネルが生成する最初のユーザプロセス。プロセス番号は1。
systemdは設定ファイルを読み込み、グラフィカルターゲットかマルチユーザーターゲットまでシステムを立ち上げる。
グラフィカルターゲットまでの場合はGUI環境でログイン画面が表示される。
マルチユーザターゲットまでの場合はCUI環境でログイン画面が表示される。
ターゲットとはどのレベルまでサービスを提供するかなどのシステムの状態を定義する。