La máquina del servidor Ubuntu sin cabeza a veces se atasca en el menú de GRUB

54

Tengo Ubuntu 10.10 Server instalado en una máquina de placa única en un entorno semi-integrado; sin teclado o pantalla, solo acceso SSH a él.

Por lo tanto, es realmente frustrante cuando ocasionalmente se inicia y se atasca en el menú de GRUB, esperando que se presione una tecla para seleccionar la primera opción.

¿Cómo configuro GRUB para que en ningún caso espere una pulsación de tecla?

Actualización n. ° 1: No hay menu.lst, ya que es GRUB 2. Pero tengo un / etc / default / grub que es así:

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

Actualización n. ° 2: Lo descubrí. En las botas que siguen a las botas fallidas, GRUB deshabilita su propio tiempo de espera. Dado que mostrar el menú hace que un arranque no tenga éxito, este es un bucle ineludible. Este comportamiento puede deshabilitarse editando el archivo /etc/grub.d/00_header y cambiando la función make_timeout:

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

Ahora salga y vuelva a ejecutar el script de actualización de configuración de grub:

sudo update-grub2

No tiene sentido para mí que este comportamiento sea el predeterminado para Ubuntu Server, un producto destinado a máquinas a las que se accede por consola.

mikepurvis
fuente
1
¿Cómo te /boot/grub/menu.lstves?
Shane Madden
77
Puede publicar sus hallazgos como respuesta a su propia pregunta, en lugar de como una edición. De esa manera, tenemos la oportunidad de votar su respuesta si nos gusta.
Skyhawk

Respuestas:

41

Para Ubuntu 12.04 LTS hay una opción específica que se puede configurar /etc/default/grub.

Por ejemplo, si desea tener un tiempo de espera de 2 segundos (evitando así bloqueos para reinicios desatendidos) simplemente agregue la siguiente línea /etc/default/grub:

GRUB_RECORDFAIL_TIMEOUT=2

Recuerda correr update-grubdespués de eso ...

Andrea Barcellona
fuente
Esto solucionó mi problema inicial, que era el mismo que el de los OP, pero ahora noté que en la rara ocasión cuando conecto mi servidor a un monitor no veo nada. El monitor ni siquiera tiene conexión, pero SSH aún funciona bien. ¿Se espera esto?
Dowlers
18

Aquí hay instrucciones para Ubuntu 10.10, que son ligeramente diferentes de las versiones anteriores. En el archivo /etc/grub.d/00_header, comente la estúpida comprobación de un error de arranque anterior:

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

Luego actualiza:

sudo update-grub

Tenga en cuenta que si hay un segundo disco con Linux conectado, grub2 lo encontrará y le preguntará en el arranque cuál desea. Elimine todas las unidades adicionales antes de ejecutar "update-grub".

Ver también https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/797544

Bryce
fuente
6

Encontré este descuido de diseño profundamente desagradable con Ubuntu Server 9.10. Su solución me ha ayudado enormemente. Solo quería señalar que la corrección necesaria para 9.10 es diferente ya que no hay una función "make_timeout ()" en el mismo archivo.

Para Ubuntu 9.10, vaya al final del mismo archivo (00_header) y cambie lo siguiente:

si [\ $ {recordfail} = 1]; entonces
  establecer tiempo de espera = -1
más
  establecer tiempo de espera = $ {GRUB_TIMEOUT}
fi
EOF

a

si [\ $ {recordfail} = 1]; entonces
  establecer tiempo de espera = $ {GRUB_TIMEOUT}
más
  establecer tiempo de espera = $ {GRUB_TIMEOUT}
fi
EOF

Como antes, ejecute:

sudo update-grub2
GNTC
fuente
Solución brillante, me he estado preguntando cómo hacer esto, ¡funciona perfectamente! Nota: Cuando actualiza grub, solo necesita ejecutar: "sudo update grub" independientemente de la versión de grub que esté ejecutando.
Esto acaba de salvar mi tocino, mi servidor se ha sentado en el menú de grub en cada reinicio durante una semana, no tenía idea de lo que estaba mal y lo había intentado todo. Esto y el consejo en la pregunta lo hicieron. Muchas gracias.
Darren Greaves
1

Configure GRUB para el acceso en serie (y su gestor de arranque, mientras está en él) y mantenga a mano un puerto serie abierto, un cable de módem nulo y un convertidor de USB a RS232 para estas instancias. Ejecuto un servidor sin cabeza y un Guruplug y no lo haría de otra manera.

LawrenceC
fuente
1

Acabo de establecer un tiempo de espera largo para recordfail:

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

Lo que significa que tiene un tiempo de espera de 30 segundos cuando arranca, si falla el arranque anterior. (No muy diferente de cómo lo hace ese otro sistema operativo ...)

Esto podría (y en mi humilde opinión debería) incluso ser una configuración allí mismo en / etc / default / grub.

Gaute Lund
fuente
1

Realmente no sé por qué esta es la acción predeterminada, especialmente para un servidor, pero esto es lo que he implementado en los scripts de configuración de mi servidor.

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

Este enfoque es un poco más limpio: solo modifique /etc/default/grubpara agregar la línea:

GRUB_RECORDFAIL_TIMEOUT=2

... cuál podría hacer automáticamente con algo como esto en el aprovisionamiento:

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

Esto debería ser viable si la variable GRUB_RECORDFAIL_TIMEOUT se menciona en /etc/grub.d/00_header(como estoy viendo en 12.04 LTS) en:

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

Tengo un poco de curiosidad acerca de si investigar cómo se registran las fallas podría dar una respuesta aún mejor.

Alex North-Keys
fuente
El parámetro GRUB_RECORDFAIL_TIMEOUT se ha agregado desde que esta pregunta se discutió originalmente. Hoy en día, sí, este es el mejor método.
mikepurvis