这个问题涉及 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-pc
为grub-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