这个问题涉及 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 并调整其大小。vfat 和 ntfs没有等效项tune2fs -U <UUID>
,而且我不想按照本讨论dd
中的建议通过摆弄来交换序列号,因此我通过调整大小和移动 ntfs 分区来实现。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
)后,永久应用我输入的信息应该不那么困难,但不必在每个启动过程中输入它。
你如何正确地做到这一点?