最近、かなり久しぶりにvanilla kernelをビルドする機会があり、 kernelを切り替えて使いたい場合のGRUBの設定で気づいたことがあったのでメモ。
最近...といっても、20.04くらいからだろうか。submenu というものが導入され、昔のノウハウが効かなくなっている模様。
2024/10/14時点での情報。
Ubuntu 24.04 LTS時点での答
以下の手順でdefaultでbootに使われるkernelを切り替え可能。
- /etc/default/grub の GRUB_DEFAULT に saved を設定する
GRUB_DEFAULT=0
→GRUB_DEFAULT=saved
- Ubuntuだと普通は0になっているので、ここの修正が必要ということ
- なお、記事によっては、/etc/default/grub に
GRUB_SAVEDEFAULT=true
を設定するべしという説明がある。これを入れると、私の場合は、後述の grub-reboot コマンドによる一時的な切り替えが効かなくなった。
- 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'
- SUBMENU_ID は
# update-grub
する# reboot
する
これで指定したkernelがdefaultに切り替わる。
一時的に次にbootするkernelを切り替える場合
kernelそのものをいじっている場合など、次のboot時のみ一時的に切り替えたい等の場合は、grub-reboot
コマンドが使える。
- /etc/default/grub の GRUB_DEFAULT が saved になっていることを確認する
# grub-reboot 'SUBMENU_ID>MENUENTRY_ID'
# update-grub
する# 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点だった。
- SUBMENU_ID と MENUENTRY_IDの間は
>
でスペースを空けずにつなぐ '
で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 }
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
- 自分としてはコレがアタリだった