• 作成:

GRUBで複数のWindowsのブートを管理した時のトラブルシューティングメモ

要約

GRUBが複数Windowsを認識しなかった時のトラブルシューティングメモ。

GRUBがあるはずのパーティションを認識していない時はMBR(MSDOS)であることを疑いましょう。

システム構成

3枚のSSDを使い、 Gentoo GNU/Linuxが2枚をRAID 0で使って、ゲーム用のWindowsが1枚のSSDをパーティション分割で使っています。 3枚めを業務のWindows専用にしています。

問題

os-prober動かないなと思って自分で40_customを書くことにしました。

最近os-proberがDockerに反応しまくるのでそれ自体は良し。生成内容もシンプルですし。

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'Windows Boot Manager(game)' --class windows --class os {
  insmod part_gpt
  insmod fat
  search --no-floppy --fs-uuid --set=root AA7F-9958
  chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

menuentry 'Windows Boot Manager(work)' --class windows --class os {
  insmod part_gpt
  insmod fat
  search --no-floppy --fs-uuid --set=root A652-B930
  chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

これでgameの方は起動するんですが、 workの方は起動しません。

No Such Deviceになります。

ちゃんと、 GRUB - ArchWiki を読んで、

grub-probe --target=fs_uuid

で出力されるものを入れて、 lsblkでも一致することを確認してるんですが… なぜ?

やりたくないこと

UEFIの画面でブートパーティションを選べば当然起動できますが、それはやりたくないことです。

GRUBの画面の方がまだ操作しやすいのでGRUBで操作したい。 UEFIをカチカチ弄るのはしんどい…

問題原因候補

Windows(work)はBitLockerで暗号化されているから?

でも指定してるのはEFIパーティションだし、 EFIパーティションは、

sudo mount UUID=A652-B930 /mnt/tmp

でちゃんとマウント出来ますね。

このパーティションがNo Such Deviceとなるので、本体のパーティションがBitLocker暗号化されているのは関係なさそう。

パーティションが違うSSDにあるから?

Windows(game)はEFIパーティションも、 Windows本体のパーティションも同じSSDに載っています。

nvme0n1p2にインストールしたGRUBがnvme0n1p4のWindowsを起動する形になっています。 Windows Boot Managerも同じEFIパーティションnvme0n1p2に存在します。

これが可能性高そう。

既に同じ問題に突き当たってる人が居た

Dual boot: Windows installation won't boot due to GRUB "no such device" error - Support / Installation & Boot - Manjaro Linux Forum の状況が今の状況に近そう。

しかし一つのWindowsだと再インストールしてWindows Boot Managerに投げるだけで問題ないですが、今回みたいに複数のWindowsが存在して特定のデバイスのWindowsを起動したい場合はどうにもならなくないですか?

efibootmgrで登録されているEFIにSwitchすれば良いのでは

2021-11-30T21:45:54 ❯ efibootmgr
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0001,0005,0004,0003
Boot0000* gentoo
Boot0001* Windows Boot Manager
Boot0003  Hard Drive
Boot0004  CD/DVD Drive
Boot0005* Windows Boot Manager

のようにEFIは既に2つのWindowsを把握しています。

これに移るようにGRUBを設定できたらUEFIの問題になるのでGRUB側で探索できないなどの問題は発生しないのでは。

方法がわからない。

GRUBのconsoleで見てみたがどうもおかしい

GRUB consoleのls -lで全パーティションを見てみましたが、どうもWindows(work)が入っているパーティションを認識していない。

1パーティション目はvfat…

あああああああああああええええ

dos!!!

ディスクラベルがDOSになってる!!!

だからGRUBはおそらく認識しない! UEFIモードのモジュールだから!

GPTではなくMBR(DOS)パーティションをGRUBに扱わせたい

内容を損なわずにMBRをGPTに変換できる自信が無いので、 GRUBにMBRを見てほしい。

menuentry 'Windows Boot Manager(work)' --class windows --class os {
  insmod part_msdos
  insmod fat
  search --no-floppy --fs-uuid --set=root A652-B930
  chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

これで起動するようになりました。終わり。

エントリに書くんじゃなくてgrub-installする時にmodulesに指定した方が良いかもしれない。