无头的Ubuntu服务器计算机有时卡在GRUB菜单中


54

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

因此,当它偶尔启动并卡在GRUB菜单上,等待按键选择第一个选项时,确实令人沮丧。

如何将GRUB配置为在任何情况下均不等待按键?

更新#1:没有menu.lst,因为它是GRUB2。但是我确实有一个/ 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的默认行为,Ubuntu Server是用于控制台访问的计算机的产品,这对我来说没有任何意义。


1
/boot/grub/menu.lst长什么样
Shane Madden

7
欢迎您将您的发现发布给您自己的问题的答案,而不是进行编辑。这样,如果我们愿意的话,我们将有机会对您的答案进行投票。
天鹰

Answers:


41

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

例如,如果您希望有2秒钟的超时时间(从而避免因无人值守的重启而死机),只需在下面添加以下行/etc/default/grub

GRUB_RECORDFAIL_TIMEOUT=2

记得update-grub在那之后跑...


这解决了我的初始问题,即与OP相同的问题,但是现在我注意到,在极少数情况下,当我将服务器连接到显示器时,我什么也看不到。监视器什至没有连接,但是SSH仍然可以正常工作。这是预期的吗?
勒斯2015年

18

这是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


6

我在Ubuntu Server 9.10中遇到了这种令人不快的设计监督。您的修复极大地帮助了我。我只是想指出9.10所需的修复方法是不同的,因为同一文件中没有“ make_timeout()”函数。

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

如果[\ $ {recordfail} = 1]; 然后
  设置超时= -1
其他
  设置超时= $ {GRUB_TIMEOUT}
科幻
紧急行动

如果[\ $ {recordfail} = 1]; 然后
  设置超时= $ {GRUB_TIMEOUT}
其他
  设置超时= $ {GRUB_TIMEOUT}
科幻
紧急行动

和以前一样,然后运行:

须藤更新grub2

辉煌的解决方案,一直在想如何做到这一点,完美地工作!注意:更新grub时,无论运行什么版本的grub,都只需要运行:“ sudo update grub”。

这就节省了我的培根-我的服务器在每次重新启动时都位于grub菜单上一周了-不知道出了什么问题,并尝试了一切。这和问题中的技巧做到了。非常感谢。
达伦·格雷夫斯

1

配置GRUB以进行串行访问(以及引导加载程序时使用的引导加载程序),并为这些实例准备好开放的串行端口,零调制解调器电缆和USB-RS232转换器。我运行的是无头服务器和Guruplug,不会有其他方式。


1

我只是为记录失败设置了长时间超时:

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

这意味着如果先前的引导失败,则引导时您将获得30秒的超时。(与其他操作系统的操作方式不同...)

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


1

我真的不知道为什么这是默认操作,尤其是对于服务器,但这是我在服务器设置脚本中实现的。

sudo sed -i 's/set timeout=-1/set timeout=30/g' /etc/grub.d/00_header
sudo update-grub

1

这种方法比较干净-只需修改/etc/default/grub以添加以下行:

GRUB_RECORDFAIL_TIMEOUT=2

...在配置中可能会自动执行以下操作:

if grep '^GRUB_RECORDFAIL_TIMEOUT=' /etc/default/grub ; then
   echo GOOD: /etc/default/grub
else
   echo FIXING: /etc/default/grub
   perl -pi.bak -e \
      's/^(GRUB_TIMEOUT=.*\n)/${1}GRUB_RECORDFAIL_TIMEOUT=2\n/' \
      /etc/default/grub
   update-grub
fi

如果在以下位置/etc/grub.d/00_header(如我在12.04 LTS中所见)中提到变量GRUB_RECORDFAIL_TIMEOUT,这应该是可行的 :

make_timeout ()
{
    cat << EOF
if [ "\${recordfail}" = 1 ]; then
  set timeout=${GRUB_RECORDFAIL_TIMEOUT:--1}
else
  set timeout=${2}
fi
EOF
}

我对挖掘故障记录方式是否会产生更好的答案感到有些好奇。


自最初讨论此问题以来,已添加GRUB_RECORDFAIL_TIMEOUT参数。如今,是的,这是更好的方法。
mikepurvis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.