Flujo de arranque: BIOS/UEFI → GRUB → kernel → initramfs → systemd
Introducción
Cuando enciendes un ordenador con Linux, se produce una secuencia de fases bien definida hasta que el sistema queda operativo. Entender ese flujo es fundamental para diagnosticar fallos de arranque, configurar el gestor de arranque y preparar el examen LPIC-1.
Fase 1 — BIOS / UEFI
El primer programa que ejecuta el procesador al encender el equipo es el firmware de la placa base: BIOS (Basic Input/Output System) o su sucesor UEFI (Unified Extensible Firmware Interface).
Qué hace:
- Realiza el POST (Power-On Self Test): comprueba que el hardware básico funciona.
- Detecta los dispositivos de almacenamiento disponibles.
- Lee la configuración de arranque para saber desde qué dispositivo y en qué orden intentar arrancar.
- Carga el gestor de arranque (GRUB) y le cede el control.
BIOS vs UEFI:
- BIOS: usa tablas de partición MBR. Solo puede arrancar discos de hasta 2 TB. El código de arranque ocupa los primeros 512 bytes del disco.
- UEFI: usa tablas de partición GPT. Soporta discos de más de 2 TB, arranque
seguro (Secure Boot) y una partición especial llamada ESP (EFI System Partition, montada en
/boot/efi).
Fase 2 — GRUB2 (Gestor de arranque)
GRUB2 (GRand Unified Bootloader versión 2) es el gestor de arranque estándar en la mayoría de distribuciones Linux. Su función es presentar un menú de sistemas operativos disponibles y cargar el kernel elegido en memoria.
Qué hace:
- Muestra el menú de arranque con los kernels disponibles y otras opciones.
- Lee su configuración desde
/boot/grub/grub.cfg. - Carga la imagen del kernel (
/boot/vmlinuz-*) en memoria RAM. - Pasa al kernel los parámetros de arranque definidos en la configuración.
- Carga la imagen
initramfsen RAM y la pone a disposición del kernel.
/boot/vmlinuz-6.1.0-20-amd64 ← imagen del kernel
/boot/initrd.img-6.1.0-20-amd64 ← imagen initramfs
/boot/grub/grub.cfg ← configuración de GRUB
Fase 3 — El kernel
El kernel es el núcleo del sistema operativo. GRUB lo carga en memoria y le transfiere el control.
Qué hace:
- Se descomprime a sí mismo en RAM.
- Inicializa el hardware: CPU, memoria, buses PCI, discos.
- Monta el sistema de ficheros raíz temporal (
initramfs) para poder acceder al disco real. - Lee los parámetros que le pasó GRUB (visibles en
/proc/cmdline). -
Una vez accede al disco real, desmonta
initramfsy monta el sistema de ficheros raíz definitivo. - Lanza el primer proceso del sistema:
initosystemdcon PID 1.
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-6.1.0-20-amd64 root=/dev/sda1 ro quiet splash
Fase 4 — initramfs
initramfs (Initial RAM Filesystem) es un sistema de ficheros temporal cargado en RAM. Su función es proporcionar al kernel las herramientas mínimas necesarias para poder montar el sistema de ficheros raíz real antes de que esté disponible.
Por qué existe:
El sistema de ficheros raíz puede estar en un RAID, LVM, disco cifrado (LUKS) o un dispositivo de red. El
kernel no tiene esos drivers compilados directamente, pero initramfs sí los incluye como módulos. Actúa
como puente entre el kernel recién arrancado y el sistema de ficheros real.
Contenido típico:
- Módulos del kernel necesarios para acceder al disco raíz.
- Utilidades básicas (
busybox,udev). - Scripts de inicialización que detectan y montan el sistema de ficheros raíz.
Inspeccionar el initramfs:
$ lsinitramfs /boot/initrd.img-$(uname -r) | head -20
Fase 5 — systemd (PID 1)
Una vez el kernel ha montado el sistema de ficheros raíz real, lanza /sbin/init, que en la
mayoría de distribuciones modernas es un enlace simbólico a systemd. systemd toma el control con
PID 1 y es el responsable de arrancar todos los servicios del sistema.
Qué hace:
- Lee el target de arranque por defecto (equivalente al runlevel clásico).
- Activa en paralelo los servicios necesarios para ese target.
- Gestiona las dependencias entre servicios.
- Presenta el prompt de login cuando todos los servicios requeridos están activos.
Verificar el proceso de arranque:
$ systemd-analyze # tiempo total de arranque
$ systemd-analyze blame # tiempo por servicio
$ systemd-analyze critical-chain # cadena crítica de dependencias
$ journalctl -b # todos los logs del arranque actual
$ journalctl -b -1 # logs del arranque anterior
Resumen del flujo completo
Encendido
│
▼
BIOS/UEFI ──── POST + detección de hardware
│
▼
GRUB2 ──────── menú, carga vmlinuz + initramfs
│
▼
Kernel ─────── inicializa hardware, monta initramfs
│
▼
initramfs ──── carga drivers, monta sistema de ficheros raíz
│
▼
systemd ────── arranca servicios → login