Problema

En entornos de producción o servidores caseros es frecuente ejecutar comandos de limpieza sin revisar su alcance. Cuando el archivo de estado de dpkg (/var/lib/dpkg/status) está dañado o vacío, apt interpreta que ningún paquete tiene dependencias activas. Un apt-get purge ejecutado en esas condiciones elimina prácticamente todo el árbol de paquetes: sudo, dpkg, bibliotecas esenciales y el enlazador dinámico. El resultado es un sistema que arranca, pero no puede ejecutar binarios ni scripts, dejando la única opción aparente como una reinstalación completa.

El desafío es recuperar la capa de gestión de paquetes y los binarios críticos sin perder datos de usuario, configuraciones y contenedores que residen en particiones separadas.

Causa

  1. Corrupción del archivo de estado de dpkg
    Fallos de hardware, cortes de energía o errores de fsck pueden vaciar o dañar /var/lib/dpkg/status. Cuando el archivo está vacío, apt pierde la información de qué paquetes están instalados y sus relaciones de dependencia.

  2. Uso de apt-get purge o apt-get autoremove con estado vacío
    Con un status vacío, apt-get autoremove -y considera que todos los paquetes son “órfanos” y los marca para eliminación. El comando purge elimina también los archivos de configuración, lo que impide una reinstalación sencilla.

  3. Eliminación de bibliotecas compartidas esenciales
    Bibliotecas como libc6, libexpat1 o el propio ld-linux.so son requeridas por apt, dpkg y bash. Su ausencia rompe la cadena de ejecución, generando errores como cannot open shared object file: No such file or directory.

  4. Falta de un entorno de rescate con herramientas básicas
    Cuando el shell pierde la capacidad de ejecutar cualquier binario externo, la única forma de operar es a través de un live CD/USB con herramientas de recuperación.

Solución

La recuperación se divide en tres fases:

  1. Arrancar en modo rescate

    • Usa un live medio de Debian (o cualquier distro compatible) que incluya debootstrap y chroot.
    • Monta la partición raíz del servidor en /mnt.
    • Si tienes particiones separadas (/home, /var, /opt), móntalas bajo el árbol correspondiente.
  2. Restaurar el archivo de estado de dpkg

    • Si tienes un backup de /var/lib/dpkg/status (por ejemplo, en /var/backups/dpkg.status.0), cópialo.
    • Si no existe backup, recrea un estado mínimo con los paquetes esenciales.
    • El objetivo es que apt reconozca al menos los paquetes base (base-files, dpkg, apt, libc6, libexpat1, sudo).
  3. Reinstalar paquetes críticos y reparar dependencias

    • Con chroot dentro del sistema dañado, ejecuta apt-get update y reinstala los paquetes esenciales.
    • Usa apt-get install --reinstall para forzar la instalación aunque el paquete aparezca como “no instalado”.
    • Finaliza con dpkg --configure -a y apt-get -f install para corregir dependencias rotas.

Paso a paso

1. Preparar el entorno live

  1. Arranca el servidor con un USB de Debian Live (modo “Rescue” o “Live”).
  2. Abre una terminal y verifica la tabla de particiones: lsblk. Identifica la partición raíz, por ejemplo /dev/sda2.

2. Montar y chroot

mount /dev/sda2 /mnt
# Si tienes /boot, /home, /var en particiones separadas:
mount /dev/sda1 /mnt/boot
mount /dev/sda3 /mnt/home
mount /dev/sda4 /mnt/var
# Montar pseudo‑sistemas de archivos necesarios:
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash

Ahora estás dentro del entorno del servidor dañado, con acceso a sus archivos pero usando las utilidades del live system.

