Mantenimiento y configuración del gestor de arranque GRUB 2 en Linux

Introducción a GRUB 2

Conceptos fundamentales de GRUB

GRUB funciona como el cargador de arranque predeterminado en distribuciones Linux. Antes de que el sistema operativo se cargue, se requiere un programa especializado que contenga las instrucciones necesarias (como las almacenadas en el MBR) para iniciar el proceso de arranque. Este componente reside típicamente en el disco principal del sistema o en algún medio de almacenamiento alternativo.

El instalador de Linux permite configurar rápidamente el cargador de arranque, ubicándolo en el registro maestro de arranque del disco principal.

GNU GRUB es una herramienta que escribe el cargador de arranque en el MBR, situado en el primer sector del disco duro. Facilita la ejecución de comandos específicos desde esta zona para desplegar un menú o entorno de comandos GRUB. Esto permite al usuario seleccionar sistemas operativos, transmitir parámetros específicos al kernel durante el arranque, o establecer configuraciones del sistema previas al inicio del kernel (como la cantidad de RAM disponible).

GRUB soporta métodos de arranque directo y en cadena. Es compatible con prácticamente cualquier sistema operativo, la mayoría de sistemas de archivos populares y los discos duros reconocidos por la BIOS del sistema.

Características avanzadas de GRUB 2

GRUB 2 representa una evolución significativa respecto a su predecesor, incorporando funcionalidades que no existían en la versión original:

  1. Interfaz gráfica de usuario
  2. Arquitectura modular que permite cargar dinámicamente los componentes necesarios
  3. Soporte para lenguajes de scripting, incluyendo condicionales, bucles, variables y funciones
  4. Modo de recuperación para situaciones donde el sistema no puede arrancar
  5. Soporte internacional con conjuntos de caracteres no ASCII, clasificación de mensajes tipo gettext, fuentes y consola gráfica
  6. Interfaz de línea de comandos flexible; si no existe archivo de configuración, GRUB 2 entra automáticamente en modo comandos
  7. Marco jerárquico, modular y orientado a objetos para sistemas de archivos, archivos, dispositivos, controladores, terminales, comandos, tablas de particiones y módulos del sistema
  8. Compatibilidad con múltiples formatos de sistemas de archivos
  9. Acceso a datos en dispositivos de instalación
  10. Descompresión automática integrada

Nomenclatura de dispositivos y particiones en GRUB 2

GRUB 2 utiliza fd para disquetes y hd para discos duros (incluyendo IDE y SCSI). Los dispositivos se numeran desde 0 y las particiones desde 1. Las particiones primarias van de 1 a 4, mientras que las lógicas comienzan en 5. A continuación se presentan ejemplos de la sintaxis:

  • (fd0): primer disquete
  • (hd0): primer disco duro (la mayoría de memorias USB y discos portátiles USB, así como tarjetas SD, se tratan como discos duros)
  • (hd0,msdos1): primera partición del primer disco
  • (hd0,msdos1)/boot/vmlinuz-3.10.0-327.el7.x86_64: archivo de kernel ubicado en la primera partición del primer disco
  • (hd1,msdos1): primera partición del segundo disco
  • (cd): medio óptico de arranque (disponible únicamente al iniciar GRUB desde CD/DVD)
  • (cd0): primera unidad óptica

Archivos de configuración principales de GRUB 2

Los archivos esenciales de configuración son:

  • /boot/grub2/grub.cfg (con /etc/grub2.cfg como enlace simbólico)
  • Directorio /etc/grub.d/
  • Archivo /etc/default/grub (con /etc/sysconfig/grub como enlace simbólico)

La relación entre estos elementos funciona así: el archivo /boot/grub2/grub.cfg invoca secuencialmente los scripts del directorio /etc/grub.d/ mediante marcadores de tipo ####BEGIN####. Los scripts dentro de este directorio tienen nombres que comienzan con dos dígitos y se ejecutan en orden ascendente. El script 00_header, por ejemplo, consulta el archivo /etc/default/grub para configurar la apariencia básica del menú de arranque.

En /boot/grub2/grub.cfg, el script 10_linux gestiona las diferentes entradas de kernel disponibles. Si contiene dos entradas menuentry, al arrancar se mostrarán dos opciones predeterminadas: modo normal y modo de rescate.

