我已在驱动器上安装了基于 Debian 的发行版。安装时,/ 挂载点是逻辑分区 (/dev/sda7) 上的 btrfs,/boot/efi 的挂载点位于 fat32 逻辑分区 (/dev/sda6)。
因为我想使用 grub 的 savedefault 功能,但该功能在 btrfs 上不起作用。因此,我使用 gparted 启动了一个实时映像,并缩小了 /boot/efi (/dev/sda6),添加了一个 ext4 分区 /dev/sda8。
之后我调整/etc/fstab
使用新的挂载点,然后按照步骤修复 grub。
- 挂载根文件系统
mkdir /tmp/rootfs && mount /dev/sda7 /tmp/rootfs
- 将启动驱动器挂载到已挂载的文件系统上
mount /dev/sda8 /tmp/rootfs/@/boot
- 挂载 efi 分区
mount /dev/sda6 /tmp/rootfs/@/boot/efi
- 挂载系统
mount --bind /sys /tmp/rootfs/@/sys
- 安装 dev
mount --bind /dev /tmp/rootfs/@/dev
- 挂载进程
mount --bind /proc /tmp/rootfs/@/proc
- 为了更好的措施回家
mount --bind /tmp/rootfs/@home /tmp/rootfs/@/home
- chroot 进入 rootfs
chroot /tmp/rootfs
- 显然是修复 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
到目前为止,一切都像以前一样。我只是不知道为什么。