Le serveur sans tête Ubuntu est parfois bloqué dans le menu GRUB

54

Ubuntu 10.10 Server est installé sur une machine à carte unique dans un environnement semi-intégré; pas de clavier ou d'écran, juste un accès SSH à celui-ci.

Il est donc très frustrant de constater qu’il démarre de temps en temps et reste bloqué dans le menu GRUB, dans l’attente d’une frappe au clavier pour sélectionner la première option.

Comment configurer GRUB pour qu’il n’attende en aucun cas une frappe?

Mise à jour # 1: Il n'y a pas de menu.lst, puisqu'il s'agit de GRUB 2. Mais j'ai un fichier / etc / default / grub qui ressemble à ceci:

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

Mise à jour # 2: Je l'ai compris. Sur les bottes qui succèdent à celles qui échouent, GRUB désactive son propre délai d’attente. Depuis que l'affichage du menu rend un démarrage infructueux, il s'agit d'une boucle incontournable. Ce comportement peut être désactivé en modifiant le fichier /etc/grub.d/00_header et en modifiant la fonction make_timeout:

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

Maintenant, quittez et relancez le script de mise à jour de la configuration grub:

sudo update-grub2

Cela n’a aucun sens pour moi de penser que ce comportement serait le comportement par défaut d’Ubuntu Server, un produit destiné aux machines accédées par console.

Mikepurvis
la source
1
A quoi /boot/grub/menu.lstressemble ton look?
Shane Madden
7
Vous êtes invités à publier vos résultats en réponse à votre propre question, plutôt qu’en tant que modification. De cette façon, nous avons la possibilité d’invoquer votre réponse si cela nous convient.
Skyhawk

Réponses:

41

Pour Ubuntu 12.04 LTS, une option spécifique peut être configurée /etc/default/grub.

Par exemple, si vous souhaitez un délai d'expiration de 2 secondes (évitant ainsi les blocages pour les redémarrages sans surveillance), ajoutez simplement la ligne suivante /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

N'oubliez pas de courir update-grubaprès ça ...

Andrea Barcellona
la source
Cela a résolu mon problème initial, qui était identique à celui des PO, mais maintenant, je me suis aperçu que, lorsque je connectais mon serveur à un moniteur, je ne voyais rien. Le moniteur ne parvient même pas à se connecter, mais SSH fonctionne toujours correctement. Est-ce prévu?
Dowlers
18

Voici les instructions pour Ubuntu 10.10, qui sont légèrement différentes des versions précédentes. Dans le fichier /etc/grub.d/00_header, commentez la vérification stupide pour un échec de démarrage précédent:

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

Puis mettez à jour:

sudo update-grub

Sachez que s'il y a un deuxième disque avec Linux connecté, grub2 le trouvera et vous demandera au démarrage lequel vous voulez. Supprimez tous les lecteurs supplémentaires avant d'exécuter "update-grub".

Voir aussi https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
la source
6

Je suis tombé sur cet oubli de conception profondément désagréable avec Ubuntu Server 9.10. Votre solution m'a énormément aidé. Je voulais juste souligner que le correctif nécessaire pour 9.10 est différent car il n'y a pas de fonction "make_timeout ()" dans le même fichier.

Pour Ubuntu 9.10, allez à la fin du même fichier (00_header) et modifiez ce qui suit:

if [\ $ {recordfail} = 1]; ensuite
  set timeout = -1
autre
  set timeout = $ {GRUB_TIMEOUT}
Fi
EOF

à

if [\ $ {recordfail} = 1]; ensuite
  set timeout = $ {GRUB_TIMEOUT}
autre
  set timeout = $ {GRUB_TIMEOUT}
Fi
EOF

Comme avant, lancez:

sudo update-grub2
GNTC
la source
Solution brillante, je me demandais comment faire cela, fonctionnait parfaitement! Remarque: lorsque vous mettez à jour grub, vous devez uniquement exécuter: "sudo update grub" quelle que soit la version de grub que vous exécutez.
Cela vient de sauver mon bacon - mon serveur a été assis au menu de tous les redémarrages pendant une semaine - n'avait aucune idée de ce qui n'allait pas et avait tout essayé. Ceci et le conseil dans la question l'ont fait. Merci beaucoup.
Darren Greaves
1

Configurez GRUB pour un accès série (et votre chargeur de démarrage pendant que vous y êtes) et conservez un port série ouvert, un câble null-modem et un convertisseur USB-RS232 pour ces instances. Je lance un serveur sans tête et un Guruplug et je ne l'aurais pas autrement.

LawrenceC
la source
1

Je viens de définir un long délai d'attente pour recordfail:

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

Cela signifie que vous obtenez un délai d'expiration de 30 secondes lorsque vous démarrez, si le démarrage précédent a échoué. (Ce n'est pas différent de la façon dont cet autre OS le fait ...)

Cela pourrait (et IMHO devrait) être même un paramètre situé dans / etc / default / grub.

Gaute Lund
la source
1

Je ne sais vraiment pas pourquoi il s’agit de l’action par défaut, en particulier pour un serveur, mais c’est ce que j’ai implémenté dans les scripts de configuration de mon serveur.

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

Cette approche est un peu plus propre - il suffit de modifier /etc/default/grubpour ajouter la ligne:

GRUB_RECORDFAIL_TIMEOUT=2

... que l'on pourrait faire automatiquement avec quelque chose comme ceci dans le 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

Cela devrait être viable si la variable GRUB_RECORDFAIL_TIMEOUT est mentionnée dans /etc/grub.d/00_header(comme je le vois dans 12.04 LTS) dans:

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

Je suis un peu curieux de savoir si creuser dans la manière dont les échecs sont enregistrés pourrait donner une réponse encore meilleure.

Alex North-Keys
la source
Le paramètre GRUB_RECORDFAIL_TIMEOUT a été ajouté depuis que cette question a été discutée à l'origine. De nos jours, oui, c'est la meilleure méthode.
Mikepurvis