web-dev-qa-db-fra.com

La machine du serveur Ubuntu sans tête est parfois bloquée sur GRUB

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

C'est donc vraiment frustrant quand il démarre occasionnellement et se bloque dans le menu GRUB, en attendant une frappe pour sélectionner la première option.

Comment configurer GRUB pour en aucun cas attendre une frappe?

Mise à jour # 1: Il n'y a pas de menu.lst, car c'est GRUB 2. Mais j'ai un/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 démarrages qui suivent les démarrages infructueux, GRUB désactive son propre délai d'expiration. Comme 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. fichier d/00_header et modification de la fonction make_timeout:

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

Maintenant, quittez et réexécutez le script de mise à jour de la configuration de grub:

Sudo update-grub2

Cela n'a aucun sens pour moi que ce comportement soit la valeur par défaut pour Ubuntu Server, un produit destiné aux machines accessibles par console.

54
mikepurvis

Pour Ubuntu 12.04 LTS, il existe une option spécifique qui peut être définie dans /etc/default/grub.

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

GRUB_RECORDFAIL_TIMEOUT=2

N'oubliez pas d'exécuter update-grub après ça...

41
Andrea Barcellona

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 antérieur:

##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 attaché, grub2 le trouvera et vous demandera au démarrage lequel vous voulez. Retirez tous les disques supplémentaires avant d'exécuter "update-grub".

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

18
Bryce

Je suis tombé sur cette erreur 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:

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

à

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

Comme précédemment, exécutez:

 Sudo update-grub2 
6
GNTC

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

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

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

GRUB_RECORDFAIL_TIMEOUT=2

... que l'on pourrait faire automatiquement avec quelque chose comme ça 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 en 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 façon dont les échecs sont enregistrés pourrait donner une réponse encore meilleure.

1
Alex North-Keys

Je viens de définir un long délai 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é. (Un peu comme les autres OS le font ...)

Cela pourrait (et à mon humble avis) même être un paramètre dans/etc/default/grub.

1
Gaute Lund

Configurez GRUB pour l'accès série (et votre chargeur de démarrage, pendant que vous y êtes) et gardez un port série ouvert, un câble null-modem et un convertisseur USB-RS232 à portée de main pour ces cas. I exécuter un serveur sans tête et un Guruplug et ne l'aurait pas autrement.

1
LawrenceC