202.1 - Personalizacion del arranque

Introduccion

La personalizacion del proceso de arranque es una habilidad fundamental para cualquier administrador de sistemas Linux. Este subtema cubre la configuracion de GRUB 2 como cargador de arranque principal, la gestion de los objetivos de arranque en systemd, los niveles de ejecucion heredados de SysV init, y el analisis de los mensajes de arranque del sistema.

Peso del subtema: 3

GRUB 2 - El cargador de arranque estandar

Arquitectura de configuracion de GRUB 2

GRUB 2 (GRand Unified Bootloader version 2) utiliza una arquitectura de configuracion modular. A diferencia de GRUB Legacy, nunca se debe editar directamente el archivo principal de configuracion.

  • /boot/grub/grub.cfg (o /boot/grub2/grub.cfg en RHEL/CentOS): Archivo de configuracion generado automaticamente. No editar manualmente.
  • /etc/default/grub: Archivo principal de personalizacion del comportamiento de GRUB.
  • /etc/grub.d/: Directorio con scripts que generan secciones del archivo grub.cfg.

Para el examen: Recuerda que grub.cfg se genera automaticamente. Cualquier modificacion directa se perdera al ejecutar grub-mkconfig.

El archivo /etc/default/grub

Este archivo contiene las variables principales que controlan el comportamiento de GRUB:

# Entrada predeterminada (por numero o nombre)
GRUB_DEFAULT=0
 
# Tiempo de espera en segundos antes de arrancar la entrada por defecto
GRUB_TIMEOUT=5
 
# Estilo del tiempo de espera: menu, countdown, hidden
GRUB_TIMEOUT_STYLE=menu
 
# Parametros del kernel para las entradas normales
GRUB_CMDLINE_LINUX="rhgb quiet"
 
# Parametros adicionales solo para la entrada por defecto
GRUB_CMDLINE_LINUX_DEFAULT="splash"
 
# Desactivar la recuperacion de entradas
GRUB_DISABLE_RECOVERY=false
 
# Resolucion de la terminal grafica
GRUB_GFXMODE=1024x768
 
# Terminal de salida
GRUB_TERMINAL_OUTPUT=console
VariableFuncionValor comun
GRUB_DEFAULTEntrada de arranque por defecto0, saved
GRUB_TIMEOUTTiempo de espera en segundos5
GRUB_TIMEOUT_STYLEComportamiento del menumenu, hidden, countdown
GRUB_CMDLINE_LINUXParametros kernel (todas las entradas)"quiet"
GRUB_CMDLINE_LINUX_DEFAULTParametros kernel (solo defecto)"splash"
GRUB_DISABLE_RECOVERYOcultar entradas de recuperaciontrue, false
GRUB_DISABLE_OS_PROBERNo detectar otros SOtrue, false

Directorio /etc/grub.d/

Los scripts en este directorio se ejecutan en orden numerico para generar grub.cfg:

ScriptFuncion
00_headerConfiguracion general (timeout, defecto, etc.)
05_debian_themeTema visual (especifico de Debian/Ubuntu)
10_linuxEntradas para los kernels Linux instalados
20_linux_xenEntradas para Xen
30_os-proberDeteccion de otros sistemas operativos
40_customEntradas personalizadas del administrador
41_customCarga entradas desde archivo externo

Para el examen: Los scripts deben tener permisos de ejecucion para ser procesados por grub-mkconfig. Si necesitas desactivar un script, puedes retirarle el permiso de ejecucion con chmod -x.

Comandos esenciales de GRUB 2

grub-mkconfig

Genera (o regenera) el archivo grub.cfg:

# Generar y mostrar la configuracion en stdout
grub-mkconfig
 
# Generar y escribir directamente al archivo de configuracion
grub-mkconfig -o /boot/grub/grub.cfg
 
# En sistemas RHEL/CentOS
grub2-mkconfig -o /boot/grub2/grub.cfg

grub-install

Instala los archivos de GRUB en el disco:

# Instalar GRUB en el MBR del disco sda
grub-install /dev/sda
 
# Instalar en un directorio especifico
grub-install --boot-directory=/mnt/boot /dev/sda
 
