移动 /boot 挂载点后修复 GRUB2 UEFI 引导加载程序 MBR

移动 /boot 挂载点后修复 GRUB2 UEFI 引导加载程序 MBR

我已在驱动器上安装了基于 Debian 的发行版。安装时,/ 挂载点是逻辑分区 (/dev/sda7) 上的 btrfs,/boot/efi 的挂载点位于 fat32 逻辑分区 (/dev/sda6)。

因为我想使用 grub 的 savedefault 功能,但该功能在 btrfs 上不起作用。因此,我使用 gparted 启动了一个实时映像,并缩小了 /boot/efi (/dev/sda6),添加了一个 ext4 分区 /dev/sda8。

之后我调整/etc/fstab使用新的挂载点,然后按照步骤修复 grub。

  1. 挂载根文件系统mkdir /tmp/rootfs && mount /dev/sda7 /tmp/rootfs
  2. 将启动驱动器挂载到已挂载的文件系统上mount /dev/sda8 /tmp/rootfs/@/boot
  3. 挂载 efi 分区mount /dev/sda6 /tmp/rootfs/@/boot/efi
  4. 挂载系统mount --bind /sys /tmp/rootfs/@/sys
  5. 安装 devmount --bind /dev /tmp/rootfs/@/dev
  6. 挂载进程mount --bind /proc /tmp/rootfs/@/proc
  7. 为了更好的措施回家mount --bind /tmp/rootfs/@home /tmp/rootfs/@/home
  8. chroot 进入 rootfschroot /tmp/rootfs
  9. 显然是修复 grub

为了修复 grub,我使用了这个命令:

grub-install /dev/sda

它说它成功了。但是当我尝试启动系统时,我收到此错误:

GRUB loading...
Welcome to GRUB!

error: file `/@/boot/grub/i386-pc/normal.mod´ not found.
grub rescue>

当然它在那里找不到它,因为它不再在 /@/boot/ 中。我认为这是 MBR 中第一阶段引导加载程序的错误。我该如何修复它?我使用 msdos 分区表。

我还设法用这个命令从 USB 驱动器加载的 grub 启动系统

set root=(hd1,msdos8)
linux /vmlinuz root=LABEL=LinuxRoot rootflags=subvol=@ quiet splash rw
initrd /initrd
boot

我也尝试过从那里重新安装 grub,但没有成功。我也尝试过这个命令,但也没有用(显示成功,但重启时出现相同的错误)。

grub-install --bootloader-id=grub --target=x86_64-efi --efi-directory=/boot/efi --no-nvram /dev/sda

答案1

我能够通过将我的 msdos 分区表转换为 gpt 分区表来正确解决此问题。我通过启动 live cd 并运行

gdisk /dev/sdX
w

之后,我必须使用实时介质重新安装 Windows 引导加载程序并打开命令提示符。然后运行此命令序列将新引导加载程序安装到 EFI 分区。

diskpart
  list disk
  select disk <volume for EFI partition>
  assign letter=O
  exit
bcdboot D:\Windows /s O
O:
cd EFI
mkdir Microsoft
cd Microsoft
bootrec /Fixboot

之后我只需要重新安装 grub(目标 x86_64-efi)。os-probe 没有检测到 windows,所以我不得不手动添加它,方法是添加一个新文件,/etc/grub.d/42-windows如下所示

cat<<EOF
menuentry Windows {
    search --no-floppy --set=root --file '/EFI/Microsoft/Boot/bootmgfw.efi'
    chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF

运行之后sudo update-grub一切正常。

答案2

我能够通过按照上述说明启动系统然后运行来修复它

sudo apt install grub-pc-bin
sudo grub-install --bootloader-id=grub --target=i386-pc /dev/sda
sudo update-grub
sudo reboot

重启后,运行:

sudo apt remove grub-pc-bin
sudo grub-install --bootloader-id=grub --target=x86_64-efi --efi-directory=/boot/efi /dev/sda # no-nvram is detected automatically at this point?
sudo update-grub
sudo reboot

到目前为止,一切都像以前一样。我只是不知道为什么。

相关内容