Importante: Se recomienda no modificar directamente /boot/grub2/grub.cfg, ya que las actualizaciones del kernel sobrescribirán todas las configuraciones. Para personalizaciones, lo adecuado es editar los scripts en /etc/grub.d/ o el archivo /etc/default/grub, y luego regenerar /boot/grub2/grub.cfg ejecutando grub2-mkconfig.

Estructura del directorio /etc/grub.d/

Cada script define una entrada del menú y debe poseer un prefijo numérico de dos dígitos que determina su orden de ejecución y la posición de la entrada correspondiente. El archivo 00_header se procesa primero.

Script Función
00_header Establece los parámetros predeterminados de GRUB
10_linux Configura las entradas cuando coexisten múltiples versiones de kernel Linux
20_ppc_terminfo Configura la consola tty
30_os_prober Detecta y configura sistemas operativos en otras particiones
40_custom y 41_custom Espacio para configuraciones definidas por el administrador

Archivo /etc/default/grub

Este archivo de texto plano permite definir variables de configuración generales y características del menú GRUB 2. Después de cualquier modificación, es necesario ejecutar grub2-mkconfig para que los cambios tomen efecto. El archivo /etc/sysconfig/grub es un enlace simbólico que apunta a /etc/default/grub.

Ejemplo de contenido del archivo:

