![将操作系统移至其他驱动器后,grub2 在启动过程中从错误的驱动器加载 grub.cfg](https://linux22.com/image/1015913/%E5%B0%86%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%A7%BB%E8%87%B3%E5%85%B6%E4%BB%96%E9%A9%B1%E5%8A%A8%E5%99%A8%E5%90%8E%EF%BC%8Cgrub2%20%E5%9C%A8%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B%E4%B8%AD%E4%BB%8E%E9%94%99%E8%AF%AF%E7%9A%84%E9%A9%B1%E5%8A%A8%E5%99%A8%E5%8A%A0%E8%BD%BD%20grub.cfg.png)
我的笔记本电脑最初有 128GB M.2 ssd 和 1TB hdd。系统配置为与 windows 双启动。/boot/efi 分区位于 /dev/nvme0m1p1 上,原始根分区位于 /dev/sda3 上。
我压缩了原始 nvme0n1 的映像,将 nvme0n1 换成了 1TB M.2 ssd。并将原始映像克隆到新的 ssd。结果是,一旦克隆完成,我就可以启动到 Windows 或 /dev/sd3 版本的 ubuntu。
然后,我创建了一个新的 ext4 分区 nvme0n1p6,并将 /dev/sda3 分区克隆到该分区。克隆后以及第一次运行 update-grub2 时,我确实忘记更改分区 UIDD。随后,我使用 gparted 更改了分区 UIDD,重新运行 update-grub2,并验证它已在新 UIDD 上找到了 /dev/nvme0n1p6 的映像。
花了 6 个小时才发现我在新映像的 /etc/fstab 中的 UIDD= 语句中插入了一个空格,然后我就可以启动到该新映像了(我的校对技巧还有待提高)。加载该映像后,我再次运行 update-grub2,以便将新 ubuntu 的选择移至顶部,并在新的 grub.cfg 中将其设为默认。
最后回答一下问题:重启后显示的 grub 菜单仍然是原始 /dev/sda3/boot/grub 文件夹的 grub.cfg。
将为 /nvme0n1p6 生成的 grub.cfg 复制到 /sda3 允许在后续启动时显示新的 grub.cfg。
重命名 /sda3 上的 grub.cfg 文件会导致 grub 在重启时停止在命令行上。退出命令行会导致加载 windows 操作系统。我可以使用实时 usb 映像来纠正该问题,该映像允许我在 /sda3 上恢复有效的 grub.cfg。
我怀疑 update-grub 命令不是我需要运行的唯一命令。我猜想存储在 /nvme0n1p1 上的映像需要更新。这是通过运行某种 grub 安装来实现的吗?
答案1
免责声明:我可能完全错了。
从您的信息来看,您的硬盘上似乎安装了一个 Windows 和一个 Ubuntu(/dev/sda3
)。我们将其称为硬盘安装 H。现在,您需要将安装移至 SSD,因此您创建了一个新的 SSD 分区并将硬盘安装克隆到该 SSD 分区(我宁愿进行全新安装,但这与您的问题无关)。我们将其称为 SSD 安装 S。
据我所知,问题在于您在完成 S 安装后根本没有安装 grub。因此,系统中安装的 grub 仍然属于安装 H [1]。因此它仍将使用grub.cfg
安装 H 中的现有内容。
为了使 grub 使用grub.cfg
来自您的安装 S,您必须将 grub 从 S 安装到 EFI 分区。
启动到安装 S 并运行:
$ sudo grub-install dummy
$ sudo update-grub
如果我误解了您的场景,或者您在使用命令时遇到错误,请告诉我。
答案2
现在我已经在新的 M.2 ssd 上运行了 ubuntu,我将回顾一下我用来在具有一个 M.2 端口的笔记本电脑中用 1TB SSD 替换 nvme0n1p1 上包含 grub 安装的双引导加载程序的 128GB SSD 的方法。为清楚起见,Windows 10 的大部分内容驻留在 nvme0 的各个分区上,而 ubuntu 最初驻留在 sda3 上的硬盘分区上。启动时,nvme0n1p1 安装在 /boot/efi 上。
制作 nvme0n1 的映像 a。我个人没有采取任何步骤来缩小分区以减小映像大小。如果认为有必要,其他人已经提供了有关如何操作的指导。
b. 将映像写入其他驱动器(内部或外部)。我使用了:
dd if=/dev/nmve0n1 | gzip -c > pathToOtherDeviceFolder/nvme0n1.img
该
-c
选项使 gzip 写入标准输出,然后将其定向到文件。测试从包含实时映像、ubuntu live 或 gparted live 的 USB 驱动器启动。我后来遇到了问题,因为我没有使用通常与笔记本电脑断开连接的外接显示器来测试实时映像。我花了几天时间尝试在没有任何外接显示器的情况下完成后续步骤,发现是没有外接显示器(或以太网)导致实时 USB 驱动器无法启动,而不是后续步骤的结果。我不记得连接以太网使启动成功,但可以与外接显示器一起连接。在任何一种情况下,都存在实时映像的依赖关系,我不明白但可以解决。启动后,请确保您可以安装包含要移动的映像的驱动器。
关闭电源并用新的 M.2 SSD 替换原来的 M.2 SSD。
将映像移动到新的 nvme0n1
a. 从 USB 实时磁盘启动。(您已经测试过了)
b. 安装包含要移动的图像的驱动器。(再次测试)
c. 将图像移动到新的 nvme0n1。我使用了:
gunzip -c pathToOtherDeviceFolder/nvme0n1.img | dd of=/dev/nvme0n1
再次,gunzip 将数据写入 stdout,然后通过管道传输到 dd 以写入新设备。
将 ubuntu 移动到新 nvme0n1 上的新分区 在这里我选择重新启动到 sda3 上的原始 ubuntu 映像。这没有问题,因为新的 nvme0n1 是原始映像的克隆。我不知道为什么在 USB 实时环境中运行时无法执行这些步骤,尽管我没有这样做的经验。
a. 使用 gparted 或其他工具在 nvme0n1 上创建新的 ext4 分区。我将把此分区称为 nvme0n1p6。
b. 将 /dev/sda3 上的 ubuntu 映像(就我而言)克隆到 /dev/nvme0n1p6 上。我使用了:
dd if=/dev/sda3 of=/dev/nvme0n1p6
c. 克隆后使用 gparted 或其他工具将 nvme0n1p6 的分区 UIDD 更改为唯一的 UIDD。
在 nvme0n1p6 上准备新的以进行操作。
a. 挂载 /dev/nvme0n1p6。我使用 /mnt 作为挂载点。
b. 修改 /etc/fstab,将 nvme0n1p6 的 UIDD 挂载为 /。请注意,nvme0n1p1 仍将挂载为 /boot/efi。确保修改后的条目格式正确。后面的一个额外空格
UIDD=
又让我花了几个小时思考我做错了什么。c. 此时可以卸载 nvme0n1p6 但我认为我省略了这一步。
如果仍然从 USB 实时磁盘执行,请重新启动到原始 ubuntu 映像(我的在 /dev/sda3 上)
更新 grub 菜单选项:
sudo update-grub2
观察是否找到并添加了 nvme0n1p6 上的原始映像、Windows 映像和新的 ubuntu 映像。
重新启动并在 grub 启动菜单中选择新的 ubuntu 映像。
进入新图像运行后:
a.
sudo grub-install
这会修改 /boot/efi (/dev/nvme0n101) 上的 grub 文件,使其查看 /dev/nvme0n1p6/boot/grub,而不是 sda3 上的 grub 菜单 grub.cfg 的位置。b. `sudo update-grub' 将用一个新文件替换克隆的 /boot/grub/grub.cfg,该文件将新图像放在顶部并作为默认值,而 sda3 上的原始图像则作为替代选择。
现在您应该能够启动这三个映像中的任何一个。请注意,直到grub-install
在新映像上运行,原始映像才能从机器中删除,因为 grub 将无法找到其菜单配置文件。
希望我没有遗漏任何步骤或者记错,并且这对您有用。