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

ブートローダ GRUB の役割

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

ファームウェアは「ディスクの決まった場所にある小さなプログラムを読んで実行する」ところまでしか面倒を見てくれない。

そこから先――どのカーネルを、どんな設定で、どのディスクから起動するのか――を取り仕切る誰かが必要になる。それがブートローダで、Linuxの世界では GRUB(GRand Unified Bootloader)がその定番だ。

普段は一瞬で通り過ぎる画面だが、複数のOSを使い分けたり、トラブル時にレスキュー起動したりする場面では、このGRUBの理解が効いてくる。

⏱ GRUBが起動の一瞬でやること

GRUBの働きは、流れで捉えると腑に落ちる。UEFI/BIOS → GRUB → 起動メニュー表示 → カーネル選択 → カーネルとinitramfsの読み込み → カーネルへ制御移譲、という順序だ。

UEFI/BIOS起動メニューカーネル選択vmlinuz +initramfs 読込カーネルへGRUBはメニューを出し、選んだカーネルを読み込んで制御を渡す

電源投入後、ファームウェアから呼び出されたGRUBはまず起動メニューを表示する。ここには現在のカーネルに加え、アップデート前の古いカーネルなどが並ぶ。

ユーザは矢印キーで選んでEnterを押すか、数秒のカウントダウン後に既定の項目で自動起動する。

選ばれたカーネルに対して、GRUBはそのカーネル本体(vmlinuz)と、起動初期に使うinitramfsをメモリ上に読み込み、最後に制御をカーネルへ引き渡す。

💡
ポイント新しいカーネルで不具合が出たら、メニューから1つ前のカーネルを選んで起動できる。複数カーネルの管理が、いざというときの保険になる。

新しいカーネルを入れたあとに不具合が出たとき、メニューから1つ前のカーネルを選んで起動できる。この複数カーネルを管理する仕組みが、いざというときの保険になる。

📜 GRUBがカーネルに渡すもう一つのもの

GRUBがカーネルに渡すものは、カーネル本体とinitramfsだけではない。もう一つ、カーネルの起動時の挙動を変える文字列――カーネルコマンドライン(起動パラメータ)――も一緒に渡している。

root=/dev/sda2 はルートにするパーティション、quiet は起動メッセージの抑制、ro は最初は読み取り専用でルートをマウントする指定だ。

たとえば root=/dev/sda2 はどのパーティションをルートファイルシステムとして使うかの指定、quiet は起動メッセージを抑制する指定、ro は最初は読み取り専用でルートをマウントする指定だ。

これが分かると、トラブル対応の引き出しが増える。systemd環境で systemd.unit=rescue.target を一時的に足して最小構成のレスキューモードで起動する、パスワードを忘れたときに init=/bin/bash を渡してシェルだけを直接立ち上げる、といった緊急復旧もすべてこの仕組みの応用だ。

コツいま渡ったパラメータを確かめたいときは cat /proc/cmdline。GRUBで一時的に足した指定が効いているかの答え合わせに使える。

いま動いているカーネルへ実際にどのパラメータが渡されたのかを確かめたいときは、/proc/cmdline をcatで読むとそのまま見られる。GRUBで一時的に足したパラメータがちゃんと効いているかを、起動後にこの /proc/cmdline で答え合わせする。この確認の往復も覚えておくと役立つ。

✋ grub.cfg を手で直すと消える

ここがGRUBで最もつまずきやすい点だ。GRUBの設定の本体は /boot/grub2/grub.cfg(環境により /boot/grub/grub.cfg)だが、このファイルを手で直すと変更が消えてしまう。

つまずきgrub.cfg は自動生成ファイル。手で書き換えても次のカーネル更新などで再生成され、変更は上書きされる。触るのは元ファイルの方だ。

理由は、このファイルが自動生成されるものだからだ。手で書き換えても、次にカーネルを更新したタイミングなどで再生成され、変更は上書きされてしまう。

ここを編集する/etc/default/grub自動生成されるgrub.cfggrub2-mkconfig(update-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 を作り直す。

編集し終えたら grub2-mkconfig -o /boot/grub2/grub.cfg(Debian/Ubuntu系では update-grub)を実行して、設定から grub.cfg を作り直す。

この「元ファイルを編集 → 再生成」という二段構えこそ、GRUBを安全に設定する基本作法だ。

🔧 起動が途中で止まったら、その場で調べる

GRUBの強力なところは、その場限りの一時的な編集ができる点だ。起動メニューで対象の項目を選んだ状態で e キーを押すと、その項目の設定(カーネル行やパラメータ)を一時的に書き換えられる編集画面に入れる。

ここで起動パラメータを足したり直したりして Ctrl + x で起動すれば、ファイルには手を加えずにその回だけ違う条件で起動できる。

コツe キーで quiet を消して起動メッセージを全部表示させると、どこで止まっているかを目視で切り分けられる。原因切り分けの初手にうってつけだ。

たとえば quiet を消して起動メッセージを全部表示させ、どこで止まっているかを目視する、といった切り分けがすぐにできる。原因をまず切り分けたいときの初手にうってつけだ。

さらに c キーを押すとGRUBのコマンドラインに入り、ディスクやパーティションを手探りで指定して起動を試みることもできる。

この一時編集はあくまでその回限りで、再起動すれば元の grub.cfg の内容に戻る。だからまず試して効果を確かめてから、本当に必要な変更だけを /etc/default/grub に反映して恒久化する、という二段階で進めるのが安全だ。

🛟 OSが壊れても再インストールとは限らない

GRUBにまつわるよくある誤解として、「grub.cfg を直接書き換えれば設定が変わる」「OSが壊れた=必ず再インストール」という思い込みがある。

前者は再生成で消えるためほぼ徒労に終わる。後者も、GRUBメニューやレスキュー起動を使えば再インストールせずに復旧できるケースは少なくない。

実務では、カーネル更新後に起動しなくなったら旧カーネルで起動して原因を切り分ける、ルートディスクの指定がずれたらGRUBの一時編集で root= を直す、といった形で日常的に役立つ。

uname ……いま起動中のカーネルのバージョンやアーキテクチャを確認。lsblk ……ディスクとパーティションの構成を確認。

なお、いま起動しているカーネルのバージョンやアーキテクチャは uname で、ディスクとパーティションの構成は lsblk で確認できる。つまずいたら、まずこの2つで現状を把握する。それだけで指定ミスの多くは防げる。

この項目に出てくる用語

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

関連コマンド

unamelsblk

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