Arch Linux / Windows のデュアルブートで 'Reboot and Select Proper Boot Device' エラー
July 20, 2020
開発用の自作PCへArch Linuxを入れてとくに不便なく使えていたのだが、DTMやゲーム用途で使っていたもう一台のWindows自作環境に寿命が来たことにより、デュアルブート環境を作り始めた。
Linux/Windows のデュアルブートをセットアップする場合、最初に Windows をインストールするのが推奨されます。Windows はディスクの一部を使ってパーティションを作ります。Windows のセットアップが終わったら、Linux のインストール環境にブートして、既存の Windows のパーティションには触れずに Linux 用のパーティションを作成することができます。Windows をインストールすると、Linux のブートローダーから使うことができる EFI System Partition が作成されます。
との記載があったのだが、既存のLinux環境を作り直してWindowsを先にインストールするのも面倒であることと、SSDを別にして切り離してインストールすれば大丈夫だろうと考えていた。
計画では、以下のSATAのドライブスイッチャーを使ってSSDごと切り替えることで、Linux / Windowsの切り替えを行う予定で、こうすることで、パーティション分割で疲弊せず、将来自作マシンをまた組むときにSSDごと移植できると思っていた。
が、別SSDにWindowsをインストールしたところ、LinuxのSSDから起動の際に Reboot and Select Proper Boot Device
で起動できなくなってしまった。BIOSから起動順なども確認したが変わらない。
原因
UEFIブートへの理解が足りていなかったのだが、NVRAMの設定がWindowsのブートローダーに書き換わっていることが原因だった。SSDを物理スイッチで切り替えるのではなく、ブートはgrubから両方呼び出せるようにすることにした。
grubを再インストール
ひとまず、Linuxが起動できないので、ArchLinux用のインストールメディアを用意してそこから復旧していく。
- ArchLinux用のインストールメディア を利用してArchLinuxを起動する。
- rootでzshが立ち上がったら
lsblk
やfdisk -l
などでパーティションやディスクを確認。 - インストール時同様にマウントする。
mount /dev/sda3 /mnt
mount /dev/sda2 /mnt/boot
mount /dev/sda1 /mnt/boot/efi
- マウント先へchroot。
arch-chroot /mnt /bin/bash
- ブートローダーの再インストール。
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch --boot-directory=/boot/efi/EFI --recheck
grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg
grubでArch LinuxとWindowsを選べるようにする
os-prober を利用することで、システム上のディスクからOSを探し出してブートローダーに追加することができる。
- NTFSを読み書きできるようにし、os-proberでWindows Boot Managerが検出できたら、
grub-mkconfig
で反映する。
pacman -S os-prober ntfs-3g
os-prober
/dev/sdb1@/efi/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager: Windows:efi
grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg
- chrootから抜けてシャットダウン。インストールメディアが無くとも起動でき、起動時に起動するOSを選択できるようになっている。
exit
shutdown -h now
トラブルシューティング
os-prober インストール時に 「signature from “Levente Polyak (anthraxx) levente@leventepolyak.net” is unknown trust」で失敗する。
keyringをアップデートしてから再度試す。
pacman -Sy archlinux-keyring && pacman -Syyu
os-proberでWindows Boot Managerが検出できているが、grubのメニューにWindowsが出てこない。
カスタムで作る。
lsblk
やos-prober
などで、Windowsのブートローダーのパーティションを確認し、blkid
でUUIDを調べる。
blkid /dev/sdb1
/dev/sdb1: LABEL_FATBOOT="EFI" LABEL="EFI" UUID="HOGEHOGE" TYPE="fuga" .......
/etc/grub.d/40_custom
へ以下のように追加する。
menuentry "Windows10" --class windows --class os {
insmod ntfs
search --no-floppy --set=root --fs-uuid=上記で取得したUUID
ntldr /bootmgr
}
- 反映する。
grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg