如何从 grub 救援中永久恢复?

如何从 grub 救援中永久恢复?

这个问题涉及 DOS 分区 SSD 上的 Windows/Linux 双引导系统(即没有 GPT/UEFI)。最初,该计算机仅在 HDD 上安装了 Windows 10。然后我设法将该系统转移到 SSD,调整分区大小并在 Windows 10 旁边安装 Xubuntu 20.04,一切正常。

驱动器上始终有一个 EFI 分区。我不知道它有什么用,因为这不是 UEFI 设备。但我没有改变这个分区。 - 该系统上没有交换分区。

我想为我的 Linux 系统分区创建更多空间。为了在以后需求发生变化时更加灵活,我在两个 Linux 分区之间移动了 Windows 主分区。分区布局现在如下所示:

NAME   FSTYPE PARTTYPE PARTFLAGS LABEL
sda                              
├─sda1 ntfs   0x7      0x80      System-reserviert
├─sda2 ntfs   0x7                SSD-Windows-Sys
├─sda3 vfat   0xef               SSD-EFI
├─sda4        0x5                
├─sda6 ext4   0x83               SSD-Linux-Sys
├─sda5 ntfs   0x7                SSD-Windows-Home
└─sda7 ext4   0x83               SSD-Linux-Home

(sda-数字不严格升序,分区显示按 SSD 存储顺序sda6-sda5-sda7。)

我没有更改任何分区 1 到 3。我成功地保留了原始的 UUID 和 LABEL,用于gparted移动 ntfs 分区 SSD-Windows-Home 并调整其大小。没有与tune2fs -U <UUID>vfat 和 ntfs 等效的东西,我不想按照dd中建议的方式通过摆弄来交换序列号这次讨论,因此我通过调整大小和移动 ntfs-partition 来做到这一点SSD-Windows-Home

对于Linux分区,我曾经gparted在SSD的末尾创建一个新的ext4分区,rsync将旧分区的内容复制到新分区,然后删除旧分区并调整其他分区的大小以填补空白。最后,我申请tune2fs实现所示的状态,特别是为所有分区维护与之前相同的 LABEL 和 UUID。

在分区更改工作期间,我遇到一条警告,指出更改后可能会出现启动问题。我不在乎,因为每个分区的 LABEL 和 UUID 保持不变。但这是一个敏锐的假设,当我尝试重新启动时,我不得不注意到:

引导过程停止在grub rescue>GRUB2 菜单中,而不是询问我要引导哪个操作系统。

我通过发出以下命令成功启动计算机:

grub rescue> set prefix=(hd0,6)/boot/grub
grub rescue> set root=(hd0,6)/
grub rescue> insmod linux
grub rescue> insmod normal
grub rescue> normal

然后显示 GRUB2 菜单,我可以在 Linux 和 Windows 10 之间进行选择。两个操作系统都像以前一样工作我的所有分区更改(当然我必须在中间关闭计算机并grub rescue>再次进行)。

建议我在启动 Linux 系统后运行以下命令,以便从grub rescue问题中永久恢复:

$LC_ALL=C sudo grub-install --target=/boot/grub/i386-pc /dev/sda
grub-install: error: /usr/lib/grub/i386-pc/modinfo.sh doesn't exist. Please specify --target or --directory.
$

有一个文件(在和 中/boot/grub/i386-pc/modinfo.sh还有两个文件)。/boot/grub/x86_64-efi/usr/lib/grub/x86_64-efi

因此我尝试过

$LC_ALL=C sudo grub-install --target=/boot/grub/i386-pc /dev/sda6
grub-install: error: /usr/lib/grub/boot/grub/i386-pc/modinfo.sh doesn't exist. Please specify --target or --directory.
$

它在错误的目录中搜索。因此我添加了--directory=/boot/grub/i386-pc

$ LC_ALL=C sudo grub-install --directory=/boot/grub/i386-pc /dev/sda6
Installing for i386-pc platform.
grub-install: error: cannot open `/boot/grub/i386-pc/moddep.lst': No such file or directory.
$ ls -l /boot/grub/i386-pc/moddep.lst
-rw-r--r-- 1 root root 5416 2019-12-10 10:34 /boot/grub/i386-pc/moddep.lst
$ 

从命令中可以看出ls,这个错误信息肯定是错误的,因为/boot/grub/i386-pc/moddep.lst存在并且root也可以访问它!现在我已经无计可施了。

当计算机能够使用grub rescue命令启动(而不是从活动棒并使用chroot)启动后,永久应用我输入的信息应该不那么困难,但不必在每个启动过程中输入它。

你如何正确地做到这一点?

答案1

/usr/lib/grub/x86_64-efi和的存在/usr/lib/grub/x86_64-efi-signed表明 Xubuntu 已安装为 UEFI 引导系统,这表明您的系统实际上支持 UEFI。

事实上,您的sda磁盘包含 Windows 安装并以 MBR 样式分区,这表明您的 Windows 必须使用经典 BIOS 样式启动。为了能够轻松地选择从 GRUB 菜单启动的操作系统,您可能希望 Xubuntu 也以传统 BIOS 风格启动。但您的系统中当前似乎尚未安装传统风格 GRUB 所需的软件包。

你说grub-efi你的系统上没有安装:Debian/Ubuntu 上不存在这样的软件包。 UEFI 等效名称grub-pcgrub-efi-amd64。该名称grub-pc是 GRUB 曾经是仅限 x86/BIOS 的引导加载程序时遗留下来的名称;现在它支持许多其他架构和固件类型。

注释中建议的命令有一些拼写错误:--target选项grub-install不采用路径名,而是采用 GRUB 平台标识符:在您的情况下,i386-pc.

首先,安装 GRUB 的旧版 BIOS 支持包:

sudo apt install grub-pc grub-pc-bin

然后,将 GRUB 安装到系统的主引导记录中:

sudo grub-install --target=i386-pc /dev/sda

检查 的内容/etc/default/grub。如果有一条线

GRUB_DISABLE_OS_PROBER=true

您可能需要将其更改为false,确保os-prober安装了该软件包,然后运行sudo update-grub以创建包含两个操作系统的 GRUB 配置。

然后安装sda3并检查其内容:

sudo mount /dev/sda3 /mnt
sudo ls -l /mnt

如果它包含一个EFI目录,请将其重命名为其他目录(以防您的系统固件对 UEFI 启动具有无法控制的偏好):

sudo mv /mnt/EFI /mnt/NO-EFI
sudo umount /mnt

现在是时候重新启动了。验证您现在可以成功引导两个操作系统后,您可以使用以下命令删除 UEFI 引导支持包:

sudo apt purge grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed efibootmgr shim-signed shim-helpers-amd64-signed shim-signed-common

相关内容