A máquina do servidor Ubuntu sem cabeça às vezes ficava presa no menu do GRUB

53

Eu tenho o Ubuntu 10.10 Server instalado em uma máquina de placa única em um ambiente semi-embutido; sem teclado ou tela, apenas acesso SSH a ele.

Então, é realmente frustrante quando, ocasionalmente, é inicializado e fica preso no menu GRUB, aguardando que uma tecla seja pressionada para selecionar a primeira opção.

Como configuro o GRUB para, em nenhuma circunstância, esperar por um pressionamento de tecla?

Atualização # 1: Não há menu.lst, já que este é o GRUB 2. Mas eu tenho um / etc / default / grub que é assim:

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=""

Atualização # 2: eu percebi isso. Nas botas que seguem inicializações malsucedidas, o GRUB desativa seu próprio tempo limite. Uma vez que mostrar o menu faz um arranque mal sucedido, este é um loop inescapável. Esse comportamento pode ser desativado editando o arquivo /etc/grub.d/00_header e alterando a função make_timeout:

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

Agora saia e execute novamente o script de atualização da configuração do grub:

sudo update-grub2

Não faz sentido para mim que esse comportamento seja o padrão para o Ubuntu Server, um produto destinado a máquinas acessadas pelo console.

    
por mikepurvis 04.03.2011 / 19:17

7 respostas

41

Para o Ubuntu 12.04 LTS, existe uma opção específica que pode ser definida em /etc/default/grub .

Por exemplo, se você quiser um tempo limite de 2 segundos (evitando interrupções para reinicializações autônomas), basta adicionar a seguinte linha em /etc/default/grub :

GRUB_RECORDFAIL_TIMEOUT=2

Lembre-se de executar update-grub depois disso ...

    
por 24.02.2013 / 18:54
18

Aqui estão as instruções para o Ubuntu 10.10, que são ligeiramente diferentes das versões anteriores. No arquivo /etc/grub.d/00_header comente a verificação estúpida de uma falha de inicialização anterior:

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

Em seguida, atualize:

sudo update-grub

Lembre-se de que, se houver uma segunda unidade com o Linux conectado, o grub2 a encontrará e solicitará ao usuário a inicialização de qual delas você deseja. Remova todas as unidades extras antes de executar o "update-grub".

Veja também o link

    
por 15.06.2011 / 08:42
6

Me deparei com essa visão extremamente desagradável do design com o Ubuntu Server 9.10. Sua correção me ajudou enormemente. Eu só queria ressaltar que a correção necessária para o 9.10 é diferente, já que não existe a função "make_timeout ()" no mesmo arquivo.

Para o Ubuntu 9.10, vá até o final do mesmo arquivo (00_header) e altere o seguinte:

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

para

if [ \${recordfail} = 1 ]; then
  set timeout=${GRUB_TIMEOUT}
else
  set timeout=${GRUB_TIMEOUT}
fi
EOF

Como antes, execute:

sudo update-grub2
    
por 14.03.2011 / 14:15
1

Configure o GRUB para acesso serial (e seu carregador de inicialização, enquanto você está nisso) e mantenha uma porta serial aberta, um cabo de modem nulo e um conversor USB-para-RS232 à mão para essas instâncias. Eu corro um servidor headless e um Guruplug e não faria de outra maneira.

    
por 20.04.2011 / 19:37
1

Acabei de definir um tempo limite longo para o recordfail:

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

Significa que você recebe 30 segundos de tempo limite quando inicializa, se a inicialização anterior falhou. (Não muito diferente de como esse outro sistema operacional faz isso ...)

Isso pode (e IMHO deve) ser uma configuração ali mesmo em / etc / default / grub.

    
por 28.07.2012 / 16:20
1

Eu realmente não sei por que essa é a ação padrão, especialmente para um servidor, mas é isso que implementei nos meus scripts de configuração de servidor.

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

Essa abordagem é um pouco mais limpa - basta modificar /etc/default/grub para adicionar a linha:

GRUB_RECORDFAIL_TIMEOUT=2

... qual deles pode ser feito automaticamente com algo assim no provisionamento:

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

Isso deve ser viável se a variável GRUB_RECORDFAIL_TIMEOUT for mencionada em /etc/grub.d/00_header (como estou vendo em 12.04 LTS) em:

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

Estou um pouco curioso sobre se investigar como as falhas são registradas pode render uma resposta ainda melhor.

    
por 13.05.2013 / 08:45