如何让 GRUB 直接启动到 Ubuntu 而不在 30 秒内显示菜单?
我今天在一台全新的机器上安装了全新的 Ubuntu 18.04.3。
制造商已经安装了 Windows 的测试安装,但我告诉 Ubuntu 安装程序将其删除并用 Ubuntu 覆盖。
现在我发现 GRUB 菜单出现后要等待 30 秒,然后才默认为 Ubuntu(第一个选项)。它显示三个选项:“Ubuntu”、“Ubuntu 高级选项”(这会引导至一个子菜单,其中有内核版本的选择),最后一个选项会导致系统重置并调出 BIOS 设置。这不太好,因为这台机器应该是独立的,这会导致重启时间变慢。
当我查看 /etc/default/grub 时,我看到 GRUB_TIMEOUT 是已经设置为 0,并且 GRUB_TIMEOUT_STYLE 已设置为“隐藏”,这很奇怪,因为 GRUB 菜单在每次启动时都会停留 30 秒。
尽管如此,我还是尝试添加:GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true(并运行 sudo update-grub),但没有任何变化。每次启动时,grub 菜单仍会停留 30 秒。我尝试过只激活 GRUB_HIDDEN_TIMEOUT 选项并注释掉 GRUB_TIMEOUT 选项;以及只激活 GRUB_TIMEOUT 选项并注释掉 GRUB_HIDDEN_TIMEOUT 选项;这些都没有任何变化。
我尝试添加:GRUB_DISABLE_OS_PROBER=true(并运行 sudo update-grub),但没有任何效果。仍然会出现 30 秒的 grub 菜单。
我尝试从 /etc/grub.d/30_os-prober 中删除 x 位,但仍然没有什么区别。
我现在尝试从实时 USB 运行引导修复,这为菜单添加了几个新选项(每个选项的名称都是以 .efi 结尾的字母串)。菜单仍显示 30 秒。
还有什么我可以尝试让 GRUB 跳过菜单并直接启动到 Ubuntu 吗?*缺少重新安装吗?
提前致谢!
====================
编辑:我已经找出了问题所在。在 /etc/grub.d/00_header 中有:
if [ "$recordfail_broken" = 1 ]; then
cat << EOF
if [ \$grub_platform = efi ]; then
set timeout=${GRUB_RECORDFAIL_TIMEOUT:-30}
if [ x\$feature_timeout_style = xy ] ; then
set timeout_style=menu
fi
fi
EOF
...这导致这些行位于 /boot/grub/grub.cfg 中...
if [ $grub_platform = efi ]; then
set timeout=30
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
fi
fi
因此,即使我的 grub 环境中没有设置“recordfail”(我已经检查过),显然 GRUB 声明 recordfail 系统已损坏,因此默认将 recordfail 默认超时设置为 30 秒。
我已将 GRUB_RECORDFAIL_TIMOUT 更改为 0,现在我获得了想要的更快的启动时间。但是,如果启动时出现任何问题,现在我显然无法访问启动菜单。
发生这种情况似乎是因为 /boot 目录位于 LVM 分区上,因此无法写入。这是一个已知错误(这里)。但是为什么在全新安装上会发生这种情况……?
答案1
作为一种暴力破解方法,您可以创建一个名为的文件,/etc/grub.d/99_short_timeout
其内容如下:
cat << EOF
set timeout=1
EOF
并调用
chmod a+x /etc/grub.d/99_short_timeout
update-grub
之后。这将set timeout=1
作为最后一行添加到grub.cfg
。
我之所以希望至少有一秒钟的超时时间,是因为我想保留更改 GRUB 选择的机会。就我而言,GRUB 拒绝完全跳过选择,原因很充分:我使用 Btrfs,而 GRUB 还无法写入 Btrfs 分区,因此它无法记录失败的启动,也无法在启动时区分是否应该为我提供救援系统。