はじめに
[https://info.nikkeibp.co.jp/media/LIN/atcl/books/070900046/:embed:cite]
上記の技術書を読んでいて、ブートローダとLinuxの初期スタート時の役割とか順番がいまいち掴めなかったので生成AIや他の記事など別軸から調べ直してまとめた。
起動フロー全体像
UEFI/BIOS
↓ POST(ハードウェア初期化)、ブートデバイス選択
ブートローダー(GRUB等)
↓ /boot/vmlinuz(カーネルイメージ)をメモリに展開
↓ /boot/initramfs をメモリに展開
カーネル起動
↓ initramfsを一時的な / としてマウント
↓ ドライバ読み込み、本物のrootデバイスを認識
↓ 本物のroot FSをマウント(switch_root)
/sbin/init(systemd)に移譲
各フェーズの詳細
1. UEFI/BIOS
起動の最初はUEFI(または旧来のBIOS)が担う。
- POST(Power-On Self Test): メモリ、CPU、周辺デバイスの初期化
- ブートデバイスの選択(NVMe, SSD, PXEなど)
- UEFIの場合はEFIパーティション(ESP)から
.efiファイルを直接実行できる
UEFIとBIOSの大きな違いとして、UEFIはGPTディスクのネイティブサポートや、セキュアブートの仕組みを持つ。
2. ブートローダー(GRUB2等)
UEFI/BIOSからブートローダーに制御が渡る。
代表的なものはGRUB2で、設定ファイルは /boot/grub/grub.cfg にある。
ブートローダーの役割はシンプルで、以下の2点だけ:
- カーネルイメージ(
vmlinuz)をメモリに展開する - initramfs(
initramfs-*.img)をメモリに展開する
# /boot 以下の典型的な構成
$ ls /boot/
grub/
initramfs-6.1.0-28-amd64.img
vmlinuz-6.1.0-28-amd64
ブートローダー自身はルートFSのマウントをしない。あくまでカーネルとinitramfsをメモリに置いて制御を渡すだけ。
3. カーネル起動とinitramfs
ここが一番誤解されやすいフェーズ。
カーネルが起動すると、まず**initramfs(Initial RAM Filesystem)**を一時的なルート(/)としてマウントする。
なぜinitramfsが必要か?
カーネル本体はコンパクトに保つ設計になっており、NVMeやLVMやLUKS(暗号化)といった本物のディスクにアクセスするためのドライバを、起動時に動的にロードする必要がある。 initramfsはそのためのミニマルな環境を提供する。
initramfs の中身(概略)
/init → 起動スクリプト
/lib/modules → カーネルモジュール(ドライバ)
/bin, /sbin → busybox等の最低限のコマンド群
処理の流れ:
- initramfs内の
/initスクリプトが実行される - 必要なカーネルモジュール(ドライバ)をロード
- 本物のrootデバイス(
/dev/nvme0n1p2等)を認識 - 本物のroot FSをマウント
switch_rootで本物の/に切り替え
4. /sbin/init(systemd)への移譲
switch_root が完了すると、カーネルは /sbin/init を PID 1 として起動して移譲完了。
現代のLinuxディストリビューションでは、/sbin/init は systemd へのシンボリックリンクになっている。
$ ls -la /sbin/init
lrwxrwxrwx 1 root root 20 /sbin/init -> /lib/systemd/systemd
systemdはここからユニットファイルに従ってサービスを順次起動していく。
よくある混乱ポイントの整理
| 疑問 | 答え |
|---|---|
| rootFSをマウントするのは誰? | カーネル(initramfs経由) |
| ブートローダーは何をする? | カーネルとinitramfsをメモリに置くだけ |
| initramfsが必要な理由は? | カーネルが本物のディスクドライバをロードするための踏み台 |
/sbin/init の正体は? |
現代ではほぼsystemdへのシンボリックリンク |
知っておくべきこと
カーネルパニック時の読み方
起動フローを把握していると、カーネルパニックのメッセージがどのフェーズで発生したかを特定しやすくなる。
VFS: Unable to mount root fs のようなエラーはinitramfsフェーズの問題、Kernel panic - not syncing: No working init found はinit移譲の失敗を示す。
GRUBレスキュー
ブートローダーの設定が壊れた場合、GRUBのレスキューモードから手動でカーネルとinitramfsを指定して起動できる。
# GRUBレスキューモードでの手動起動例
grub> set root=(hd0,gpt2)
grub> linux /boot/vmlinuz root=/dev/nvme0n1p2
grub> initrd /boot/initramfs.img
grub> boot