无头 Ubuntu 服务器有时卡在 GRUB 菜单

无头 Ubuntu 服务器有时卡在 GRUB 菜单

我在半嵌入式环境中的单板机上安装了 Ubuntu 10.10 Server;没有键盘或屏幕,只能通过 SSH 访问。

所以就是真的当它偶尔启动并卡在 GRUB 菜单上,等待按键来选择第一个选项时,令人沮丧。

如何配置 GRUB 使其在任何情况下都不等待击键?

更新 #1:没有 menu.lst,因为这是 GRUB 2。但我有一个 /etc/default/grub,如下所示:

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=2
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

更新 #2:我搞明白了。在启动失败之后的启动中,GRUB 会禁用其自身的超时。由于显示菜单会导致启动失败,因此这是一个不可避免的循环。可以通过编辑 /etc/grub.d/00_header 文件并更改 make_timeout 函数来禁用此行为:

make_timeout ()
{
    echo "set timeout=0"
}

现在退出并重新运行 grub 配置更新程序脚本:

sudo update-grub2

我觉得这种行为竟然是 Ubuntu Server(一种用于通过控制台访问的机器的产品)的默认行为,这毫无意义。

答案1

对于 Ubuntu 12.04 LTS,有一个特定的选项可以在中设置/etc/default/grub

例如,如果您想要有 2 秒的超时时间(从而避免无人值守重启时挂起),只需添加以下行/etc/default/grub

GRUB_RECORDFAIL_TIMEOUT=2

记得追上update-grub去...

答案2

以下是针对 Ubuntu 10.10 的说明,与之前的版本略有不同。在文件中 /etc/grub.d/00_header 注释掉之前启动失败的愚蠢检查:

##if [ \${recordfail} = 1 ]; then
##  set timeout=-1
##else
  set timeout=${2}
##fi

然后更新:

sudo update-grub

请注意,如果有第二个驱动器连接了 Linux,grub2 会找到它,并在启动时询问您想要哪一个。运行“update-grub”之前,请移除所有额外的驱动器。

也可以看看https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

答案3

我在 Ubuntu Server 9.10 中遇到了这个非常令人不快的设计疏忽。您的修复对我帮助很大。我只是想指出,9.10 所需的修复有所不同,因为同一文件中没有“make_timeout ()”函数。

对于 Ubuntu 9.10,转到同一文件(00_header)的末尾并更改以下内容:

如果 [ \${recordfail} = 1 ]; 那么
  设置超时=-1
别的
  设置超时=${GRUB_TIMEOUT}
末梢血

如果 [ \${recordfail} = 1 ]; 那么
  设置超时=${GRUB_TIMEOUT}
别的
  设置超时=${GRUB_TIMEOUT}
末梢血

和前面一样,然后运行:

sudo 更新-grub2

答案4

我只是为 recordfail 设置了一个较长的超时时间:

if [ "\${recordfail}" = 1 ]; then
  set timeout=30
else
  set timeout=${2}

这意味着如果上次启动失败,则启动时会有 30 秒的超时时间。(与其他操作系统的做法不同...)

这甚至可以(并且恕我直言应该)在 /etc/default/grub 中进行设置。

相关内容