Configuración y Recuperación del Bootloader GRUB
GRUB (GRand Unified Bootloader) es el bootloader estándar en la mayoría de distribuciones Linux, responsable de cargar el kernel del sistema operativo durante el arranque. Más allá de su función básica, GRUB permite personalizar el menú de arranque, configurar entradas para múltiples sistemas operativos, proteger el acceso con contraseña y recuperar sistemas que no arrancan. Esta guía cubre la configuración completa de GRUB 2, la gestión de entradas de menú y los procedimientos de recuperación ante fallos del bootloader.
Requisitos Previos
- Linux con GRUB 2: Ubuntu, Debian, CentOS 7+, Rocky Linux 8+
- Acceso root o privilegios sudo
- Para recuperación: medio de arranque (USB/CD) con la misma distribución o compatible
- Conocimiento básico de la estructura del disco (MBR vs GPT, BIOS vs UEFI)
Estructura de GRUB 2
# Archivos principales de GRUB 2
ls /boot/grub/ # Ubuntu/Debian (o /boot/grub2/ en RHEL/CentOS)
ls /etc/grub.d/ # Scripts que generan grub.cfg
cat /etc/default/grub # Configuración principal
# Estructura de /etc/grub.d/ (se ejecutan en orden numérico)
ls /etc/grub.d/
# 00_header - Cabecera y configuración inicial
# 05_debian_theme - Tema (Ubuntu/Debian)
# 10_linux - Kernels Linux instalados (auto-generado)
# 20_linux_xen - Kernels Xen (si está instalado)
# 30_os-prober - Otros sistemas operativos detectados
# 40_custom - Entradas personalizadas (editable)
# 41_custom - Entradas desde /boot/grub/custom.cfg
# NUNCA editar grub.cfg directamente, siempre usar update-grub
# El archivo generado es:
cat /boot/grub/grub.cfg | head -30 # Ubuntu/Debian
cat /boot/grub2/grub.cfg | head -30 # CentOS/Rocky
Configuración Principal
El archivo /etc/default/grub controla el comportamiento principal de GRUB:
# Ver configuración actual
cat /etc/default/grub
# Configuración completa recomendada para servidores
cat > /etc/default/grub << 'EOF'
# Entrada por defecto (0 = primera, saved = última seleccionada)
GRUB_DEFAULT=0
# Habilitar memoria de la última selección
# GRUB_SAVEDEFAULT=true
# Tiempo de espera en segundos (0 = sin espera, -1 = esperar indefinidamente)
GRUB_TIMEOUT=5
# Estilo del timeout (menu = mostrar menú, hidden = oculto)
GRUB_TIMEOUT_STYLE=menu
# Distribución del teclado en GRUB
GRUB_TERMINAL_INPUT="console"
GRUB_TERMINAL_OUTPUT="console"
# Parámetros del kernel para todas las entradas
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# Parámetros adicionales solo para la entrada por defecto
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# Deshabilitar generación de entradas de recuperación
# GRUB_DISABLE_RECOVERY=true
# Mostrar menú aunque solo haya un sistema operativo
# GRUB_FORCE_PARTUUID=
EOF
# Aplicar cambios
update-grub # Ubuntu/Debian
grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/Rocky
# Verificar el resultado
grep "^menuentry\|^submenu" /boot/grub/grub.cfg
Parámetros Útiles del Kernel en GRUB_CMDLINE_LINUX
# Editar /etc/default/grub y añadir en GRUB_CMDLINE_LINUX:
# Consola serie para acceso KVM/IPMI
GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8"
# Nombres de interfaces de red predecibles (eth0 en lugar de enp3s0)
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
# Deshabilitar especulación de ramificación (seguridad, puede reducir rendimiento)
GRUB_CMDLINE_LINUX="mitigations=auto"
# Máxima cantidad de memoria a usar
GRUB_CMDLINE_LINUX="mem=4G"
# Modo de ahorro de energía del CPU
GRUB_CMDLINE_LINUX="intel_pstate=disable"
# Ejemplo con múltiples parámetros
GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 net.ifnames=0 biosdevname=0"
# Siempre aplicar después de cambiar
update-grub
Gestión de Entradas del Menú
Ver y Seleccionar Entradas
# Listar todas las entradas de GRUB
grep -E "^menuentry|submenu" /boot/grub/grub.cfg | \
awk -F"'" '{print NR-1": "$2}'
# Ver la entrada por defecto actual
grub-editenv list # Ubuntu
# grub2-editenv list # CentOS/Rocky
# Establecer una entrada por defecto específica
grub-set-default 0 # Primera entrada
grub-set-default "Ubuntu" # Por nombre completo
# Arrancar con una entrada diferente una sola vez (no cambia el defecto)
grub-reboot 2 # Tercer kernel disponible
reboot
# Para servidores CentOS/Rocky
grub2-set-default 0
grub2-reboot 1
Entradas Personalizadas
# Añadir entradas personalizadas en /etc/grub.d/40_custom
cat >> /etc/grub.d/40_custom << 'EOF'
# Entrada personalizada para arrancar desde red (PXE)
menuentry "Arranque PXE (red)" {
insmod pxe
pxe
}
# Entrada para arrancar desde ISO en disco
# (requiere loopback support)
menuentry "Ubuntu 22.04 Live USB" {
insmod loopback
insmod iso9660
set iso_path="/ubuntu-22.04.iso"
loopback loop (hd0,1)$iso_path
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso_path quiet
initrd (loop)/casper/initrd
}
EOF
update-grub
Configuración Dual Boot
Detectar Automáticamente Otros SO
# Instalar os-prober para detectar otros sistemas operativos
apt install os-prober # Ubuntu/Debian
# dnf install grub2-tools # CentOS/Rocky
# Habilitar os-prober en la configuración de GRUB
echo "GRUB_DISABLE_OS_PROBER=false" >> /etc/default/grub
# Ejecutar os-prober manualmente para verificar detección
os-prober
# Regenerar configuración con las nuevas entradas
update-grub
Entrada Manual para Windows
# Si os-prober no detecta Windows, añadirlo manualmente
# Primero identificar la partición de Windows
fdisk -l | grep "Microsoft"
blkid | grep ntfs
# Añadir a /etc/grub.d/40_custom
cat >> /etc/grub.d/40_custom << 'EOF'
menuentry "Windows 10/11" {
insmod part_gpt
insmod ntfs
insmod chain
# Ajustar (hd0,gpt1) a la partición correcta de Windows
set root=(hd0,gpt1)
chainloader +1
}
EOF
update-grub
Protección con Contraseña
GRUB puede proteger el acceso al menú o a entradas específicas con contraseña:
# Generar hash de contraseña para GRUB
grub-mkpasswd-pbkdf2
# Introducir y confirmar la contraseña
# Copiar el hash generado (pbkdf2:sha512:...)
# Configurar la contraseña en GRUB
cat > /etc/grub.d/01_users << 'EOF'
#!/bin/sh
# Configurar usuario y contraseña de GRUB
cat << GRUB_CONFIG
set superusers="admin"
password_pbkdf2 admin grub.pbkdf2.sha512.10000.HASH_AQUI
GRUB_CONFIG
EOF
chmod +x /etc/grub.d/01_users
# Para proteger solo entradas específicas (no todas)
# En /etc/grub.d/40_custom, añadir --users "" para entradas sin restricción
cat >> /etc/grub.d/40_custom << 'EOF'
menuentry "Ubuntu (sin restricción)" --unrestricted {
# Esta entrada es accesible sin contraseña
search --no-floppy --label --set=root ubuntu-root
linux /boot/vmlinuz root=LABEL=ubuntu-root
initrd /boot/initrd.img
}
EOF
update-grub
Temas y Personalización Visual
# Instalar el tema de GRUB de la distribución
apt install grub2-themes-ubuntu-mate # Ubuntu MATE (ejemplo)
# Instalar un tema personalizado
# Descargar tema, por ejemplo de gnome-look.org
# Copiar al directorio de temas de GRUB
cp -r /tmp/mi-tema /boot/grub/themes/
# Configurar el tema en /etc/default/grub
echo 'GRUB_THEME="/boot/grub/themes/mi-tema/theme.txt"' >> /etc/default/grub
echo 'GRUB_GFXMODE="1920x1080,auto"' >> /etc/default/grub
echo 'GRUB_GFXPAYLOAD_LINUX="keep"' >> /etc/default/grub
update-grub
# Para servidores sin monitor, configurar terminal de texto
cat >> /etc/default/grub << 'EOF'
GRUB_TERMINAL_OUTPUT="console"
GRUB_BACKGROUND=""
EOF
update-grub
Recuperación de GRUB
Recuperar GRUB desde la Shell de GRUB
Si GRUB arranca pero no puede cargar la configuración, aparece la shell de GRUB:
# En la shell de GRUB (grub>):
# Listar dispositivos disponibles
ls
# Listar particiones de un disco
ls (hd0,gpt1)/
# Buscar el kernel
ls (hd0,gpt2)/boot/
# Cargar el kernel manualmente (ajustar la partición y versión del kernel)
set root=(hd0,gpt2)
linux /boot/vmlinuz-5.15.0-78-generic root=/dev/sda2 ro quiet
initrd /boot/initrd.img-5.15.0-78-generic
boot
Reinstalar GRUB desde un Live USB/CD
# Arrancar desde USB/CD de rescate de la misma distribución
# Identificar la partición raíz del sistema dañado
fdisk -l
lsblk
# Montar el sistema raíz
mount /dev/sda2 /mnt
# Montar la partición EFI si el sistema usa UEFI
mount /dev/sda1 /mnt/boot/efi
# Montar sistemas de archivos virtuales
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
mount --bind /run /mnt/run
# Entrar al sistema como chroot
chroot /mnt
# Reinstalar GRUB - BIOS/MBR
grub-install /dev/sda # Ubuntu/Debian
grub2-install /dev/sda # CentOS/Rocky
# Reinstalar GRUB - UEFI
grub-install --target=x86_64-efi \
--efi-directory=/boot/efi \
--bootloader-id=ubuntu \
--recheck
# Regenerar la configuración
update-grub # Ubuntu/Debian
grub2-mkconfig -o /boot/grub2/grub.cfg # CentOS/Rocky
# Salir del chroot y reiniciar
exit
umount -R /mnt
reboot
Recuperar GRUB en Sistemas UEFI
# En sistemas UEFI, verificar las entradas de arranque
efibootmgr -v
# Añadir entrada EFI manualmente si se eliminó
efibootmgr --create \
--disk /dev/sda \
--part 1 \
--label "Ubuntu" \
--loader "\EFI\ubuntu\shimx64.efi"
# Cambiar el orden de arranque
efibootmgr --bootorder 0000,0001,0002
# Activar una entrada deshabilitada
efibootmgr --bootnum 0000 --active
Solución de Problemas
GRUB muestra "error: unknown filesystem":
# El UUID de la partición raíz cambió o el sistema de archivos está dañado
# Desde la shell de GRUB, identificar el disco correcto:
ls (hd0,gpt2)/ # Buscar el directorio /boot
# Cargar manualmente el kernel según la sección de recuperación
update-grub no detecta el kernel instalado:
# Verificar que el kernel está en /boot
ls /boot/vmlinuz* /boot/initrd*
# Si no existe el initramfs, regenerarlo
update-initramfs -u -k all # Ubuntu
# dracut --force # CentOS/Rocky
GRUB no aparece al arrancar (timeout=0):
# Si el timeout es 0 y necesitas acceder al menú
# Mantener presionada la tecla SHIFT durante el POST
# O cambiar el timeout:
sed -i 's/GRUB_TIMEOUT=0/GRUB_TIMEOUT=5/' /etc/default/grub
update-grub
Error "cannot open /dev/sda: Permission denied" al instalar GRUB:
# Asegurarse de estar en el chroot correcto
mount | grep /mnt
# Verificar que /dev está montado correctamente
ls /mnt/dev/sda*
mount --bind /dev /mnt/dev
Conclusión
GRUB 2 es un bootloader flexible y potente que va mucho más allá de simplemente cargar el kernel Linux. La configuración adecuada de GRUB—incluyendo la gestión de entradas de menú, parámetros del kernel, protección con contraseña y preparación para recuperación—es fundamental para la administración de servidores profesional. Mantén siempre un medio de arranque de rescate disponible y familiarízate con los procedimientos de recuperación antes de que los necesites en una situación de emergencia.


