That's Done!

thatsdone's (mostly technical) memorandum

[ja] How to manage GRUB default kernel


最近、かなり久しぶりにvanilla kernelをビルドする機会があり、 kernelを切り替えて使いたい場合のGRUBの設定で気づいたことがあったのでメモ。

最近...といっても、20.04くらいからだろうか。submenu というものが導入され、昔のノウハウが効かなくなっている模様。

2024/10/14時点での情報。

Ubuntu 24.04 LTS時点での答

以下の手順でdefaultでbootに使われるkernelを切り替え可能。

  1. /etc/default/grub の GRUB_DEFAULT に saved を設定する
    • GRUB_DEFAULT=0GRUB_DEFAULT=saved
    • Ubuntuだと普通は0になっているので、ここの修正が必要ということ
    • なお、記事によっては、/etc/default/grub に GRUB_SAVEDEFAULT=true を設定するべしという説明がある。これを入れると、私の場合は、後述の grub-reboot コマンドによる一時的な切り替えが効かなくなった。
  2. grub-set-default で、'SUBMENU_ID>MENUENTRY_ID' の形式で指定する
    • SUBMENU_ID は sudo grep submenu /boot/grub/grub.cfg で調べる
    • MENUENTRY_ID は sudo grep menuentry /boot/grub/grub.cfg で調べる
    • 例: # sudo grub-set-default 'gnulinux-advanced-69cecedb-4058-4b83-8507-cca6498f4099>gnulinux-6.8.0-45-generic-advanced-69cecedb-4058-4b83-8507-cca6498f4099'
  3. # update-grub する
  4. # reboot する

これで指定したkernelがdefaultに切り替わる。

一時的に次にbootするkernelを切り替える場合

kernelそのものをいじっている場合など、次のboot時のみ一時的に切り替えたい等の場合は、grub-reboot コマンドが使える。

  1. /etc/default/grub の GRUB_DEFAULT が saved になっていることを確認する
  2. # grub-reboot 'SUBMENU_ID>MENUENTRY_ID'
  3. # update-grub する
  4. # reboot する

もう一度rebootすると、元のdefault kernelで起動される。

サンプル /boot/grub/grub.cfg

以下は私の、Ubuntu 22.04 から 24.04へ do-release-upgrade した環境の /boot/grub/grub.cfg の例。

162行目の $menuentry_id_option の後ろの gnulinux-advanced-32227d3a-e56d-453c-b030-d3c44576fa3f' が上記のSUBMENU_IDの例。

この環境では、そのままだと 163行目の 'Ubuntu, with Linux 6.8.0-45-generic' が使われるのだが、 190行目の 'gnulinux-5.15.0-122-generic-advanced-32227d3a-e56d-453c-b030-d3c44576fa3f' を使って # grub-set-default 'SUBMENU_ID>MENUENTRY_ID' すればよい。

ポイントは、私の場合は以下の2点だった。

  1. SUBMENU_ID と MENUENTRY_IDの間は > でスペースを空けずにつなぐ
  2. ' でquoteするのが安全
162 submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-32227d3a-e56d-453c-b030-d3c44576fa3f' {
163         menuentry 'Ubuntu, with Linux 6.8.0-45-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.8.0-45-    generic-advanced-32227d3a-e56d-453c-b030-d3c44576fa3f' {
164                 recordfail
165                 load_video
166                 gfxmode $linux_gfx_mode
167                 insmod gzio
168                 if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzop    io; fi
169                 insmod part_msdos
170                 insmod ext2
171                 search --no-floppy --fs-uuid --set=root 32227d3a-e56d-453c-b    030-d3c44576fa3f
172                 echo    'Loading Linux 6.8.0-45-generic ...'
173                 linux   /boot/vmlinuz-6.8.0-45-generic root=UUID=32227d3a-e5    6d-453c-b030-d3c44576fa3f ro
174                 echo    'Loading initial ramdisk ...'
175                 initrd  /boot/initrd.img-6.8.0-45-generic
176         }

(snip)

