2026年5月17日
2026年5月17日
GRUBの設定変更と起動修復の方法|カーネルパラメータ・既定カーネル・再インストール
GRUB は多くの Linux ディストリビューションで使われているブートローダーで、起動メニューの表示、起動するカーネルの選択、カーネルに渡すパラメータの指定を受け持ちます。
この記事では、GRUB の設定を変える基本の手順と、GRUB が壊れて OS が起動しなくなったときの修復手順を説明します。Ubuntu・Debian 系と、RHEL・AlmaLinux・Rocky Linux などの RHEL 系では、コマンドと推奨される手順が異なるので分けて書いています。内容は2026年10月時点の Ubuntu 24.04 と RHEL 9 系の公式ドキュメントに基づいています。
起動にかかわる設定なので、作業の前にスナップショットやバックアップを取り、リモートのサーバーではコンソール(VPS やクラウドの管理画面の画面接続など)を使える状態にしておいてください。
設定ファイルと反映のしかた
GRUB の設定は /etc/default/grub に書き、コマンドで起動用の grub.cfg を生成し直して反映します。grub.cfg は自動生成されるファイルなので、直接編集しません(次の生成で上書きされます)。
| ディストリビューション | 生成するコマンド | 生成されるファイル |
|---|---|---|
| Ubuntu・Debian | sudo update-grub |
/boot/grub/grub.cfg |
| RHEL 9 系 | sudo grub2-mkconfig -o /boot/grub2/grub.cfg |
/boot/grub2/grub.cfg |
update-grub は grub-mkconfig -o /boot/grub/grub.cfg を実行する Debian 系のコマンドです。RHEL 9 系では UEFI の機種でも本体は /boot/grub2/grub.cfg で、/boot/efi/EFI/redhat/grub.cfg は本体を読み込むだけの小さなファイルです。こちらを grub2-mkconfig で上書きしないでください。
/etc/default/grub の主な項目
Ubuntu 24.04 の初期状態は次のとおりです。
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0
GRUB_DISTRIBUTOR=`( . /etc/os-release; echo ${NAME:-Ubuntu} ) 2>/dev/null || echo Ubuntu`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
| 項目 | 意味 |
|---|---|
GRUB_DEFAULT |
既定で起動するメニュー項目。0 は先頭。saved にすると前回選んだ項目などを記憶して使う |
GRUB_TIMEOUT |
メニューを表示して待つ秒数 |
GRUB_TIMEOUT_STYLE |
menu でメニューを表示、hidden で表示せずに待つ |
GRUB_CMDLINE_LINUX |
すべての起動項目(リカバリーモードを含む)でカーネルに渡すパラメータ |
GRUB_CMDLINE_LINUX_DEFAULT |
通常の起動項目だけに渡すパラメータ(リカバリーモードには付かない) |
起動メニューを表示する
Ubuntu の初期状態ではメニューが表示されません。毎回表示したいときは次のように変えて、sudo update-grub を実行します。
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
設定を変えずに一度だけメニューを出したいときは、電源を入れた直後に、UEFI の機種では Esc キーを、BIOS の機種では Shift キーを押します。
カーネルパラメータを追加する
一度だけ試す
起動メニューで項目を選んで e キーを押すと、その起動の設定を編集できます。linux で始まる行の末尾にパラメータを書き足し、Ctrl+X(または F10)で起動します。この変更は保存されないので、パラメータを試すときや、設定の誤りで起動しないときの回避に使えます。
恒久的に設定する(Ubuntu・Debian)
/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT(すべての項目に付けたい場合は GRUB_CMDLINE_LINUX)に書き足し、grub.cfg を生成し直します。
sudo nano /etc/default/grub
# 例: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never"
sudo update-grub
sudo reboot
恒久的に設定する(RHEL 9 系)
RHEL 9 系では、カーネルごとの起動設定が /boot/loader/entries/ に置かれる方式(BootLoaderSpec)になっており、パラメータの変更には grubby を使うのが公式の手順です。
# すべてのカーネルにパラメータを追加する
sudo grubby --update-kernel=ALL --args="transparent_hugepage=never"
# パラメータを削除する
sudo grubby --update-kernel=ALL --remove-args="transparent_hugepage"
# 各カーネルの設定を確認する
sudo grubby --info=ALL
反映を確かめる
再起動したあと、今のカーネルに渡されたパラメータを確認します。
cat /proc/cmdline
既定で起動するカーネルを変える
Ubuntu・Debian
Ubuntu では、古いカーネルは「Advanced options for Ubuntu」という下位メニュー(submenu)の中に入っています。そのため GRUB_DEFAULT=2 のような単純な番号では、下位メニューの中の項目を選べません。項目の名前を確認して、下位メニューの名前>項目の名前 の形で指定します。
# メニュー項目と下位メニューの名前を一覧する
grep -E "^\s*(menuentry|submenu) " /boot/grub/grub.cfg | cut -d "'" -f2
# /etc/default/grub の例(名前は上の一覧の表示に合わせる)
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-45-generic"
番号で書く場合は "1>2"(上から2番目にある下位メニューの、中の3番目の項目)のように、どちらも0から数えます。変更したら sudo update-grub を実行します。
起動する項目をコマンドで切り替えたいときは、GRUB_DEFAULT=saved にして update-grub を実行したうえで、次のコマンドを使います。
# 既定の項目を変える
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-45-generic"
# 次の1回の起動だけ別の項目にする(新しいカーネルを試すときに便利)
sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-45-generic"
RHEL 9 系
# インストールされているカーネルを確認する
sudo grubby --info=ALL | grep -E "^(index|kernel)"
# 既定のカーネルを変える
sudo grubby --set-default=/boot/vmlinuz-5.14.0-503.11.1.el9_5.x86_64
# 今の既定を確認する
sudo grubby --default-kernel
カーネルのファイル名は、--info=ALL の表示に合わせてください。
起動しなくなった GRUB を修復する
GRUB 自体が壊れた、ディスクを入れ替えた、別の OS のインストールで起動の設定が上書きされた、といった場合は、ライブ USB(インストールメディア)から起動して GRUB を入れ直します。
1. 起動方式と対象のパーティションを確かめる
ライブ USB で起動し、端末を開いて確認します。
# UEFI で起動しているか(表示されれば UEFI、エラーなら BIOS)
ls /sys/firmware/efi
# ディスクとパーティション、ファイルシステムの種類を確認する
lsblk -f
ライブ USB も、インストール済みの OS と同じ起動方式(UEFI か BIOS か)で起動してください。UEFI の場合は、vfat で数百 MB 程度の EFI システムパーティション(ESP)も確認しておきます。ディスク名は環境によって /dev/sda・/dev/vda・/dev/nvme0n1 などと変わります。以下は、ルートが /dev/sda2、ESP が /dev/sda1 の例です。LVM を使っている場合は、先に sudo vgchange -ay でボリュームを有効にし、/dev/mapper/... をマウントします。
2. マウントして chroot する(Ubuntu・Debian)
# インストール済みの OS のルートをマウントする
sudo mount /dev/sda2 /mnt
# /boot を別のパーティションにしている場合はマウントする
# sudo mount /dev/sda3 /mnt/boot
# UEFI の場合は ESP をマウントする
sudo mount /dev/sda1 /mnt/boot/efi
# chroot の中でコマンドが動くように、仮想ファイルシステムをつなぐ
for d in /dev /dev/pts /proc /sys /run; do sudo mount --bind $d /mnt$d; done
sudo chroot /mnt
3. GRUB を入れ直す(Ubuntu・Debian)
chroot の中で実行します。grub-install の対象は、BIOS の場合はパーティション(/dev/sda1)ではなくディスク全体(/dev/sda)です。
# BIOS の場合
grub-install /dev/sda
update-grub
# UEFI の場合: EFI 変数が見えるようにする(中身が空のときだけマウントする)
[ -n "$(ls -A /sys/firmware/efi/efivars)" ] || mount -t efivarfs efivarfs /sys/firmware/efi/efivars
grub-install --target=x86_64-efi --efi-directory=/boot/efi
update-grub
Ubuntu でセキュアブートを使っている場合は、署名つきのパッケージも入れ直しておきます(apt install --reinstall grub-efi-amd64-signed shim-signed)。
終わったら chroot を抜けて、マウントを外して再起動します。
exit
sudo umount -R /mnt
sudo reboot
RHEL 9 系の場合
RHEL 9 系では、インストールメディアの「Troubleshooting」から「Rescue a … system」を選ぶと、インストール済みのシステムが /mnt/sysroot にマウントされます。chroot /mnt/sysroot で入ってから作業します。
# BIOS の場合
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
# UEFI の場合: grub2-install は使わず、パッケージを入れ直す
dnf reinstall grub2-efi shim
grub2-mkconfig -o /boot/grub2/grub.cfg
RHEL 系の UEFI では、セキュアブートに対応した署名つきの GRUB がパッケージで配られているため、grub2-install ではなくパッケージの入れ直しで修復するのが公式の手順です。インストールされているパッケージ名は rpm -qa | grep -E "grub2-efi|shim" で確認できます。
注意点
grub.cfgは直接編集せず、/etc/default/grub(RHEL 9 系はgrubby)で変更して生成し直します。- 設定を変えたら、再起動の前に
grub.cfgの生成がエラーなく終わったことを確認します。 - 古いカーネルを1つ以上残しておくと、新しいカーネルで起動できなかったときに、起動メニューから古いカーネルを選んで復旧できます。
grub-install/grub2-installの対象ディスクを間違えると、別のディスクの起動設定を上書きします。lsblkで確かめてから実行します。
まとめ
- 設定は
/etc/default/grubに書き、Ubuntu・Debian はupdate-grub、RHEL 9 系はgrub2-mkconfig -o /boot/grub2/grub.cfgで反映する - カーネルパラメータは
GRUB_CMDLINE_LINUX_DEFAULT/GRUB_CMDLINE_LINUX、RHEL 9 系はgrubby --update-kernel=ALL --args=...で追加する - 既定カーネルは、Ubuntu では下位メニューを含む名前で
GRUB_DEFAULTに指定するかgrub-set-defaultを使い、RHEL 9 系はgrubby --set-defaultを使う - 修復はライブ USB から起動し、マウントと chroot のあとで
grub-installとupdate-grubを実行する。RHEL 系の UEFI はdnf reinstall grub2-efi shim - 反映後は
cat /proc/cmdlineで確認する
関連記事: