为什么 Mint 不能启动我克隆的 Ubuntu 分区?(UUID 问题)

Lee*_*ian 4 dual-boot dd uuid

我一直在运行 Ubuntu 10.04 并且刚刚安装了 Linux Mint 13。我可能会全职使用 Linux Mint,但现在我想将它安装到第一个分区,但保持 Ubuntu 可启动。

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    58593279    29295616   83  Linux
/dev/sda2        58595326   976768064   459086369+   5  Extended
/dev/sda5       959980140   976768064     8393962+  82  Linux swap / Solaris
/dev/sda6        58595328   898696186   420050429+  83  Linux
/dev/sda7       898697216   959963135    30632960   83  Linux
Run Code Online (Sandbox Code Playgroud)

sda6 是包含我所有文档的数据分区。添加了新的 sda7 以创建双引导设置。我将 sda1 克隆到 sda7

 dd if=/dev/sda1 of=/dev/sda7
Run Code Online (Sandbox Code Playgroud)

当然这也克隆了 UUID,所以我为 sda7 创建了一个新的 UUID

tune2fs /dev/sda7 -U random
Run Code Online (Sandbox Code Playgroud)

当我用blkid它列出 UUID 时,它确实发生了变化。然后我将 Linux Mint 安装到 sda1。我还设置了 fstab 来挂载 sda7,这样我就可以将配置文件复制到新操作系统。我启动到 Linux Mint 很好,但是当我尝试启动到 Ubuntu 时,我收到一条消息(从内存中,可能不完整)加载程序找不到/dev/disk/by-uuid/<old UUID>.

此时我查看了 grub.cfg,果然,旧的 UUID 和新的 UUID 都列出来了:

### BEGIN /etc/grub.d/30_os-prober ###
menuentry "Ubuntu, with Linux 2.6.32-41-generic (on /dev/sda7)" --class gnu-linux --class gnu --class os {
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos7)'
    search --no-floppy --fs-uuid --set=root 3869f8c2-dcf8-4522-bc8b-91b0ce0040fa #This is the new UUID
    linux /boot/vmlinuz-2.6.32-41-generic root=UUID=72a5e117-9a39-4de1-9d28-53791d055ff5 ro quiet splash #This is the old UUID
    initrd /boot/initrd.img-2.6.32-41-generic
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试用 修复这个问题sudo update-grub,但我仍然得到相同的条目,新旧 UUID 的混合。我还尝试手动编辑 grub.cfg 以用新的 UUID 替换旧的,但我仍然收到相同的消息,即加载程序找不到具有旧 UUID 的设备。

那么,从哪里update-grub读取旧的 UUID?以及如何修复 grub 以便它可以引导克隆的分区?

Mar*_*ied 5

我的猜测是您没有查看/编辑引导加载程序正在查看的相同 grub.cfg。请记住,您/boot/grub现在有两个不同的目录,引导加载程序需要知道要查找哪一个。update-grub正在更新当前安装的 grub.cfg /boot/grub/grub.cfg。我猜引导加载程序正在寻找另一个分区。在我喝完第一杯咖啡后,我也许可以通过查看您的帖子并做笔记来确认这一点,但现在这必须是有根据的猜测。

我相信你需要做的就是跑sudo grub-install --root-directory=/ /dev/sda。我提供完整版本以获取额外信息 ---root-directory参数默认为/.

此命令将在 /dev/sda 上重新安装引导加载程序,告诉它在“根目录”参数 (/boot/grub) 中查找 grub.cfg。如果您希望 grub.cfg 位于不同的发行版中,您可以挂载它并指定不同的“根目录”,例如,/mnt/my_other_distro/如果它挂载在/mnt/my_other_distro.

如果您在我喝咖啡时遇到问题,请告诉我。:)

编辑:后咖)我现在看到的一个很重要的问题...你应该已经改变了UUID为SDA1,不sda7。然后,当您将 Mint 安装到 sda1 上时,如果您重新格式化它无论如何都会更改它,但是如果您不更改它,它可能会混淆。通过更改旧 Ubuntu 安装的 UUID,您使其 /etc/fstab 中的所有挂载设置以及 GRUB 菜单无效。我假设 Mint 不会重新生成菜单,而只会复制条目,因此它并不关心它是否正确。

运行 update-grub 会修正 grub.cfg,但不会修正 MBR 中的 grub 代码;这只能使用 grub-install 进行更改。

而且 Linux Mint 不知道 grub.cfg 中的条目实际上是什么意思,因为它可能指的是当时甚至不存在的驱动器。我认为,它只是将新条目添加到现有条目的顶部。