ブートの流れ
電源ボタンを押してからログインプロンプトが出るまでに、Linux は決まった順番で5つの段階を通ります。101 試験ではここが必ず出ます。問われ方は、順序そのものを並べ替えさせるもの、各段階の担当を聞くもの (initramfs は何のために存在するか、カーネルパラメータはどこに記録されているか)、そして dmesg と journalctl -b の使い分けの3つです。
前の段階が次の段階にバトンを渡す
順序を丸暗記するのではなく、前の段階が次を読み込んで制御を渡すリレーとして覚えてください。ひねった問題でも導けます。
| 順 | 段階 | 担当 | 主な役割 |
|---|---|---|---|
| 1 | BIOS / UEFI | ファームウェア | ハードウェアの初期化と自己診断、起動デバイスの選択 |
| 2 | ブートローダ | GRUB2 など | カーネルと initramfs をメモリに読み込む |
| 3 | カーネル | vmlinuz | メモリ管理とデバイスドライバを起動し、initramfs を一時的な root にする |
| 4 | initramfs | 初期RAMディスク | 本物の root を読むためのドライバを供給し、root を切り替える |
| 5 | init | systemd | 各種サービスを起動し、デフォルトターゲットまで持っていく |
BIOS は古くからある方式で、ディスク先頭 512 バイトの MBR を読みます。UEFI は後発で、EFI システムパーティション (ESP) 上の .efi ファイルを直接実行します。UEFI ではセキュアブートが使え、2TB を超えるディスクからも起動できます。この違いは頻出です。
カーネルだけでは root が読めない
カーネル本体は小さく作られていて、あらゆるストレージのドライバを内蔵しているわけではありません。root が LVM の上にあったり、暗号化されていたり、特殊な RAID カードの先にあったりすると、カーネル単体では読めません。
そこで、必要なドライバとツールだけを詰めた小さなファイルシステムを先にメモリへ展開し、それを踏み台にして本物の root をマウントします。これが initramfs です。役目を終えると本物の root へ切り替わり、/sbin/init (現代では systemd への symlink) が PID 1 として起動します。
起動の事実はどこに残っているか
| コマンド / ファイル | 何が見えるか |
|---|---|
dmesg | カーネルリングバッファ。ハードウェア検出やドライバの読み込みが時系列で並ぶ |
journalctl -b | 今回の起動ぶんの journald ログ。カーネルとサービスが混ざって見える |
journalctl -b -1 | 1つ前の起動ぶん。前回落ちた原因を追うときに使う |
journalctl -k | journald が持つカーネルメッセージだけ。dmesg に近い |
/proc/cmdline | ブートローダがカーネルに渡した起動パラメータ |
uname -r | 今動いているカーネルのバージョン |
/proc/cmdline はブート解析の要です。root= に書かれた値がカーネルの読んだ root デバイス、quiet があれば起動メッセージが抑制されており、ro があれば最初は読み取り専用でマウントされたという意味です。
ターミナル
cat /proc/cmdline
# 例 BOOT_IMAGE=/vmlinuz root=/dev/sda1 ro quietdmesg の時刻は秒数のオフセットです。dmesg -T で人が読める日時になりますが、サスペンドを挟むとずれることがあります。
よくある引っかけ
カーネルと init の混同がよく出ます。サービスを起動するのはカーネルではなく init (systemd) です。カーネルの担当はメモリ管理、プロセススケジューリング、デバイスドライバの提供までです。
initramfs と swap の取り違えにも注意してください。initramfs はメモリ上の一時的なファイルシステムであって、スワップ領域ではありません。
dmesg は今回の起動ぶんしか持ちません。再起動をまたいで過去を見るなら journalctl -b -1 です。journald の永続化が無効だと -b -1 が空になる点も押さえてください。
ブートローダの位置も狙われます。ブートローダはカーネルより前、BIOS/UEFI より後です。「BIOS がカーネルを直接読む」という選択肢は誤りです。