3. Recuperar /var/lib/dpkg/status

  • Opción A: backup disponible

    cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
    
  • Opción B: reconstruir manualmente
    Crea un archivo mínimo con los paquetes base:

    cat > /var/lib/dpkg/status <<'EOF'
    Package: base-files
    Status: install ok installed
    Architecture: amd64
    Version: 12.3
    Description: Debian base system files
    
    Package: dpkg
    Status: install ok installed
    Architecture: amd64
    Version: 1.21.22
    Description: Debian package management system
    
    Package: apt
    Status: install ok installed
    Architecture: amd64
    Version: 2.6.0
    Description: commandline package manager
    
    Package: libc6
    Status: install ok installed
    Architecture: amd64
    Version: 2.36
    Description: GNU C Library
    
    Package: libexpat1
    Status: install ok installed
    Architecture: amd64
    Version: 2.5.0
    Description: XML parsing library
    
    Package: sudo
    Status: install ok installed
    Architecture: amd64
    Version: 1.9.15
    Description: Provide limited superuser privileges
    EOF
    

    Ajusta versiones según lo que tengas en los repositorios.

4. Reinstalar paquetes críticos

apt-get update
apt-get install --reinstall dpkg apt sudo libc6 libexpat1

Si apt sigue fallando por dependencias rotas, fuerza la instalación con dpkg:

dpkg -i /var/cache/apt/archives/dpkg_*.deb
dpkg -i /var/cache/apt/archives/apt_*.deb
dpkg -i /var/cache/apt/archives/sudo_*.deb
dpkg -i /var/cache/apt/archives/libc6_*.deb
dpkg -i /var/cache/apt/archives/libexpat1_*.deb

Una vez los binarios esenciales estén presentes, ejecuta:

dpkg --configure -a
apt-get -f install

Esto reparará la base de datos de paquetes y reinstalará cualquier dependencia que haya quedado en estado “half‑installed”.

5. Salir y reiniciar

exit
umount -R /mnt
reboot

Al arrancar, el sistema debería volver a operar normalmente. Los paquetes de aplicación (Jellyfin, Docker, etc.) pueden reinstalarse con apt install o mediante sus propios scripts.

Cuándo aplicar esta solución

  • Síntomas: sudo desaparece, apt muestra errores de dependencias, cualquier comando externo devuelve “cannot execute: required file not found”.
  • Entorno: Sistema Debian (o derivado) con particiones separadas que permiten montar la raíz sin sobrescribir datos.
  • No aplica: Cuando el disco está físicamente dañado y no permite montar la partición, o cuando no hay acceso a un medio live funcional.

Código

# 1. Montaje y chroot
mount /dev/sda2 /mnt
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt /bin/bash

# 2. Restaurar status (usar backup si existe)
cp /var/backups/dpkg.status.0 /var/lib/dpkg/status   # o crear archivo mínimo

# 3. Reinstalar paquetes críticos
apt-get update
apt-get install --reinstall dpkg apt sudo libc6 libexpat1

# 4. Reparar base de datos
dpkg --configure -a
apt-get -f install

# 5. Salir y reboot
exit
umount -R /mnt
reboot

Verificación

  1. Comprobar presencia de binarios

    which sudo dpkg apt
    

    Cada comando debe devolver una ruta válida (/usr/bin/sudo, etc.).

  2. Estado de paquetes

    dpkg -l | grep -E 'dpkg|apt|sudo|libc6|libexpat1'
    

    La columna “ii” indica que el paquete está instalado y configurado.

  3. Arranque limpio
    Observa los mensajes del boot y verifica que systemd no reporte fallos de unidades críticas.

  4. Servicios
    Reinicia los servicios que fueron afectados (por ejemplo, systemctl restart jellyfin) y revisa sus logs.

Notas adicionales

  • Backups automáticos: Debian crea copias de seguridad de dpkg/status en /var/backups. Configura una tarea cron para copiar ese archivo a una ubicación fuera del disco del sistema.
  • Separación de datos: Mantener /var y /home en particiones distintas facilita la recuperación, pues el daño al árbol de paquetes no afecta los datos de usuario.
  • Live rescue minimal: Si el live medio no incluye debootstrap, puedes instalarlo con apt-get install debootstrap antes de iniciar el proceso.
  • Prevención: Evita combinar purge con autoremove cuando el estado de dpkg sea sospechoso. Ejecuta apt-get check antes de operaciones masivas.
  • Documentación interna: Mantén un archivo RECOVERY.md en tu repositorio de configuración con los pasos de rescate; ahorra tiempo cuando ocurre lo inesperado.