Cuando el sistema no arranca, el tiempo que tardas en recuperarlo depende directamente de saber exactamente qué palancas tienes disponibles y en qué orden usarlas. No hay magia: hay capas bien definidas, y cada una te da acceso a la siguiente.
El bootloader (en Debian, casi siempre GRUB 2) es el primer software que ejecuta el firmware tras cargar el sector de arranque. GRUB lee su configuración de /boot/grub/grub.cfg, que no debes editar a mano — ese archivo lo genera update-grub leyendo /etc/default/grub y los scripts en /etc/grub.d/. Si lo editas directamente, la próxima vez que ejecutes update-grub (o que se instale un kernel nuevo), tus cambios desaparecen. El archivo de configuración persistente es /etc/default/grub.
El menú de GRUB te da tres niveles de intervención. El primero es editar la línea de arranque temporalmente: pulsas e sobre la entrada que quieres arrancar, modificas la línea que empieza por linux (que es donde van los parámetros del kernel), y arrancas con Ctrl+X. Este cambio es volátil — dura solo ese arranque, lo que lo hace perfecto para diagnóstico sin riesgo de dejar el sistema en un estado inconsistente.
El segundo nivel es pasar init=/bin/bash al final de esa línea linux. Esto le dice al kernel que, en lugar de ejecutar systemd como proceso 1, ejecute directamente una shell. El resultado es una shell de root con el filesystem raíz montado en modo solo lectura — así es como el kernel lo monta inicialmente antes de que el proceso de init lo remonte con escritura. Si intentas modificar algo sin remontarlo, obtienes errores de solo lectura que pueden confundirse con corrupción. La solución es explícita: mount -o remount,rw /.
El tercer nivel, y el más potente cuando el sistema está completamente inasequible, es arrancar desde un live USB y hacer chroot al sistema instalado. Un chroot cambia el directorio raíz del proceso actual, así que los programas que ejecutes dentro (incluidos grub-install, update-grub, passwd, dpkg) ven el sistema del disco como si fuera el sistema en ejecución. Sin esto, por ejemplo, reinstalar GRUB desde el live USB lo instalaría con las rutas del live, no del sistema instalado.
Dónde se rompen las cosas: si grub.cfg apunta a un UUID que ya no existe (disco reemplazado, partición redimensionada), GRUB arranca pero no encuentra el kernel. Si /etc/fstab tiene un UUID incorrecto, el kernel arranca pero el sistema de ficheros raíz no se monta y cae a un initramfs de emergencia. Si el propio GRUB está corrupto o no instalado en el MBR/ESP, el firmware no sabe ni por dónde empezar. Cada caso tiene síntomas distintos y requiere una intervención diferente.
# ── ESCENARIO: sistema Debian que no arranca, necesitas recuperar root ── # Tienes acceso físico y un live USB de Debian Bookworm. # El disco del sistema es /dev/sda con la partición raíz en /dev/sda2 # y /boot/efi en /dev/sda1 (sistema UEFI). # ── PARTE 1: edición temporal en GRUB (sin live USB) ────────────────── # En el menú de GRUB, pulsa 'e' sobre la entrada del kernel. # Busca la línea que empieza así: # linux /boot/vmlinuz-6.1.0-21-amd64 root=UUID=... ro quiet # Elimina 'quiet' para ver mensajes del kernel y añade al final: # init=/bin/bash # Resultado: # linux /boot/vmlinuz-6.1.0-21-amd64 root=UUID=... ro init=/bin/bash # Arranca con Ctrl+X. # Una vez dentro de la shell (eres root, sin contraseña requerida): mount -o remount,rw / # el raíz viene read-only; hay que remontarlo # Comprueba que funciona: touch /tmp/test_rw && echo "escritura OK" # Recuperar contraseña de root: passwd root # introduce la nueva contraseña dos veces # Forzar escritura de buffers al disco antes de reiniciar a lo bruto sync # Reinicio forzado (no hay systemd, así que no hay 'reboot' normal) exec /sbin/reboot -f # ── PARTE 2: chroot desde live USB ──────────────────────────────────── # Arranca el live USB, abre una terminal y hazte root: sudo -i # Monta la partición raíz del sistema instalado: mount /dev/sda2 /mnt # Si /boot/efi es una partición separada (UEFI), móntala también: mount /dev/sda1 /mnt/boot/efi # Los tres bind mounts siguientes son imprescindibles para que herramientas # como grub-install, apt, o dpkg funcionen correctamente dentro del chroot. # Sin /proc, el kernel no expone información de procesos ni de dispositivos. # Sin /sys, udev y las herramientas de hardware están ciegas. # Sin /dev, ningún acceso a dispositivos de bloque es posible. mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys mount --bind /dev /mnt/dev # Entrar en el chroot: chroot /mnt /bin/bash # A partir de aquí, estás "dentro" del sistema instalado. # Verifica que los comandos usan las rutas correctas: which grub-install # debe responder /usr/sbin/grub-install del sistema # Caso 1: GRUB no está instalado o está corrupto en el disco grub-install /dev/sda # instala GRUB en el MBR (BIOS legacy) # Para UEFI, grub-install detecta el ESP automáticamente si está montado: grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian # Regenerar grub.cfg después de reinstalar o cambiar /etc/default/grub: update-grub # escanea kernels en /boot y reescribe grub.cfg # Caso 2: fstab con UUID incorrecto (sistema cae a initramfs en el arranque) # Consulta los UUIDs reales del disco: blkid /dev/sda2 # muestra UUID="xxxx-xxxx" # Edita fstab y corrige la entrada para /: nano /etc/fstab # Caso 3: reinstalar el kernel (imagen corrupta o eliminada accidentalmente) apt install --reinstall linux-image-$(uname -r) # Nota: uname -r dentro del chroot muestra el kernel del LIVE, no del sistema. # Lista los kernels disponibles en el sistema instalado: ls /boot/vmlinuz-* # Instala el que corresponda: apt install --reinstall linux-image-6.1.0-21-amd64 # Salir del chroot y desmontar limpiamente: exit umount /mnt/proc umount /mnt/sys umount /mnt/dev umount /mnt/boot/efi umount /mnt reboot
Qué está pasando en cada paso
La edición en el menú de GRUB modifica la línea linux que es literalmente el comando que GRUB pasa al kernel. Los parámetros que añades ahí son los mismos que aparecerían en /proc/cmdline una vez arrancado. quiet suprime los mensajes del kernel durante el arranque; quitarlo es lo primero que debes hacer cuando necesitas ver por qué falla.
init=/bin/bash es quizá el parámetro más útil para recuperación. El kernel lo interpreta como: “cuando termines de montar el raíz, en lugar de ejecutar /sbin/init (que es un enlace a systemd en Debian Bookworm), ejecuta esto”. Obtienes una shell PID 1 con el sistema de ficheros raíz montado exactamente como lo dejaría el initramfs, es decir, solo lectura. El mount -o remount,rw / del ejemplo no crea un nuevo montaje — le dice al kernel que cambie los flags del montaje existente, lo que es posible porque el dispositivo ya está montado.
El sync antes de reiniciar existe porque con init=/bin/bash no hay systemd gestionando el ciclo de vida del sistema. Un reinicio abrupto sin vaciar los buffers puede dejar el filesystem en un estado que el journal de ext4 puede recuperar, pero que en filesystems más exigentes puede causar problemas. Con sync fuerzas que todos los bloques sucios se escriban al disco.
Los tres bind mounts (/proc, /sys, /dev) antes del chroot son la diferencia entre un entorno útil y uno roto. Sin /proc, grub-install no puede consultar qué dispositivos existen. Sin /dev, no puede abrir los dispositivos de bloque para escribir el bootloader. El bind mount hace que el directorio del live USB aparezca como si fuera el directorio dentro del chroot — el kernel es el mismo, solo cambia el espacio de nombres de rutas.
grub-install /dev/sda escribe el código de arranque de GRUB en el MBR y copia los archivos de la etapa 2 a /boot/grub/. Sin el chroot, lo haría usando las rutas del live USB; dentro del chroot, usa las del sistema instalado, que es lo que quieres. En sistemas UEFI, grub-install necesita el flag --target=x86_64-efi porque de lo contrario intenta instalar en modo BIOS.
uname -r dentro del chroot devuelve la versión del kernel en ejecución, que es el del live USB, no el del sistema instalado. Es una trampa habitual: si intentas apt install --reinstall linux-image-$(uname -r) directamente, instalas la versión del live, que puede no coincidir con lo que tiene el sistema. Por eso el ejemplo muestra cómo listar los kernels reales con ls /boot/vmlinuz-* antes de reinstalar.
N° 102