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

我在半embedded式环境下在单板机器上安装了Ubuntu 10.10 Server; 没有键盘或屏幕,只需SSH访问它。

所以偶尔会启动并卡在GRUB菜单上,等待按键select第一个选项, 真的很让人沮丧。

在任何情况下,如何configurationGRUB以等待按键?

更新#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" } 

现在退出并重新运行grubconfiguration更新器脚本:

 sudo update-grub2 

对于我来说,这种行为对于Ubuntu Server来说是默认的,Ubuntu Server是一个面向控制台访问的机器的产品。

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

例如,如果您希望有2秒的超时时间(从而避免挂起无人参与的重新启动),只需在/etc/default/grub添加以下行:

 GRUB_RECORDFAIL_TIMEOUT=2 

记得在那之后运行update-grub

这里是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会find它,然后问你启动哪一个。 运行“update-grub”之前删除所有额外的驱动器。

另见https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

我在Ubuntu Server 9.10中遇到了这个非常不愉快的devise监督。 你的修复帮了我很大的忙。 我只想指出,对于9.10所需的修复是不同的,因为在同一个文件中没有“make_timeout()”函数。

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

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

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

和以前一样,然后运行:

 sudo update-grub2

将GRUBconfiguration为串行访问(以及您的引导加载程序),并为这些实例保留开放式串行端口,空调制解调器电缆和USB至RS232转换器。 我运行一个无头的服务器和一个Guruplug,不会有任何其他的方式。

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

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

这意味着如果以前的引导失败,则启动时会得到30秒的超时时间。 (不像其他操作系统如何…)

这可能(和恕我直言,应该)甚至是在/ etc / default / grub中的设置。

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

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

这种方法有点干净 – 只需修改/etc/default/grub即可添加以下行:

 GRUB_RECORDFAIL_TIMEOUT=2 

在configuration中,哪一个可以自动执行这样的事情:

 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提到variablesGRUB_RECORDFAIL_TIMEOUT(如我在12.04 LTS中看到的),这应该是可行的:

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

对于是否logging故障可能会产生更好的答案,我有点好奇。