GRUB 2 es el gestor de arranque que usan Ubuntu, Debian y la mayoría de distribuciones: carga el kernel y el initramfs y le pasa al kernel sus parámetros de arranque. En este tutorial aprenderás dónde vive su configuración en Ubuntu 24.04, a cambiar el tiempo de espera y los parámetros del kernel, a arrancar una sola vez con un kernel anterior y a recuperar un sistema cuyo GRUB está roto, tanto desde la propia shell de GRUB como reinstalándolo desde un sistema de rescate.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath. Debian 12 funciona igual; en Rocky Linux 9 los archivos están en /boot/grub2/ y se usa grub2-mkconfig en lugar de update-grub.
  • Un usuario no root con privilegios sudo.
  • Acceso a la consola del servidor (la consola VNC del panel en un VPS), porque el menú de GRUB y los errores de arranque no se ven por SSH.
  • Para la recuperación: poder arrancar un sistema live o de rescate con Ubuntu.

Paso 1: Identificar cómo arranca tu sistema

Lo primero es saber si el sistema arranca en modo BIOS (legacy) o UEFI, porque la reinstalación de GRUB es distinta en cada caso:

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS

Anota también el disco y las particiones:

lsblk -f
NAME   FSTYPE FSVER LABEL           UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 ext4   1.0   cloudimg-rootfs 4f1c2a9e-6b1d-4c0e-9a57-0e3b2d1f8c11   31.2G    18% /
├─sda14
└─sda15 vfat  FAT32 UEFI            7A3B-19C2                              98.3M     6% /boot/efi

En este ejemplo el disco es /dev/sda, la raíz está en sda1 y la partición EFI en sda15. En tu servidor los nombres pueden ser vda, nvme0n1 u otros.

Paso 2: Conocer los archivos de configuración

GRUB en Ubuntu se configura en tres lugares:

