EFIブートのgrubの項目を復旧したい

なにかの拍子にEFIブートのgrubの項目が消えてしまった。 復旧方法を調査中。うまくいっていないようなので、あくまでメモとして残しておく。

1. Linuxで復旧

grubが起動できないので、当然ながら対象のLinuxも起動できない。 なので、USBライブメディアLinuxを起動し、chrootでインストール済の環境に入ってgrubを復旧する。

インストール済のLinuxに関連するパーティション、具体的には/, /boot/, /boot/efiなどをマウントしておく。

chroot環境を準備する。

mkdir chroot
sudo mount --bind /media/root ./chroot
sudo mount --bind /media/boot ./chroot/boot
sudo mount --bind /media/esp ./chroot/boot/efi
sudo mount --bind /proc ./proc
sudo mount --bind /dev ./dev
sudo mount --bind /dev/pts ./dev/pts
sudo mount --bind /sys ./sys
sudo mount --bind /sys/firmware/efi/efivars ./chroot/sys/firmware/efi/efivars

chroot環境でgrubをインストールする

sudo chroot ./chroot /bin/bash --login -i
grub-install /dev/nvme0n1 # ディスク名は適宜変更
exit

以上。

ただし、当方のマシンではなぜかこれをしても、項目が消えてしまった。原因不詳。

2. Windowsで復旧

Windowsのbcdeditで復旧する。

管理者権限でターミナルを起動。

EFIブートの項目を列挙

bcdedit /enum firmware /v

descriptionがWindows Boot Managerとなっているものの、identifierを確認し、メモする。

この項目をコピーする。

bcdedit /copy {identifier} /d "Ubuntu"

注:powershellの場合はbcdeditの直後に--%を追加してbcdedit --% /copy ...とする。

再びEFIブートの項目を列挙

bcdedit /enum firmware /v

descriptionがUbuntuとなっているものの、identifierを確認し、メモする。

この項目のefiファイルをgrubに変更する。

bcdedit /set {identifier} path \EFI\ubuntu\grubx64.efi