我在我的驱动器上安装了基于 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
- 挂载开发
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
通过将我的 msdos 分区表转换为 gpt 分区表,我能够正确地解决这个问题。我通过启动 live CD 并运行来做到这一点
之后,我不得不使用实时媒体重新安装 Windows 引导加载程序并打开命令提示符。然后运行此命令序列以将新的引导加载程序安装到 EFI 分区。
之后我只需要重新安装 grub(目标 x86_64-efi)。os-probe 没有检测到窗口,所以我不得不通过添加一个新的文件
/etc/grub.d/42-windows
文件来手动添加它,就像这样在那次运行之后
sudo update-grub
,一切正常。我能够通过如上所述引导进入系统然后运行来修复它
重启后,运行:
此时一切都像以前一样工作。我只是不知道为什么。