[admin@servidor ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Parámetros disponibles en este archivo:

  • GRUB_TIMEOUT=5: Tiempo de espera en segundos antes de arrancar la entrada predeterminada. El valor -1 indica espera indefinida.
  • GRUB_DISTRIBUTOR: Define el identificador del distribuidor, usado para generar nombres descriptivos en las entradas del menú.
  • GRUB_DEFAULT=saved: Establece la entrada de arranque predeterminada. Valores numéricos (0, 1, 2...) seleccionan posiciones específicas; con saved se utiliza la última entrada arrancada.
  • GRUB_TERMINAL_OUTPUT="console": Selecciona el dispositivo de salida del terminal. Opciones válidas incluyen: console (BIOS/EFI), serial (terminal serie), gfxterm (salida gráfica), ofconsole (Open Firmware) o vga_text (texto VGA, usado en Coreboot).
  • GRUB_CMDLINE_LINUX: Permite añadir parámetros adicionales al arranque del kernel.
  • GRUB_DISABLE_RECOVERY: Controla si se habilita el modo de reparación.
  • GRUB_DISABLE_LINUX_RECOVERY="true": Controla la creación de entradas de menú para modo de reparación.
  • GRUB_HIDDEN_TIMEOUT=0: Oculta el menú mostrando una pantalla en blanco; pulsando cualquier tecla se revela el menú.
  • GRUB_HIDDEN_TIMEOUT_QUIET=true: Suprime la cuenta regresiva cuando se muestra la pantalla en blanco.
  • GRUB_CMDLINE_LINUX_DEFAULT="quiet splash": Parámetros predeterminados para el kernel.
  • GRUB_TERMINAL=console: Define si se utiliza terminal de texto o interfaz gráfica.
  • GRUB_GFXMODE=640x480: Resolución de la interfaz gráfica (debe ser compatible con la tarjeta gráfica; se puede verificar con vbeinfo en el intérprete de GRUB).
  • GRUB_DISABLE_LINUX_UUID=true: Alterna entre usar UUID o nombres de dispositivo (root=/dev/sdaX vs root=UUID=XXXX).
  • GRUB_INIT_TUNE="480 440 1": Genera un tono a través del altavoz del sistema al iniciar GRUB.

Protección de GRUB 2 con contraseña

Al ser el primer componente del sistema que se ejecuta, la seguridad de GRUB 2 es fundamental. Por defecto, cualquier persona con acceso físico al equipo puede modificar entradas del menú, editar parámetros de arranque y acceder al intérprete de comandos de GRUB. Para restringir estas operaciones, se debe configurar la variable superusers, que define un conjunto de usuarios autorizados (separados por espacios, comas o punto y coma) con privilegios exclusivos para editar entradas y usar la línea de comandos.

GRUB 2 admite dos formatos de contraseña:

  • Texto plano: La contraseña se almacena sin cifrar, con menor nivel de seguridad.
  • PBKDF2: La contraseña se procesa mediante el algoritmo hash PBKDF2, almacenándose el resultado cifrado para mayor protección.

Configuración de contraseña PBKDF2

El proceso consta de tres pasos: generar el hash con grub2-mkpasswd-pbkdf2, incorporar el usuario y la contraseña cifrada en /etc/grub.d/00_header, y finalmente reconstruir el archivo de configuración con grub2-mkconfig.

La sintaxis para añadir credenciales en /etc/grub.d/00_header:

cat << EOF
set superusers="administrador"
password_pbkdf2 administrador hash_generado
EOF

Paso 1: Generar el hash PBKDF2

[admin@servidor ~]# grub2-mkpasswd-pbkdf2

Paso 2: Editar /etc/grub.d/00_header con el usuario y hash obtenido.

Paso 3: Regenerar la configuración

[admin@servidor ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

Configuración de contraseña en texto plano

Paso 1: Añadir al final de /etc/grub.d/00_header el siguiente bloque:

cat << EOF
set superusers="operador"
password operador mipassword123
EOF

Paso 2: Regenerar la configuración:

[admin@servidor ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

Desbloqueo de GRUB 2

Al reiniciar el sistema y presionar la tecla e para editar una entrada del menú, se solicitarán las credenciales de usuario configuradas. Tras autenticarse correctamente, se accede al editor de parámetros de arranque.

Escenarios prácticos de configuración

Recuperación de contraseña de root en CentOS 7

Primer método

  1. Durante el arranque, pulsar e para editar los parámetros de GRUB 2.
  2. Modificar ro crashkernel=auto rhgb quiet cambiando ro por rw para habilitar escritura, y añadir al final de la línea rd.break enforcing=0. Confirmar con Ctrl+x.
  3. Aparecerá el intérprete switch_root:/#.
  4. Remontar el sistema de archivos:
switch_root:/# mount -o remount,rw /sysroot
  1. Cambiar al entorno raíz:
switch_root:/# chroot /sysroot

El indicador cambiará a sh-4.2#. Ahora se puede restablecer la contraseña:

sh-4.2# passwd root

Al confirmar exitosamente, aparecerá el mensaje de actualización correcta. Para que SELinux aplique los cambios en el siguiente arranque:

sh-4.2# /.autorelabel

Reiniciar el sistema:

sh-4.2# exec /sbin/reboot

Segundo método

  1. Repetir el paso 1 del método anterior.
  2. Modificar ro por rw en la misma línea, y agregar init=/bin/sh justo después de quiet (separado por un espacio, en la misma línea). Confirmar con Ctrl+x.
  3. Aparecerá el intérprete sh-4.2#.
  4. Remontar el sistema de archivos:
sh-4.2# mount -o remount,rw /
  1. Establecer nueva contraseña:
sh-4.2# passwd root
  1. Crear el archivo de relabeling para SELinux:
sh-4.2# touch /.autorelabel
  1. Iniciar el sistema:
sh-4.2# exec /sbin/init

Renombrado de interfaces de red

Para cambiar los nombres de las tarjetas de red a la nomenclatura tradicional (eth0, eth1, etc.):

  1. Editar /etc/default/grub y agregar los parámetros net.ifnames=0 biosdevname=0 en la variable GRUB_CMDLINE_LINUX:
[admin@servidor ~]# vi /etc/default/grub
[admin@servidor ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"
GRUB_DISABLE_RECOVERY="true"
  1. Regenerar la configuración de GRUB 2:
[admin@servidor ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
  1. Tras reiniciar, verificar el nombre de la interfaz:
[admin@servidor ~]# ip addr show

La salida mostrará eth0 en lugar de los nombres predecibles generados por systemd.

Resolución del error "comando ifconfig no encontrado"

En CentOS 7, el comando ifconfig puede no estar disponible por defecto. Para solucionarlo:

Si el binario existe pero no se encuentra en PATH:

[admin@servidor ~]# ls /sbin/ifconfig
/sbin/ifconfig

Verificar las rutas configuradas:

[admin@servidor ~]# echo $PATH

Para añadir temporalmente /sbin al PATH:

[admin@servidor ~]# export PATH="$PATH:/sbin"

Para hacer el cambio permanente, editar /etc/profile y agregar la línea export PATH="$PATH:/sbin", luego reiniciar la sesión.

Si el comando no está instalado:

[admin@servidor ~]# yum install net-tools
[admin@servidor ~]# ifconfig

Etiquetas: GRUB2 linux centos gestor-arranque PBKDF2

Publicado el 7-5 04:27