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.
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...
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
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
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
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.
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.
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.