🐧 Linux 総合学習プラットフォーム
OS内部/起動の仕組み ・ 上級

ブートローダ GRUB の役割

GRUB(GRand Unified Bootloader)は、ファームウェアとカーネルの橋渡しを担うプログラムです。起動時にメニューを表示し、複数のカーネルや古いバージョンを選んで起動できます。読み込むカーネルの場所、initramfsの指定、カーネルへ渡す起動パラメータ(カーネルコマンドライン)を構成として保持します。設定の本体は /boot/grub2/grub.cfg ですが、これは自動生成されるため、人が編集するのは /etc/default/grub と grub2-mkconfig による再生成が基本です。トラブル時はメニューでパラメータを一時編集してレスキュー起動する、といった応用も効きます。

起動シーケンスの中で、ファームウェアとカーネルの間をつなぐのがブートローダで、Linuxの世界では GRUB(GRand Unified Bootloader)がその定番です。ファームウェアは「ディスクの決まった場所にある小さなプログラムを読んで実行する」ところまでしか面倒を見てくれません。そこから先、どのカーネルを、どんな設定で、どのディスクから起動するのかを取り仕切るのがGRUBの仕事です。普段は一瞬で通り過ぎてしまう画面ですが、複数のOSを使い分けたり、トラブル時にレスキュー起動したりする場面では、このGRUBを理解しているかどうかが効いてきます。

GRUBが起動時にすること

GRUBの働きは、流れで捉えると分かりやすくなります。UEFI/BIOS → GRUB → 起動メニュー表示 → カーネル選択 → カーネルとinitramfsの読み込み → カーネルへ制御移譲、という順序です。電源投入後、ファームウェアから呼び出されたGRUBはまず起動メニューを表示します。ここには現在のカーネルに加え、アップデート前の古いカーネルなどが並び、ユーザは矢印キーで選んでEnterを押すか、数秒のカウントダウン後に既定の項目で自動起動します。選ばれたカーネルに対して、GRUBはそのカーネル本体(vmlinuz)と、起動初期に使うinitramfsをメモリ上に読み込み、最後に制御をカーネルへ引き渡します。新しいカーネルを入れたあとに不具合が出たとき、メニューから1つ前のカーネルを選んで起動できるのは、この複数カーネルを管理する仕組みのおかげです。

カーネルコマンドライン(起動パラメータ)

GRUBがカーネルに渡すものは、カーネル本体とinitramfsだけではありません。カーネルの起動時の挙動を変える文字列——カーネルコマンドライン(起動パラメータ)——も一緒に渡します。たとえば root=/dev/sda2 はどのパーティションをルートファイルシステムとして使うかの指定、quiet は起動メッセージを抑制する指定、ro は最初は読み取り専用でルートをマウントする指定です。トラブル対応でよく使われるのが、systemd環境で systemd.unit=rescue.target を一時的に足して最小構成のレスキューモードで起動する、といった応用です。パスワードを忘れてしまったときに init=/bin/bash を渡してシェルだけを直接立ち上げる、といった緊急復旧もこの仕組みを利用しています。起動後に、いま動いているカーネルへ実際に渡されたパラメータを確認したいときは、/proc/cmdline をcatで読むとそのまま見られます。GRUBで一時的に足したパラメータがちゃんと効いているかを、起動後にこの /proc/cmdline で答え合わせする、という確認の流れも覚えておくと役立ちます。

設定ファイルの構造 — grub.cfg は直接編集しない

ここがGRUBで最もつまずきやすい点です。GRUBの設定の本体は /boot/grub2/grub.cfg(環境により /boot/grub/grub.cfg)ですが、このファイルは自動生成されるものなので、原則として人間が直接編集してはいけません。手で書き換えても、次にカーネルを更新したタイミングなどで再生成され、変更が消えてしまうからです。人が触るのは、設定の元になる /etc/default/grub というファイルです。ここで GRUB_TIMEOUT=5(メニューの待ち時間を5秒に)や GRUB_CMDLINE_LINUX(全カーネル共通で渡す起動パラメータ)などを編集します。編集し終えたら grub2-mkconfig -o /boot/grub2/grub.cfg(Debian/Ubuntu系では update-grub)を実行して、設定から grub.cfg を作り直す——この『元ファイルを編集 → 再生成』という二段構えが、GRUBを安全に設定する基本作法です。

トラブル時の一時編集とレスキュー起動

GRUBの強力なところは、その場限りの一時的な編集ができる点です。起動メニューで対象の項目を選んだ状態で e キーを押すと、その項目の設定(カーネル行やパラメータ)を一時的に書き換えられる編集画面に入れます。ここで起動パラメータを足したり直したりして Ctrl + x で起動すれば、ファイルには手を加えずにその回だけ違う条件で起動できます。たとえば quiet を消して起動メッセージを全部表示させ、どこで止まっているかを目視する、といった切り分けがすぐにできます。設定を恒久化したいわけではなく、まず原因を切り分けたい、という調査の初手に向いています。さらに c キーを押すとGRUBのコマンドラインに入り、ディスクやパーティションを手探りで指定して起動を試みることもできます。この一時編集はあくまでその回限りで、再起動すれば元の grub.cfg の内容に戻るので、まず試して効果を確かめてから、本当に必要な変更だけを /etc/default/grub に反映して恒久化する、という二段階の進め方が安全です。

よくある誤解と実務の使いどころ

GRUBにまつわるよくある誤解として、「grub.cfg を直接書き換えれば設定が変わる」「OSが壊れた=必ず再インストール」という思い込みがあります。前者は再生成で消えるためほぼ徒労に終わり、後者も、GRUBメニューやレスキュー起動を使えば再インストールせずに復旧できるケースは少なくありません。実務では、カーネル更新後に起動しなくなったら旧カーネルで起動して原因を切り分ける、ルートディスクの指定がずれたらGRUBの一時編集で root= を直す、といった形で日常的に役立ちます。なお、いま起動しているカーネルのバージョンやアーキテクチャは uname で、ディスクとパーティションの構成は lsblk で確認できるので、GRUBの設定を見直す前にこの2つで現状を把握しておくと、指定ミスを防げます。

この項目に出てくる用語

ブートローダぶーとろーだ
ファームウェアの後にカーネルを読み込んで起動させる小さなプログラム。Linuxでは主にGRUBが使われる。
GRUBぐらぶ
Linuxで広く使われるブートローダ。起動メニューを表示し、カーネルや起動パラメータを選んで読み込む。
カーネルかーねる
OSの中核。ハードウェアとソフトウェアの間に立ち、メモリ・プロセス・デバイスを管理する。
initramfsいにっとらむえふえす
起動初期にメモリ上へ展開される一時的なルートファイルシステム。本来のルートをマウントするための橋渡し。

関連コマンド

unamelsblk

▶ 学習アプリでこの続きを学ぶ・演習する