ManjaroのgrubがデュアルブートしているWindowsを認識しなくなった

症状

症状としては,アップデート後にgrubのOS選択画面が表示されなくなる. grubGRUB_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のセキュリティアップデートにより無効化されている. 該当するアップデートは

wiki.ubuntu.com

で,UEFI Secure BootのCVEに対応するためと思われる.

修正はこれ.

git.savannah.gnu.org

別の方法

os-proberを使わなくても,/etc/grub.d/40_custom に自分でWindowsのエントリを書けば,それでgrubからOS選択はできる(設定が間違ってなければ). というわけでそういう方法もある.詳しくはArchWikiを見て.

wiki.archlinux.jp

参考

rionaoki.net

askubuntu.com