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
-
Corrupción del archivo de estado de dpkg
Fallos de hardware, cortes de energía o errores defsckpueden vaciar o dañar/var/lib/dpkg/status. Cuando el archivo está vacío,aptpierde la información de qué paquetes están instalados y sus relaciones de dependencia. -
Uso de
apt-get purgeoapt-get autoremovecon estado vacío
Con unstatusvacío,apt-get autoremove -yconsidera que todos los paquetes son “órfanos” y los marca para eliminación. El comandopurgeelimina también los archivos de configuración, lo que impide una reinstalación sencilla. -
Eliminación de bibliotecas compartidas esenciales
Bibliotecas comolibc6,libexpat1o el propiold-linux.soson requeridas porapt,dpkgybash. Su ausencia rompe la cadena de ejecución, generando errores comocannot open shared object file: No such file or directory. -
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:
-
Arrancar en modo rescate
- Usa un live medio de Debian (o cualquier distro compatible) que incluya
debootstrapychroot. - Monta la partición raíz del servidor en
/mnt. - Si tienes particiones separadas (
/home,/var,/opt), móntalas bajo el árbol correspondiente.
- Usa un live medio de Debian (o cualquier distro compatible) que incluya
-
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
aptreconozca al menos los paquetes base (base-files,dpkg,apt,libc6,libexpat1,sudo).
- Si tienes un backup de
-
Reinstalar paquetes críticos y reparar dependencias
- Con
chrootdentro del sistema dañado, ejecutaapt-get updatey reinstala los paquetes esenciales. - Usa
apt-get install --reinstallpara forzar la instalación aunque el paquete aparezca como “no instalado”. - Finaliza con
dpkg --configure -ayapt-get -f installpara corregir dependencias rotas.
- Con
Paso a paso
1. Preparar el entorno live
- Arranca el servidor con un USB de Debian Live (modo “Rescue” o “Live”).
- 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 EOFAjusta 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:
sudodesaparece,aptmuestra 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
-
Comprobar presencia de binarios
which sudo dpkg aptCada comando debe devolver una ruta válida (
/usr/bin/sudo, etc.). -
Estado de paquetes
dpkg -l | grep -E 'dpkg|apt|sudo|libc6|libexpat1'La columna “ii” indica que el paquete está instalado y configurado.
-
Arranque limpio
Observa los mensajes delbooty verifica quesystemdno reporte fallos de unidades críticas. -
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/statusen/var/backups. Configura una tarea cron para copiar ese archivo a una ubicación fuera del disco del sistema. - Separación de datos: Mantener
/vary/homeen 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 conapt-get install debootstrapantes de iniciar el proceso. - Prevención: Evita combinar
purgeconautoremovecuando el estado dedpkgsea sospechoso. Ejecutaapt-get checkantes de operaciones masivas. - Documentación interna: Mantén un archivo
RECOVERY.mden tu repositorio de configuración con los pasos de rescate; ahorra tiempo cuando ocurre lo inesperado.