直到昨天,一切都正常,并且 os-prober 成功地为 Arch Linux 安装生成了菜单条目。然而今天,当我尝试启动 Arch 时,我收到一个错误,指出在它尝试使用的 UUID 处找不到根文件系统。经过一番修改后,我能够通过手动将根目录更改为实际分区“/dev/sda7”而不是使用 UUID 来启动 Arch。
我想知道什么可能导致 os-prober 仅为 Arch Linux 安装生成此无效配置。对于 openSUSE 和 Windows 7 安装来说它仍然表现良好。另一件需要注意的事情是,它在 Arch Linux 的引导行末尾添加了“rw Quiet”。这不是它以前所做的事情,我想知道这是否与 UUID 不正确的原因有关。
下面我贴出Arch Linux的菜单入口。正如您所看到的,os-prober 的 --set-root= 'some UUID' 部分具有正确的 UUID,但稍后启动 linux 时它具有 -root=UUID='some other invalid UUID'。
澄清一下,我在这台机器上安装了 Ubuntu、Arch Linux、openSUSE 和 Windows 7,但我使用 Ubuntu 作为主操作系统,并允许它管理 GRUB 及其配置。所有操作系统均为最新版本。
menuentry 'Arch (on /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-b9522736-878c-49e3-b30d-ad65589aa1d9' {
insmod part_msdos
insmod ext2
set root='hd0,msdos7'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos7 --hint-efi=hd0,msdos7 --hint-baremetal=ahci0,msdos7 b9522736-878c-49e3-b30d-ad65589aa1d9
else
search --no-floppy --fs-uuid --set=root b9522736-878c-49e3-b30d-ad65589aa1d9
fi
linux /boot/vmlinuz-linux root=UUID=ad4103fa-d940-47ca-8506-301d8071d467 rw quiet
initrd /boot/initramfs-linux.img
}
正如您所看到的,前两个 UUID 与最后一个不同。前两个是正确的,最后一个是错误的。如果我将最后一个 UUID 替换为“/dev/sda7”,则它可以正常启动。我已手动编辑 grub.cfg 来执行此操作,但我希望 os-prober 恢复自动工作。谢谢。
答案1
好吧,关于 os-prober 如何查找每个操作系统各自/boot
目录的不同 grub.cfg 文件的信息,即使该操作系统不是将 grub 安装到 MBR/EFI 的操作系统,也帮助我解决了这个问题。
事实证明,Arch Linux 的先前更新在 /boot 目录中卡住了 grub.cfg 文件。没有说得太详细,我没有在 Arch 下安装适当的东西来运行 grub-mkconfig,所以我在 grub.cfg 中得到了某种模板。这是 os-prober 正在扫描的文件,并且该文件的 UUID 不正确。我要做的就是关闭 Arch linux 下的 os-prober /etc/default/grub
。然后我运行了sudo grub-mkconfig -o /boot/grub/grub.cfg
,为 Arch 构建了一个正确的 grub.cfg 文件,Ubuntu 的 os-prober 现在可以正确使用该文件。我将对 openSUSE 使用相同的技术。
需要注意的一件事是,不是让 os-prober 自己生成这些菜单项,而是从每个操作系统各自的 grub.cfg 文件中提取,这样您就可以为每个发行版拥有不同的默认值,因此允许使用不同的参数有安静的启动与飞溅,或显示整个启动过程等。
感谢各位的帮助!