StudyToCert

Linux+ / Lecciones · English

CompTIA Linux+ XK0-006

Proceso de arranque: UEFI/BIOS, GRUB2, kernel, initramfs (dracut, mkinitramfs), targets de systemd

Cada vez que una máquina Linux se enciende, recorre una cadena predecible de traspasos: firmware, gestor de arranque, kernel, sistema de archivos inicial en RAM y, por último, el sistema init. Cada etapa tiene una sola tarea y luego cede el control a la siguiente. Conocer el orden te permite deducir dónde se detuvo un arranque fallido y qué herramienta lo corrige, que es justamente como se plantean las preguntas de Linux+: describen lo que ves en la pantalla y te preguntan qué cambiar.

Primero viene el firmware. Las máquinas antiguas usan BIOS (Basic Input/Output System), que lee el primer sector del disco de arranque, el MBR (Master Boot Record), y ejecuta el pequeño fragmento de código de arranque guardado allí. Las máquinas modernas usan UEFI (Unified Extensible Firmware Interface), que en cambio lee una ESP (EFI System Partition), una pequeña partición con formato FAT que normalmente se monta en /boot/efi, y ejecuta un archivo ejecutable EFI como grubx64.efi o shimx64.efi. UEFI guarda su lista de entradas de arranque en variables del firmware, que puedes ver con efibootmgr -v. UEFI también admite Secure Boot (arranque seguro), en el que el firmware solo ejecuta gestores de arranque firmados con claves de confianza; el shim firmado es lo que permite que las distribuciones arranquen con Secure Boot. Puedes comprobar en qué modo arrancaste buscando el directorio /sys/firmware/efi: si existe, arrancaste con UEFI.

Luego viene el gestor de arranque, casi siempre GRUB2 (GRand Unified Bootloader versión 2). GRUB muestra el menú de kernels, carga en memoria la imagen del kernel elegida (por ejemplo /boot/vmlinuz-...) y el initramfs correspondiente, y le pasa al kernel su línea de comandos, como root=UUID=... y quiet. Nunca editas directamente el grub.cfg generado, porque la siguiente actualización del kernel lo regenera. En su lugar, modificas /etc/default/grub (por ejemplo GRUB_TIMEOUT o GRUB_CMDLINE_LINUX) y regeneras el archivo con grub2-mkconfig -o /boot/grub2/grub.cfg en sistemas de la familia Red Hat o con update-grub (un envoltorio de grub-mkconfig) en sistemas de la familia Debian. La herramienta grubby en sistemas tipo RHEL edita los argumentos del kernel por entrada, por ejemplo grubby --update-kernel=ALL --args="console=ttyS0". Si el propio gestor de arranque está dañado, grub2-install (o grub-install) lo vuelve a escribir en el disco.

Después, el kernel inicializa el hardware para el que tiene controladores integrados, pero a menudo todavía no puede leer el sistema de archivos raíz real, porque el controlador de la controladora de disco, de LVM (Logical Volume Manager), de RAID o del cifrado LUKS está en un módulo que reside precisamente en ese sistema de archivos. El initramfs (sistema de archivos inicial en RAM) resuelve este problema del huevo y la gallina: es un archivo comprimido que se descomprime en memoria y que contiene solo los módulos y scripts necesarios para encontrar, desbloquear y montar la raíz real, y luego cambiar a ella. Se reconstruye con dracut en Red Hat, Fedora y SUSE (dracut -f regenera la imagen para el kernel en ejecución) y con mkinitramfs o, más comúnmente, update-initramfs -u en Debian y Ubuntu. Reconstrúyelo después de añadir un controlador de almacenamiento, cambiar el cifrado o cambiar la configuración del dispositivo raíz. lsinitrd (dracut) y lsinitramfs (Debian) listan lo que contiene una imagen.

Una vez montada la raíz, el kernel inicia el PID 1 (identificador de proceso 1), que en las distribuciones actuales es systemd. systemd lleva el sistema a un target, un grupo con nombre de unidades que reemplaza a los antiguos runlevels de SysV. Los más comunes son multi-user.target (servidor en modo texto, como el runlevel 3), graphical.target (escritorio, como el runlevel 5), rescue.target (monousuario con servicios básicos y los sistemas de archivos locales montados) y emergency.target (casi nada, con la raíz montada en solo lectura). Consulta el predeterminado con systemctl get-default, cámbialo con systemctl set-default multi-user.target y cambia el sistema en ejecución con systemctl isolate rescue.target. Para un cambio puntual en el arranque, presiona e en el menú de GRUB, añade systemd.unit=rescue.target (o emergency.target) a la línea que empieza con linux y luego presiona Ctrl+X. Esa edición no se guarda, lo que la convierte en una forma segura de recuperar un sistema. Después del arranque, systemd-analyze blame muestra qué unidades ralentizaron el inicio.