# Instalacion para UEFI
grub-install --target=x86_64-efi --efi-directory=/boot/efi

Entradas personalizadas en GRUB

Se pueden agregar entradas en /etc/grub.d/40_custom:

#!/bin/sh
exec tail -n +3 $0
 
menuentry "Mi Linux personalizado" {
    set root=(hd0,msdos1)
    linux /vmlinuz root=/dev/sda1 ro quiet
    initrd /initrd.img
}
 
menuentry "Arrancar desde segundo disco" {
    set root=(hd1,gpt2)
    linux /boot/vmlinuz root=UUID=xxxx-xxxx ro
    initrd /boot/initrd.img
}

Objetivos de arranque en systemd

Concepto de targets

En systemd, los targets reemplazan a los niveles de ejecucion (runlevels) de SysV init. Un target es una unidad que agrupa otras unidades y define un estado del sistema.

Target systemdRunlevel SysVDescripcion
poweroff.target0Apagado del sistema
rescue.target1 (S)Modo de rescate (usuario unico)
multi-user.target2, 3, 4Multiusuario sin interfaz grafica
graphical.target5Multiusuario con interfaz grafica
reboot.target6Reinicio del sistema
emergency.target-Modo de emergencia (minimo)

Gestion de targets

# Ver el target actual
systemctl get-default
 
# Cambiar el target por defecto
systemctl set-default multi-user.target
 
# Cambiar al target en tiempo real (equivalente a cambiar runlevel)
systemctl isolate rescue.target
 
# Listar todas las unidades de un target
systemctl list-dependencies graphical.target

Para el examen: rescue.target monta los sistemas de archivos y tiene servicios basicos activos, mientras que emergency.target solo monta el sistema de archivos raiz en modo solo lectura. Esta es una diferencia critica.

Niveles de ejecucion SysV init

Aunque la mayoria de distribuciones modernas usan systemd, es importante conocer el sistema SysV init:

  • /etc/inittab: Archivo principal de configuracion (define el runlevel por defecto)
  • /etc/init.d/: Scripts de servicios
  • /etc/rc0.d/ a /etc/rc6.d/: Enlaces simbolicos a scripts organizados por runlevel
# Formato tipico de /etc/inittab
id:3:initdefault:
 
# Comandos de gestion de runlevels
runlevel          # Muestra el runlevel anterior y actual
telinit 3         # Cambia al runlevel 3
init 5            # Cambia al runlevel 5

Los enlaces en los directorios rcN.d siguen la convencion:

  • S##nombre: Script de inicio (Start), indica el orden
  • K##nombre: Script de parada (Kill), indica el orden

Mensajes de arranque y diagnostico

dmesg

El comando dmesg muestra los mensajes del buffer del anillo del kernel:

# Ver todos los mensajes del kernel
dmesg
 
# Filtrar por nivel de severidad
dmesg --level=err
dmesg --level=warn,err
 
# Seguimiento en tiempo real
dmesg -w
 
# Limpiar el buffer (requiere root)
dmesg -C
 
# Formato legible con marcas de tiempo
dmesg -T

journalctl para mensajes de arranque

# Ver mensajes del arranque actual
journalctl -b
 
# Ver mensajes del arranque anterior
journalctl -b -1
 
# Listar arranques disponibles
journalctl --list-boots
 
# Filtrar por prioridad
journalctl -b -p err
 
# Ver solo mensajes del kernel (equivalente a dmesg)
journalctl -k

Para el examen: Para que journalctl --list-boots funcione, el journal debe ser persistente. Esto requiere que exista el directorio /var/log/journal/ o que Storage=persistent este configurado en /etc/systemd/journald.conf.

Parametros del kernel en el arranque

Los parametros del kernel se pueden pasar desde GRUB editando la linea linux en el menu de arranque (tecla e) o permanentemente en /etc/default/grub.

Parametros mas importantes