RutaFunción
/etc/default/grubOpciones principales: tiempo de espera, entrada por defecto, parámetros del kernel
/etc/default/grub.d/*.cfgFragmentos que se leen después de /etc/default/grub y pueden sobrescribirlo
/etc/grub.d/Scripts que generan las entradas del menú; 40_custom es para entradas propias
/boot/grub/grub.cfgArchivo final generado. No se edita a mano

/boot/grub/grub.cfg se regenera cada vez que ejecutas update-grub o se instala un kernel nuevo, así que cualquier cambio manual en él se pierde.

Revisa si hay fragmentos en grub.d, algo habitual en imágenes cloud:

ls /etc/default/grub.d/
grep -h GRUB_ /etc/default/grub.d/*.cfg 2>/dev/null

Si un fragmento define la misma variable que /etc/default/grub, gana el fragmento. Es la causa más común de "he cambiado /etc/default/grub y no pasa nada".

Paso 3: Ajustar el menú y el tiempo de espera

En servidores Ubuntu el menú suele estar oculto y el tiempo de espera es 0, lo que impide elegir otro kernel desde la consola. Muéstralo durante unos segundos editando /etc/default/grub:

sudo cp /etc/default/grub /etc/default/grub.bak
sudo nano /etc/default/grub

Localiza y ajusta estas líneas:

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
  • GRUB_TIMEOUT_STYLE=menu muestra siempre el menú (con hidden solo aparece si pulsas Esc durante el arranque).
  • GRUB_TIMEOUT=5 espera 5 segundos antes de arrancar la entrada por defecto.

Si en el paso anterior encontraste GRUB_TIMEOUT en /etc/default/grub.d/, cámbialo allí también.

Regenera grub.cfg:

sudo update-grub
Sourcing file `/etc/default/grub'
Sourcing file `/etc/default/grub.d/init-select.cfg'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.8.0-45-generic
Found initrd image: /boot/initrd.img-6.8.0-45-generic
Found linux image: /boot/vmlinuz-6.8.0-41-generic
Found initrd image: /boot/initrd.img-6.8.0-41-generic
done

Comprueba que el valor ha llegado al archivo final:

grep -m1 'set timeout=' /boot/grub/grub.cfg

Paso 4: Añadir parámetros al kernel

Los parámetros del kernel se definen en dos variables de /etc/default/grub:

  • GRUB_CMDLINE_LINUX: se aplican a todas las entradas, incluido el modo de recuperación.
  • GRUB_CMDLINE_LINUX_DEFAULT: solo a las entradas normales. Ubuntu pone aquí quiet splash en escritorio.

Como ejemplo, habilita la salida del kernel por la consola serie además de la pantalla, útil para ver los mensajes de arranque desde una consola serie:

sudo nano /etc/default/grub
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200n8"

Si la variable ya tenía valores, añade los nuevos separados por espacios en lugar de reemplazarlos. Regenera la configuración y reinicia:

sudo update-grub
sudo reboot

Tras el reinicio, verifica los parámetros con los que arrancó el kernel:

cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.8.0-45-generic root=UUID=4f1c2a9e-6b1d-4c0e-9a57-0e3b2d1f8c11 ro console=tty1 console=ttyS0,115200n8

Probar un parámetro sin tocar la configuración

Para probar un parámetro una sola vez, en el menú de GRUB selecciona la entrada, pulsa e, añade el parámetro al final de la línea que empieza por linux y arranca con Ctrl+X o F10. El cambio desaparece en el siguiente reinicio, así que es la forma segura de probar antes de hacerlo permanente.

Paso 5: Arrancar con un kernel anterior

Si una actualización de kernel da problemas, puedes arrancar con el anterior. Lista las entradas del menú con sus nombres exactos:

grep -E "^\s*(menuentry|submenu) " /boot/grub/grub.cfg | cut -d"'" -f2
Ubuntu
Advanced options for Ubuntu
Ubuntu, with Linux 6.8.0-45-generic
Ubuntu, with Linux 6.8.0-45-generic (recovery mode)
Ubuntu, with Linux 6.8.0-41-generic
Ubuntu, with Linux 6.8.0-41-generic (recovery mode)

Las entradas por kernel están dentro del submenú Advanced options for Ubuntu, así que se nombran como submenú>entrada.

Solo en el próximo arranque

grub-reboot elige una entrada para el siguiente arranque y después vuelve a la por defecto. Requiere que GRUB_DEFAULT sea saved:

sudo nano /etc/default/grub
GRUB_DEFAULT=saved
sudo update-grub
sudo grub-reboot "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-41-generic"
sudo reboot

Tras el reinicio, confirma el kernel en uso:

uname -r
6.8.0-41-generic

Si el servidor no arrancara con esa entrada, un reinicio más lo devuelve al kernel por defecto.

De forma permanente

Para fijar esa entrada como predeterminada, con GRUB_DEFAULT=saved usa grub-set-default:

sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-41-generic"

Recuerda deshacerlo con sudo grub-set-default 0 cuando el kernel nuevo esté corregido, o seguirás arrancando con uno antiguo sin parches de seguridad.

Paso 6: Recuperar el arranque desde la shell de GRUB

Si GRUB carga pero no encuentra su configuración, verás un prompt grub> o grub rescue> en la consola. Desde ahí puedes arrancar el sistema a mano.

Lista los discos y particiones que ve GRUB:

grub> ls
(hd0) (hd0,gpt15) (hd0,gpt14) (hd0,gpt1)

Busca la partición que contiene /boot:

grub> ls (hd0,gpt1)/boot/

Cuando veas los archivos vmlinuz-* e initrd.img-*, arranca desde ella. Sustituye (hd0,gpt1) y /dev/sda1 por los valores de tu sistema; usa la tecla Tab para completar los nombres de archivo:

grub> set root=(hd0,gpt1)
grub> linux /boot/vmlinuz root=/dev/sda1 ro
grub> initrd /boot/initrd.img
grub> boot

En Ubuntu, /boot/vmlinuz y /boot/initrd.img son enlaces al kernel más reciente. Si estás en grub rescue>, que tiene menos comandos, carga antes el módulo normal:

grub rescue> set prefix=(hd0,gpt1)/boot/grub
grub rescue> set root=(hd0,gpt1)
grub rescue> insmod normal
grub rescue> normal

Una vez dentro del sistema, repara GRUB de forma permanente:

sudo update-grub
sudo grub-install /dev/sda

En sistemas UEFI omite el disco: sudo grub-install reinstala en la partición EFI montada en /boot/efi.

Paso 7: Reinstalar GRUB desde un sistema de rescate

Si no llegas ni al prompt de GRUB, arranca un sistema live o de rescate con Ubuntu y reinstala GRUB entrando en el sistema instalado con chroot.

Identifica las particiones con lsblk -f, como en el paso 1, y monta la raíz. En este ejemplo la raíz es /dev/sda1 y la partición EFI /dev/sda15:

sudo mount /dev/sda1 /mnt

Si /boot está en una partición separada, móntala en /mnt/boot. En sistemas UEFI monta también la partición EFI:

sudo mount /dev/sda15 /mnt/boot/efi

Monta los sistemas de archivos virtuales que necesitan las herramientas de GRUB y entra en el sistema:

for d in dev proc sys run; do sudo mount --rbind "/$d" "/mnt/$d"; done
sudo chroot /mnt

Dentro del chroot ya eres root. Reinstala GRUB según el modo de arranque.

En BIOS, instala en el disco (no en la partición):

grub-install /dev/sda

En UEFI:

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu

La instalación debe terminar sin errores:

Installing for x86_64-efi platform.
Installation finished. No error reported.

En ambos casos, regenera la configuración:

update-grub

Sal del chroot, desmonta y reinicia sin el medio de rescate:

exit
sudo umount -R /mnt
sudo reboot

Solución de problemas

Los cambios en /etc/default/grub no tienen efecto. Olvidaste ejecutar sudo update-grub, o un fragmento en /etc/default/grub.d/ sobrescribe la variable. Revisa el paso 2.

grub-install: error: cannot find EFI directory. La partición EFI no está montada en /boot/efi. Móntala antes de ejecutar grub-install.

grub-install: warning: this GPT partition label contains no BIOS Boot Partition. El disco usa GPT y arranca en modo BIOS, pero no tiene la pequeña partición BIOS boot que GRUB necesita. Comprueba primero que el modo de arranque detectado es el correcto; si lo es, esa partición debe crearse antes de reinstalar.

El servidor arranca en initramfs en lugar de en el sistema. GRUB funciona, pero el kernel no encuentra la raíz. Revisa que el UUID de root= en /proc/cmdline o en grub.cfg coincide con el de lsblk -f y que /etc/fstab es correcto.

Conclusión

Has aprendido dónde se configura GRUB en Ubuntu 24.04, a mostrar el menú, añadir parámetros al kernel, arrancar con un kernel anterior y recuperar el arranque desde la shell de GRUB o desde un sistema de rescate con chroot. Como siguientes pasos, puedes revisar los mensajes de arranque del kernel con journalctl -k -b, gestionar los módulos que carga el initramfs o limpiar kernels antiguos con sudo apt autoremove --purge.