La macchina server Ubuntu senza testa a volte bloccata nel menu di GRUB


54

Ho Ubuntu 10.10 Server installato su una macchina a scheda singola in un ambiente semi-incorporato; nessuna tastiera o schermo, solo l'accesso SSH ad esso.

Quindi è davvero frustrante quando si avvia di tanto in tanto e si blocca nel menu di GRUB, in attesa di un tasto per selezionare la prima opzione.

Come configuro GRUB in nessun caso in attesa di una sequenza di tasti?

Aggiornamento n. 1: Non esiste menu.lst, dato che si tratta di GRUB 2. Ma ho un / etc / default / grub che è così:

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

Aggiornamento n. 2: l'ho capito. Sugli stivali che seguono scarichi falliti, GRUB disabilita il proprio timeout. Poiché la visualizzazione del menu rende l'avvio non riuscito, si tratta di un ciclo inevitabile. Questo comportamento può essere disabilitato modificando il file /etc/grub.d/00_header e cambiando la funzione make_timeout:

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

Ora esci e riesegui lo script di aggiornamento della configurazione di grub:

sudo update-grub2

Non ha senso per me che questo comportamento sia predefinito per Ubuntu Server, un prodotto destinato alle macchine a cui accede la console.


1
Com'è il tuo /boot/grub/menu.lstaspetto?
Shane Madden

7
Puoi pubblicare i risultati come risposta alla tua domanda, anziché come modifica. In questo modo, abbiamo l'opportunità di votare la tua risposta se ci piace.
Skyhawk,

Risposte:


41

Per Ubuntu 12.04 LTS esiste un'opzione specifica che può essere impostata /etc/default/grub.

Ad esempio, se si desidera avere un timeout di 2 secondi (evitando così blocchi per riavvii non presidiati) è sufficiente aggiungere la seguente riga in /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Ricordati di correre update-grubdopo ...


Ciò ha risolto il mio problema iniziale, che era lo stesso dei PO ma ora ho notato che nelle rare occasioni in cui collego il mio server a un monitor non vedo nulla. Il monitor non ottiene nemmeno una connessione, ma SSH funziona ancora bene. È previsto?
Dowlers,

18

Ecco le istruzioni per Ubuntu 10.10, che sono leggermente diverse dalle versioni precedenti. Nel file /etc/grub.d/00_header commenta lo stupido controllo per un errore di avvio precedente:

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

Quindi aggiorna:

sudo update-grub

Ricorda che se esiste una seconda unità con Linux collegato, grub2 la troverà e ti chiederà all'avvio quale vuoi. Rimuovere tutte le unità extra prima di eseguire "update-grub".

Vedi anche https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544


6

Mi sono imbattuto in questa svista di progettazione profondamente spiacevole con Ubuntu Server 9.10. La tua correzione mi ha aiutato enormemente. Volevo solo sottolineare che la correzione necessaria per 9.10 è diversa in quanto non esiste una funzione "make_timeout ()" nello stesso file.

Per Ubuntu 9.10, vai alla fine dello stesso file (00_header) e modifica quanto segue:

if [\ $ {recordfail} = 1]; poi
  impostare il timeout = -1
altro
  set timeout = $ {GRUB_TIMEOUT}
fi
EOF

per

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

Come prima, quindi esegui:

sudo update-grub2

Soluzione brillante, mi chiedevo come farlo, funziona perfettamente! Nota: quando aggiorni grub, devi solo eseguire: "sudo update grub" indipendentemente dalla versione di grub che stai eseguendo.

Questo ha appena salvato il mio bacon - il mio server è stato seduto nel menu di grub ad ogni riavvio per una settimana - non aveva idea di cosa fosse sbagliato e aveva provato di tutto. Questo e il suggerimento nella domanda lo hanno fatto. Grazie mille.
Darren Greaves,

1

Configura GRUB per l'accesso seriale (e il tuo bootloader, mentre ci sei) e mantieni una porta seriale aperta, un cavo null-modem e un convertitore da USB a RS232 a portata di mano per queste istanze. Gestisco un server senza testa e un Guruplug e non lo farei in nessun altro modo.


1

Ho appena impostato un timeout lungo per il recordfail:

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

Ciò significa che si ottiene un timeout di 30 secondi all'avvio, se l'avvio precedente non è riuscito. (Non diversamente da come fa quell'altro SO ...)

Questo potrebbe (e IMHO dovrebbe) essere anche un'impostazione proprio in / etc / default / grub.


1

Non so davvero perché questa sia l'azione predefinita, specialmente per un server, ma questo è ciò che ho implementato negli script di configurazione del mio server.

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

1

Questo approccio è un po 'più pulito: basta modificare /etc/default/grubper aggiungere la riga:

GRUB_RECORDFAIL_TIMEOUT=2

... che si potrebbe fare automaticamente con qualcosa di simile nel provisioning:

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

Questo dovrebbe essere praticabile se la variabile GRUB_RECORDFAIL_TIMEOUT è menzionata in /etc/grub.d/00_header(come sto vedendo in 12.04 LTS) in:

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

Sono un po 'curioso di sapere se scavare nel modo in cui i guasti vengono registrati potrebbe dare una risposta ancora migliore.


Il parametro GRUB_RECORDFAIL_TIMEOUT è stato aggiunto da quando questa domanda è stata inizialmente discussa. Oggi sì, questo è il metodo migliore.
mikepurvis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.