ParametroFuncion
init=/bin/bashReemplaza el proceso init por una shell
init=/bin/shSimilar, usa sh en lugar de bash
root=/dev/sda1Especifica el dispositivo raiz
root=UUID=xxxxEspecifica la raiz por UUID
single o 1Arranca en modo usuario unico
roMonta el sistema raiz en solo lectura
rwMonta el sistema raiz en lectura/escritura
quietSuprime la mayoria de mensajes de arranque
splashMuestra pantalla de carga grafica
nomodesetDesactiva la configuracion de modo grafico del kernel
systemd.unit=rescue.targetArranca directamente en modo rescate
systemd.unit=emergency.targetArranca en modo emergencia
rd.breakInterrumpe el arranque durante initramfs
mem=512MLimita la memoria disponible

Edicion temporal en GRUB

  1. En el menu de GRUB, presionar e para editar la entrada seleccionada
  2. Localizar la linea que comienza con linux o linux16
  3. Agregar o modificar los parametros al final de la linea
  4. Presionar Ctrl+X o F10 para arrancar con los cambios

Para el examen: Los cambios realizados editando la entrada de GRUB en tiempo de arranque son temporales y solo afectan al arranque actual. Para cambios permanentes, editar /etc/default/grub y ejecutar grub-mkconfig.

Persistencia del journal de systemd

Para configurar la persistencia de los logs de arranque:

# Crear el directorio de journal persistente
mkdir -p /var/log/journal
 
# O configurar en journald.conf
# /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=500M
 
# Reiniciar el servicio
systemctl restart systemd-journald

Opciones de almacenamiento en journald.conf:

  • volatile: Solo en memoria (/run/log/journal/)
  • persistent: En disco (/var/log/journal/)
  • auto: En disco si /var/log/journal/ existe, sino en memoria
  • none: Descarta todos los logs

Resumen de archivos clave

Archivo/DirectorioFuncion
/etc/default/grubConfiguracion principal de GRUB 2
/etc/grub.d/Scripts generadores de grub.cfg
/boot/grub/grub.cfgConfiguracion generada (no editar)
/etc/inittabConfiguracion SysV init
/etc/init.d/Scripts de servicios SysV
/etc/systemd/journald.confConfiguracion del journal
/var/log/journal/Almacenamiento persistente del journal
/proc/cmdlineParametros del kernel del arranque actual

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • grub-mkconfig vs grub-installgrub-mkconfig genera el archivo grub.cfg a partir de /etc/default/grub y los scripts de /etc/grub.d/; grub-install escribe el bootloader en el MBR o la ESP. Son complementarios, no equivalentes. Editar GRUB sin ejecutar grub-mkconfig despues no tiene efecto
  • GRUB_CMDLINE_LINUX vs GRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX se aplica a TODAS las entradas (incluida la de recuperacion); GRUB_CMDLINE_LINUX_DEFAULT solo se aplica a la entrada por defecto (no la de recuperacion). Confundir ambas es una trampa clasica
  • rescue.target vs emergency.targetrescue.target monta los sistemas de archivos de /etc/fstab y carga servicios basicos; emergency.target solo monta la raiz en solo lectura y no carga nada mas. Si fstab esta corrupto, rescue.target fallara y debes usar emergency.target
  • Los cambios editando GRUB con la tecla e son temporales — solo afectan al arranque actual. Para cambios permanentes, hay que editar /etc/default/grub y ejecutar grub-mkconfig -o /boot/grub/grub.cfg
  • grub.cfg nunca se edita directamente — cualquier cambio manual se pierde al ejecutar grub-mkconfig. Las personalizaciones van en /etc/default/grub o /etc/grub.d/40_custom
  • runlevel 2, 3 y 4 son todos multi-user.target — en SysV init, los runlevels 2, 3 y 4 tenian significados diferentes en algunas distribuciones. En systemd, todos se mapean a multi-user.target. El examen puede preguntar la equivalencia
  • El journal de systemd NO es persistente por defecto — si /var/log/journal/ no existe, los logs se almacenan solo en memoria (/run/log/journal/) y se pierden al reiniciar. Hay que crear el directorio o configurar Storage=persistent en journald.conf
  • systemd.unit= vs init=systemd.unit=rescue.target cambia el target de arranque de systemd; init=/bin/bash reemplaza completamente el proceso init. Con init=/bin/bash no hay systemd activo en absoluto