症状
症状としては,アップデート後にgrubのOS選択画面が表示されなくなる.
grubはGRUB_TIMEOUT
によってタイムアウトが設定されているのだが,そもそもOSが一つしかない場合はgrub自体の画面が表示されない.
今回は,どうやらgrubがデュアルブートしているWindowsを検出しなくなったため,OSの選択肢がひとつだけになりgrubの選択画面が消えたようだ.
ちなみに,grubの画面自体を表示するだけなら,
# GRUB_TIMEOUT=10 GRUB_TIMEOUT_STYLE=menu GRUB_HIDDEN_TIMEOUT_QUIET=false
みたいなことをするだけで,表示されるようになる.Linuxしか選択できなかったが.
原因と対策
これ系を調べるとsudo update-grub
すれば良いとかsudo grub-mkconfig
すればいいとか,そんな適当な情報しかでてこないのだが,これらでは解決しなかった.
原因はgrub-mkconfigがos-proberを実行しないことにあった.
実際update-grubしてみると,
$ sudo update-grub Generating grub configuration file ... Found theme: /usr/share/grub/themes/manjaro/theme.txt Found linux image: /boot/vmlinuz-5.10-x86_64 Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.10-x86_64.img Found initrd fallback image: /boot/initramfs-5.10-x86_64-fallback.img Found linux image: /boot/vmlinuz-5.9-x86_64 Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.9-x86_64.img Found initrd fallback image: /boot/initramfs-5.9-x86_64-fallback.img Warning: os-prober will not be executed to detect other bootable partitions. Systems on them will not be added to the GRUB boot configuration. Check GRUB_DISABLE_OS_PROBER documentation entry. Adding boot menu entry for UEFI Firmware Settings ... Found memtest86+ image: /boot/memtest86+/memtest.bin done
というような表示になる.linuxは検出しているが,Windowsを検出した気配がない. で,重要なことが書いてある.
Warning: os-prober will not be executed to detect other bootable partitions.
そう,実行されてないのだ. os-proberはbootできそうなosを見つけてくれるプログラムなのだが,linuxは自分自信だからいいとして,今起動していないWindowsはこいつで自動的に見つけてgrubが設定を作ってくれるはずだった.
ちなみにこいつを単体で実行すると,
$ sudo os-prober /dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi
ちゃんとWindowsを見つけてくれる. というわけでこれを実行できるようにしてやれば良い.
/usr/bin/grub-mkconfig
を開いてみると,
# Disable os-prober by default due to security reasons. GRUB_DISABLE_OS_PROBER="true"
となっている.やはりgrubからos-proberの呼び出しが無効化されている.
というわけでこれを有効化するのだが,別にgrub-mkconfigを編集してもよいのだが,生成済みの/etc/default/grub
からも上書きできるので,こちらを編集する.
GRUB_DEFAULT=saved GRUB_TIMEOUT=10 GRUB_TIMEOUT_STYLE=hidden GRUB_DISTRIBUTOR="Manjaro" GRUB_CMDLINE_LINUX_DEFAULT="text apparmor=1 security=apparmor udev.log_priority=3 nouveau.modeset=0 libata.force=noncq irqpoll" GRUB_CMDLINE_LINUX="" GRUB_DISABLE_OS_PROBER=false
あとは,
$ sudo update-grub Generating grub configuration file ... Found theme: /usr/share/grub/themes/manjaro/theme.txt Found linux image: /boot/vmlinuz-5.10-x86_64 Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.10-x86_64.img Found initrd fallback image: /boot/initramfs-5.10-x86_64-fallback.img Found linux image: /boot/vmlinuz-5.9-x86_64 Found initrd image: /boot/amd-ucode.img /boot/initramfs-5.9-x86_64.img Found initrd fallback image: /boot/initramfs-5.9-x86_64-fallback.img Warning: os-prober will be executed to detect other bootable partitions. It's output will be used to detect bootable binaries on them and create new boot entries. Found Windows Boot Manager on /dev/sdb1@/EFI/Microsoft/Boot/bootmgfw.efi Adding boot menu entry for UEFI Firmware Settings ... Found memtest86+ image: /boot/memtest86+/memtest.bin done
と,無事にWindowsを検出してくれる.
そもそもos-proberなんで無効になってるの?
同じ疑問を抱いた人がいた. forum.manjaro.org
grub2のセキュリティアップデートにより無効化されている. 該当するアップデートは
で,UEFI Secure BootのCVEに対応するためと思われる.
修正はこれ.
別の方法
os-proberを使わなくても,/etc/grub.d/40_custom
に自分でWindowsのエントリを書けば,それでgrubからOS選択はできる(設定が間違ってなければ).
というわけでそういう方法もある.詳しくはArchWikiを見て.