Veamos un ejemplo práctico. Un servidor no arranca después de trasladar su sistema de archivos raíz a una nueva controladora RAID, y cae en un shell de emergencia de dracut que dice que no encuentra el dispositivo raíz. El firmware y GRUB claramente funcionaron, porque el kernel se ejecutó, así que el problema está en la etapa del initramfs. Reinicias, eliges una entrada de kernel más antigua en el menú de GRUB, confirmas el módulo de la controladora con lsmod y ejecutas dracut -f para reconstruir el initramfs con el nuevo controlador. Lo verificas con lsinitrd | grep y el nombre del módulo, reinicias y el sistema de archivos raíz se encuentra con normalidad.

Errores comunes: editar grub.cfg a mano y perder el cambio en la siguiente actualización del kernel; modificar /etc/default/grub y olvidar regenerar; confundir rescue.target con emergency.target (rescue monta los sistemas de archivos locales e inicia algunos servicios, emergency solo te da un shell sobre una raíz en solo lectura); reconstruir el initramfs para la versión de kernel equivocada; y suponer que un sistema UEFI tiene un sector de arranque MBR que reparar cuando su gestor de arranque en realidad está en la ESP.

Las preguntas del examen suelen dar un síntoma y preguntar por la etapa o el comando. 'No hay menú de arranque, el firmware no encuentra un dispositivo de arranque' apunta a la configuración del firmware, a la ESP o a reinstalar GRUB. 'Kernel panic: unable to mount root' o 'shell de emergencia de dracut' apunta al initramfs o al argumento root=. 'Cambiar los argumentos del kernel de forma permanente' apunta a /etc/default/grub más grub2-mkconfig, o a grubby. 'Arrancar en modo texto de ahora en adelante' es systemctl set-default multi-user.target, mientras que 'una sola vez, para restablecer una contraseña o corregir fstab' apunta a editar la línea del kernel en el menú de GRUB.

Términos clave

UEFI
Unified Extensible Firmware Interface: firmware moderno que arranca ejecutables EFI desde una partición del sistema EFI y admite Secure Boot.
ESP
EFI System Partition (partición del sistema EFI): una pequeña partición FAT, normalmente montada en /boot/efi, que contiene los gestores de arranque UEFI.
GRUB2
El gestor de arranque estándar de Linux; se configura mediante /etc/default/grub y un grub.cfg generado.
initramfs
Un sistema de archivos raíz temporal y comprimido que se carga en RAM y contiene los controladores y scripts necesarios para montar el sistema de archivos raíz real.
dracut / mkinitramfs
Herramientas que construyen la imagen initramfs: dracut en la familia Red Hat y SUSE, mkinitramfs/update-initramfs en la familia Debian.
target de systemd (systemd target)
Una unidad que agrupa otras unidades en un estado del sistema, como multi-user.target o graphical.target, y que reemplaza a los runlevels de SysV.
Secure Boot
Una función de UEFI que solo ejecuta gestores de arranque y kernels firmados con claves de confianza.
Ejemplo real

Después de trasladar el sistema de archivos raíz de un servidor a una nueva controladora RAID, este no arranca y cae en un shell de emergencia de dracut que dice que no encuentra el dispositivo raíz. Arrancas una entrada de kernel más antigua desde el menú de GRUB, confirmas el nombre del módulo de la controladora con lsmod y luego ejecutas dracut -f para reconstruir el initramfs de modo que incluya el nuevo controlador. El siguiente arranque encuentra el sistema de archivos raíz con normalidad.

Consejo para el examen: Relaciona el síntoma con la etapa: si no aparece el menú de GRUB, apunta al firmware o al gestor de arranque; un error de 'no se encuentra la raíz' apunta al initramfs o al argumento root=; y un arranque que se detiene en un shell de emergencia después de cargar el kernel suele apuntar a unidades de systemd o a /etc/fstab.

Comprueba lo que sabes

Editaste GRUB_CMDLINE_LINUX en /etc/default/grub en un sistema RHEL, pero el cambio no tiene efecto después de reiniciar. ¿Qué paso faltó?

Regenerar la configuración de GRUB con grub2-mkconfig -o /boot/grub2/grub.cfg (o usar grubby); /etc/default/grub solo se lee cuando se reconstruye la configuración.

¿Por qué Linux necesita un initramfs?

Porque los controladores necesarios para llegar al sistema de archivos raíz (controladora de almacenamiento, LVM, RAID, LUKS) pueden ser módulos guardados en ese mismo sistema de archivos; el initramfs los lleva en RAM para que se pueda montar la raíz real.

¿Qué comando hace que un servidor arranque en una consola de texto de forma predeterminada de ahora en adelante?

systemctl set-default multi-user.target, que cambia el target predeterminado de forma persistente.

¿Cómo puedes saber si un sistema en ejecución arrancó en modo UEFI o en modo BIOS heredado?

Comprueba si existe /sys/firmware/efi; solo está presente cuando el sistema arrancó mediante UEFI.

Estudia Linux+ gratis
Plan semana a semana con lecciones, cuestionarios, simulaciones de examen y práctica, en español.
Abrir el plan de estudio