マルチブート(デュアルブート)環境で電源を入れると、ブートローダーのメニューが表示されます。何も操作しなければデフォルトのOSが自動起動しますが、「LinuxをデフォルトにしたいのにWindowsが起動してしまう」「検証用のOSを毎回手動で選んでいる」といった状況は実務でよくあります。
かつてはLILO(Linux Loader)がブートローダーとして広く使われていましたが、現在のLinuxディストリビューションではほぼ廃止されており、標準はGRUB2(GRand Unified Bootloader 2)です。この記事ではGRUB2でデフォルト起動OSを変更する実務手順を、ディストリビューション別の反映コマンドも含めて解説します。
まず結論:設定ファイル1行を変えてコマンド1本で反映
/etc/default/grub の GRUB_DEFAULT を変更し、設定反映コマンドを実行するだけです。手順全体は次の3ステップです。
# ステップ1: 現在のエントリー番号を確認(Ubuntu/Debian系)
grep -E "^menuentry" /boot/grub/grub.cfg | awk -F"'" '{print NR-1"\t"$2}'
# ステップ2: 設定ファイルを編集(sudoで実行)
sudo vi /etc/default/grub
# GRUB_DEFAULT=0 → 変更したいエントリー番号または名前に書き換える
# ステップ3: 設定を反映(Ubuntu/Debian系)
sudo update-grub
再起動後に変更が有効になります。RHEL系(AlmaLinux・Rocky Linux・Fedoraなど)での反映コマンドは後述します。
現在のGRUBエントリー一覧を確認する
インデックス番号で指定する場合は、まず現在登録されているエントリーを確認します。番号は0始まりです。
# Ubuntu / Debian 系
grep -E "^menuentry" /boot/grub/grub.cfg | awk -F"'" '{print NR-1"\t"$2}'
# RHEL 8/9 / AlmaLinux / Rocky Linux 系
grep -E "^menuentry" /boot/grub2/grub.cfg | awk -F"'" '{print NR-1"\t"$2}'
出力例(デュアルブート環境):
0 Ubuntu
1 Ubuntu, with Linux 6.8.0-1057-generic (recovery mode)
2 Windows Boot Manager (on /dev/sda1)
Windowsをデフォルトにしたければ GRUB_DEFAULT=2、Ubuntuに戻すなら GRUB_DEFAULT=0 を設定します。
/etc/default/grub でデフォルトエントリーを指定する
実際の設定は /etc/default/grub の GRUB_DEFAULT 行で行います。指定方法は3種類あり、用途に応じて使い分けます。
インデックス番号で指定する
GRUB_DEFAULT=0
記述はシンプルですが、カーネルアップデートによって番号がずれるリスクがあります。安定運用には次の「名前指定」を推奨します。
エントリー名(文字列)で指定する(推奨)
GRUB_DEFAULT="Ubuntu"
grub.cfg の menuentry 行に書かれた名前をそのまま指定します。ダブルクォートで囲む点に注意してください。サブメニュー配下のエントリーを指定する場合は > で区切ります。
# サブメニュー配下のエントリーを指定する場合
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-1057-generic"
最後に選択したOSを次回も起動する(saved)
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
メニューで手動選択したエントリーを記憶し、次回起動時も同じOSが自動選択されます。複数のOSを使い分ける共用機や検証環境でよく採用される設定です。
設定をGRUBに反映する(ディストリビューション別)
/etc/default/grub を編集したら必ず反映コマンドを実行します。このコマンドを忘れると再起動後も変更は有効になりません。
# Ubuntu / Debian / Linux Mint
sudo update-grub
# RHEL 8/9 / AlmaLinux / Rocky Linux(BIOSブート)
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# RHEL 8/9 / AlmaLinux / Rocky Linux(UEFIブート・RHEL/CentOS Stream)
sudo grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# AlmaLinux(UEFIブート)
sudo grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
# Fedora / openSUSE
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
UEFIかBIOSかを確認するには以下を実行します。
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "BIOS"
正常に反映されると、update-grub の場合は Found Windows Boot Manager on /dev/sda1 のようにエントリーを検出したメッセージが出力されます。エラーなく終了したことを確認してから再起動してください。
次回の起動だけ別エントリーで起動したいとき
ある運用現場では「ふだんはLinuxをデフォルトにしたまま、今回の再起動だけWindowsで確認作業をしたい」という場面があります。そのときは grub-reboot が便利です。
# エントリー番号2(Windows)を次回起動のみ選択
sudo grub-reboot 2
sudo reboot
# 名前で指定することも可能
sudo grub-reboot "Windows Boot Manager (on /dev/sda1)"
grub-reboot は一時的な設定変更のため、次回以降は元のデフォルトOSに戻ります。/etc/default/grub の変更と反映コマンドは不要です。
カーネル更新後のインデックスずれと対策
インデックス番号(数値)でデフォルトを指定している場合、カーネルアップデートによって grub.cfg に新しいエントリーが追加されると番号がずれます。「アップデート後にWindowsが起動しなくなった」「意図しないカーネルが起動するようになった」という事例は実務でも報告されています。
安全な対策は以下の2点です。
- 名前(文字列)で指定する:
GRUB_DEFAULT="Ubuntu"のようにエントリー名で指定することで、エントリーの追加・削除による番号ずれを回避できます。 GRUB_DEFAULT=savedを使う:最後に手動で選択したエントリーを記憶させる設定で、番号に依存しません。
あわせてメニューの表示時間(タイムアウト)も設定しておくと、意図せず自動起動してしまうリスクを減らせます。
# /etc/default/grub
GRUB_TIMEOUT=10 # 10秒間メニューを表示してから自動起動
変更後は必ず update-grub または grub2-mkconfig で反映してください。反映し忘れた場合は設定が無効のままになります。反映が成功したかどうかは、コマンド終了後に /boot/grub/grub.cfg(または /boot/grub2/grub.cfg)の更新日時を ls -l で確認するのが確実です。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
