
Linuxのブートプロセスを理解する──BIOSからinitまでの道のり
はじめに
みなさんはLinuxの起動時にどのようなプロセスが動いているのか、深く考えたことはありますでしょうか。PCの電源を入れると、いつの間にかログイン画面が表示されます。しかし、その裏側ではBIOSやUEFI、ブートローダ、カーネル、そしてinitなど、いくつもの要素が複雑に連携しながらシステムを立ち上げているのです。
本記事では、「LinuxがどのようにしてOSとして立ち上がるのか」という問いを軸に、ブートローダがカーネルを呼び出し、カーネルがinitを起動するまでのプロセスを段階的に追っていきます。ブート時の各ステージがわかるようになると、万が一トラブルが起こった場合でも原因を特定しやすくなりますので、ぜひ参考にしてみてください。
1. ブートプロセスの全体像
ブートプロセスを大まかに並べると、以下の段階があります。
BIOSまたはUEFIが起動し、ブートローダをロードして実行
ブートローダがディスク上からカーネルイメージを読み込み、メモリに展開した後に起動
カーネルがデバイスとドライバを初期化
カーネルがルートファイルシステムをマウント
カーネルがPID 1のプロセスとしてinitを起動
initがシステム上のその他のプロセスを起動
initによってログインプロンプト(あるいはGUIのログイン画面)が起動
このうち、本記事ではブートローダがカーネルを呼び出すところと、カーネルがinitを呼び出す大まかな流れを中心に解説します。init以降(ユーザースペースでの起動)は、主にsystemdやSysVinitなどが担当しますが、そちらは別の機会に詳しく触れたいと思います。
2. 起動ログメッセージを確認する
2.1 カーネルログの確認
「ブート時、何が起きているのか」を知るためには、まずカーネルメッセージを確認するとよいです。systemd採用システムでは以下のようにすれば直近のブートにおけるカーネルログを表示できます。
journalctl -k
過去のブート分まで見たい場合は、-bオプションにブート番号を指定します。例:
journalctl -k -b -1
systemdではない場合は、dmesgコマンドや/var/log/kern.logを参照してカーネルメッセージを確認します。たとえば、次のようなログが出力されることがあります。
scsi 2:0:0:0: Direct-Access ATA KINGSTON SM2280S 01.R PQ: 0 ANSI: 5
sd 2:0:0:0: [sda] 468862128 512-byte logical blocks: (240 GB/224 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
このように、どのディスクが検出されたのかなどをリアルタイムで把握できます。
2.2 カーネル初期化の流れ
カーネルは起動後、以下のようなおおまかな初期化を行います。
CPU構成の検出
メモリ構成の検出
デバイスバスの検出
実デバイスの検出
補助的なカーネルサブシステムのセットアップ(ネットワークなど)
ルートファイルシステムのマウント
initの起動(ユーザースペースの開始)
このとき、依存関係がネックになります。たとえば、ディスクドライバを有効にする前にはSCSIサブシステムが初期化されていないといけません。また、デバイスによってはドライバがカーネルモジュールとして提供されている場合もあります。その場合はinitrd(初期RAMファイルシステム)を使って、ルートファイルシステムをマウントする前に必要なドライバモジュールを読み込む仕組みがあります。(initrdについては後述します)
3. カーネルパラメータとは?
3.1 /proc/cmdlineの中身を見てみよう
ブートローダからカーネルが読み込まれるとき、カーネルパラメータという形式で追加のシステム情報が渡されます。これらの内容を確認するには、以下を実行します。
cat /proc/cmdline
ここにはquietやsplash、あるいはルートファイルシステムを指し示すroot=UUID=xxxxxxxxのようなkey=value形式や、単独のフラグが並んで表示されます。とくにroot=パラメータは、ルートファイルシステムの場所を指すため非常に重要です。これを誤るとシステムは正常に起動できません。
また、roフラグはルートファイルシステムを読み取り専用(read-only)でマウントするための指示です。これも一般的な挙動で、ファイルシステムを事前にチェックしてから書き込み可能(read-write)に再マウントするしくみになっています。
4. ブートローダの役割
ここで疑問が生まれるかもしれません。「カーネルを読み込む前からディスクを扱う機構はどうなっているの?」と。その答えが、ブートローダです。
ブートローダには以下のような機能があります。
どのカーネルを読み込むかを選択(複数のカーネルを切り替え)
ブート時のカーネルパラメータを指定
シングルユーザーモードなどを利用できるように、ユーザーがブート時に任意のパラメータを編集できるようにする
他のOSを起動できるようにする(チェーンロード)
有名なブートローダとしては、GRUB、LILO、SYSLINUX、LOADLINなどがありますが、本記事ではもっとも広く用いられるGRUB 2を中心に紹介します。
5. GRUBを使ってみる
5.1 GRUBのメニューとコマンドライン
多くのディストリビューションでは、電源投入直後にShiftキー(BIOSの場合)やESCキー(UEFIの場合)を押し続けることでGRUBのメニュー画面を表示させることができます(ディストリビューションごとに挙動が異なることに注意)。メニュー画面は以下のようになります。
---------------------------------------
GNU GRUB version 2.XX
---------------------------------------
* Ubuntu
Advanced options for Ubuntu
Windows
---------------------------------------
この記事が気に入ったらチップで応援してみませんか?