190         menuentry 'Ubuntu, with Linux 5.15.0-122-generic' --class ubuntu --c    lass gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-    122-generic-advanced-32227d3a-e56d-453c-b030-d3c44576fa3f' {
191                 recordfail
192                 load_video
193                 gfxmode $linux_gfx_mode
194                 insmod gzio
195                 if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzop    io; fi
196                 insmod part_msdos
197                 insmod ext2
198                 search --no-floppy --fs-uuid --set=root 32227d3a-e56d-453c-b    030-d3c44576fa3f
199                 echo    'Loading Linux 5.15.0-122-generic ...'
200                 linux   /boot/vmlinuz-5.15.0-122-generic root=UUID=32227d3a-    e56d-453c-b030-d3c44576fa3f ro
201                 echo    'Loading initial ramdisk ...'
202                 initrd  /boot/initrd.img-5.15.0-122-generic
203         }

Xenを入れる場合

(2025/04/26追記)

最近、事情でxen-system-(amd64|arm64)を使う必要が発生した。 UbuntuでXenを使う場合、Ubuntu 24.04だとうまくdom0を起動できない…という話もあって、このメモはUbuntu 22.04が前提になるが、 この件は24.04でXenが動くようにしたとしても構造上、共通だと思われる。

発生する問題は、xen-system-amd64(等)を入れると、grub-set-defaultやgrub-rebootでの切り替えが効かなくなる。

これは、xen-system-(amd64|arm64)を入れると /etc/default/grub.d/xen.cfg が追加され、こんな処理を追加しているためである。

$ grep -Ev ^\(#\|$\)  /etc/default/grub.d/xen.cfg
echo "Including Xen overrides from /etc/default/grub.d/xen.cfg"
if [ "$XEN_OVERRIDE_GRUB_DEFAULT" = "" ]; then
        echo "WARNING: GRUB_DEFAULT changed to boot into Xen by default!"
        echo "         Edit /etc/default/grub.d/xen.cfg to avoid this warning."
        XEN_OVERRIDE_GRUB_DEFAULT=1
fi
if [ "$XEN_OVERRIDE_GRUB_DEFAULT" = "1" ]; then
        GRUB_DEFAULT=$( \
                printf "$(gettext "%s, with Xen hypervisor")" \
                "$GRUB_DISTRIBUTOR GNU/Linux")
fi

私は /etc/default/grub に

# view /etc/default/grub
(snip)
  6 XEN_OVERRIDE_GRUB_DEFAULT=0  ★これ
  7 #GRUB_DEFAULT=0
  8 GRUB_DEFAULT=saved
(snip)

という行を追加することで対応したが、上記の処理を見てわかる通り、"1" 以外なら何でもよい。

最初見落としていたのだが、update-grubする時に以下のようなWARNINGが出ていて、ちゃんとメッセージを読めよという話なのだった。

(snip)
Including Xen overrides from /etc/default/grub.d/xen.cfg
WARNING: GRUB_DEFAULT changed to boot into Xen by default!
         Edit /etc/default/grub.d/xen.cfg to avoid this warning.
Generating grub configuration   file    ...
(snip)

References

  • Grubで前に起動したシステムを記憶する
    • https://www.terakin.com/ja/blog/archives/129
    • /etc/default/grub に GRUB_SAVEDEFAULT=true が必要という説明がある。Windowsとのdual boot環境で、Linuxが普段使いだがWindows Updateでrebootを繰り返す...といった場合はこの記事に従うのがよいようだ。
  • How to get grub2 to remember last choice?
    • https://askubuntu.com/questions/148662/how-to-get-grub2-to-remember-last-choice
  • Setting the desired kernel in GRUB menu
    • https://askubuntu.com/questions/1526087/setting-the-desired-kernel-in-grub-menu
    • /etc/grub.d/40_custom/ にファイルを作るやりかた
    • Windows等とdual以上のboot環境にしたい場合に使うみたいだ
  • How do you change and set the default Kernel in Ubuntu Machine?
    • https://mnzel.medium.com/how-do-you-change-and-set-the-default-kernel-in-ubuntu-machine-7ad1107e1b6f
    • 自分としてはコレがアタリだった