最近我问了一个问题关于如何在 Ubuntu 之后安装 Windows 时修复 Grub。我找到了解决方案并将其发布出来,以帮助其他有同样问题的人。但现在我想问一下启动修复的后果。所以,我的系统之前是这样工作的:
- 使用 Grub 的 Ubuntu
- 硬盘上的 Windows
正如我所说的答案回答我之前的问题,我在新的 ssd(我们称之为 m2)上安装了 Windows,将旧 hdd 与我的旧 windows 连接,传输所有数据并格式化 hdd。然后我将 ssd 与我的 ubuntu 连接并从我的 usb 闪存运行启动修复。修复后 grub 就修复好了,我可以在新 Windows 和 Ubuntu 之间进行选择,一切正常。
但有一件事让我很困扰,那就是 grub 菜单上仍然有旧的 Windows,即使我用 Windows 格式化了旧硬盘。此外,在 UEFI 中还添加了更多启动选项,例如,ubuntu (m2 ssd)
即使ubuntu (hdd)
那里根本没有安装 ubuntu。我保存了启动修复的日志,如果可以安全共享,我可以在这里或私下分享它们。
所以我的问题是,我应该担心什么吗?或者这没什么大不了的,我可以忘掉它?当我启动 Ubuntu 时,它还说“无法设置 APST 功能”,但它会在一段时间后加载并运行。
答案1
GRUB 配置文件生成,生成器由一堆模块组成,每个模块添加部分配置。具体来说,菜单由各种“探测器”模块生成;有一个os-prober
包以某种方式检测 Windows 并将其添加到菜单中。
如果您/boot/grub/grub.cfg
使用某些文本查看器检查该文件(在控制台中,您可以执行less /boot/grub/grub.cfg
,使用箭头和 PgUp/PgDown 键滚动并q
退出),您将在其中看到注释,这些注释表明哪个模块添加了哪些启动选项。开始时会有一些常规设置,启动菜单将位于文件底部。它可能看起来像这样:
...
### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-3f93e571-3e82-409a-9298-67ad16c80f2a' {
load_video
insmod gzio
...
initrd /initrd.img-5.10.0-18-amd64
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
...
### END /etc/grub.d/20_linux_xen ###
...
在这个例子中,第一个是10_linux
模块,它创建了我的主系统的启动菜单条目。我没有 Xen,所以它20_linux_xen
没有产生任何东西,等等。
这些是根文件系统中到其各自模块的路径。例如,下一个是30_os-prober
应该检测其他系统(包括 Windows)的模块。阅读包自己的文档以/usr/share/doc/os-prober
了解其行为和配置。此外,由于是开源的,您可以直接阅读代码 - 它只是系统在启动菜单生成期间调用的 shell 脚本以及您发现从主文件调用的一些其他脚本,并且毫不奇怪,您可以以相同的方式阅读它(尝试less /etc/grub.d/30_os-prober
)。通过这种方式,您可以了解它如何在您的特定情况下检测您的残留物,然后您可以决定如何摆脱它。
通常会检测到其他 Linux,因为您有它们的杂散内核和 initrd、根文件系统等,因此请检查您的逻辑卷(如果您使用 LVM)、分区,/boot
以查找意外的内核和其他文件。还请检查ESP通常安装到/boot/efi/
,并且您使用 UEFI(我怀疑您确实这样做了,因为这是固件条目出现在 GRUB 菜单中的唯一方式),您可以将其与 固件对该主题的看法进行比较efibootmgr -v
。您将了解哪些文件实际上没有使用。