Às vezes, a máquina do servidor Ubuntu sem cabeça fica presa no menu do GRUB

54

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

Portanto, é realmente frustrante quando ocasionalmente é inicializado e fica preso no menu GRUB, aguardando o pressionamento de tecla para selecionar a primeira opção.

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

Atualização # 1: Não existe menu.lst, pois esse é 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 descobri. Nas botas que seguem botas malsucedidas, o GRUB desativa seu próprio tempo limite. Como a exibição do menu torna a inicialização malsucedida, esse é um loop inevitá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 atualizador de 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.

mikepurvis
fonte
11
Como é sua /boot/grub/menu.lstaparência?
Shane Madden
7
Você pode publicar suas descobertas como resposta à sua própria pergunta, e não como uma edição. Dessa forma, temos a oportunidade de votar em sua resposta, se quisermos.
Skyhawk

Respostas:

41

Para o Ubuntu 12.04 LTS, há uma opção específica que pode ser configurada /etc/default/grub.

Por exemplo, se você deseja ter um tempo limite de 2 segundos (evitando travamentos para reinicializações autônomas), adicione a seguinte linha /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Lembre-se de correr update-grubatrás disso ...

Andrea Barcellona
fonte
Isso corrigiu meu problema inicial, que era o mesmo dos OPs, mas agora notei que, nas raras ocasiões em que conecto meu servidor a um monitor, não vejo nada. O monitor nem consegue uma conexão, mas o SSH ainda funciona bem. Isso é esperado?
Dowlers
18

Aqui estão as instruções para o Ubuntu 10.10, que são um pouco 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

Atualize:

sudo update-grub

Esteja ciente de que, se houver uma segunda unidade com o Linux conectado, o grub2 a encontrará e perguntará na inicialização qual você deseja. Remova todas as unidades extras antes de executar o "update-grub".

Veja também https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
fonte
6

Me deparei com essa supervisão de design profundamente desagradável com o Ubuntu Server 9.10. Sua correção me ajudou enormemente. Eu só queria salientar que a correção necessária para a 9.10 é diferente, pois não há função "make_timeout ()" no mesmo arquivo.

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

if [\ $ {recordfail} = 1]; então
  definir tempo limite = -1
outro
  tempo limite definido = $ {GRUB_TIMEOUT}
fi
EOF

para

if [\ $ {recordfail} = 1]; então
  tempo limite definido = $ {GRUB_TIMEOUT}
outro
  tempo limite definido = $ {GRUB_TIMEOUT}
fi
EOF

Como antes, execute:

sudo update-grub2
GNTC
fonte
Solução brilhante, tenho me perguntado como fazer isso, funciona perfeitamente! Nota: Ao atualizar o grub, você só precisa executar: "sudo update grub", independentemente da versão do grub em execução.
Isso acabou de salvar meu bacon - meu servidor ficou no menu grub a cada reinicialização por uma semana - não fazia ideia do que estava errado e tentara de tudo. Isso e a dica na pergunta fizeram. Muito obrigado.
Darren Greaves
1

Configure o GRUB para acesso serial (e seu carregador de inicialização, enquanto você estiver nele) e mantenha uma porta serial aberta, cabo de modem nulo e conversor de USB para RS232 à mão para essas instâncias. Eu corro um servidor sem cabeça e um Guruplug e não teria isso de outra maneira.

LawrenceC
fonte
1

Acabei de definir um longo tempo limite para recordfail:

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

Isso significa que você terá 30 segundos de tempo limite ao inicializar, se a inicialização anterior falhar. (Não muito diferente do que esse outro sistema operacional faz ...)

Isso poderia (e o IMHO deveria) até ser uma configuração ali no / etc / default / grub.

Gaute Lund
fonte
1

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

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

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

GRUB_RECORDFAIL_TIMEOUT=2

... o que alguém pode fazer 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 /etc/grub.d/00_header(como estou vendo no 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 para saber se descobrir como as falhas são registradas pode resultar em uma resposta ainda melhor.

Alex North-Keys
fonte
O parâmetro GRUB_RECORDFAIL_TIMEOUT foi adicionado desde que esta pergunta foi discutida originalmente. Hoje em dia, sim, esse é o melhor método.
Mikepurvis 13/05