He eliminado algunos archivos /var/lib/dpkg/
, a saber:
/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*
Entiendo que Debian usa estos archivos para conservar información sobre los paquetes instalados. Ahora, cuando lo hago apt-get update
, aparece el siguiente error:
Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.
Según tengo entendido elFHS, se supone que los archivos ubicados en /var
no son críticos para el sistema. Califique que estos deben ser archivos temporales, registros, cachés y similares.
¿Existe entonces alguna forma de recrear los archivos eliminados?
Respuesta1
Si miras elpropósito de /var como se indica en el Estándar de jerarquía del sistema de archivos, dice:
/var
Contiene archivos de datos variables. Esto incluye directorios y archivos de spool, datos administrativos y de registro, y archivos transitorios y temporales.
Tenga en cuenta que los archivos "transitorios y temporales" son sólounode las cosas que contiene. También contiene "archivos y directorios de spool" y "datos administrativos y de registro". Eliminaste "datos administrativos" críticos.
Continúa explicando por qué /var
existe:
/var
se especifica aquí para hacer posible el montaje/usr
de sólo lectura. Todo lo que alguna vez/usr
se escribió durante la operación del sistema (a diferencia de la instalación y el mantenimiento del software) debe estar en formato/var
.
Esa es la clave /var
: los datos que contiene cambian, a diferencia de /usr
(que solo cambian cuando agrega/elimina/actualiza software).
Secciones adicionales explican los distintos subdirectorios de /var
; por ejemplo, /var/lib
(donde solían vivir los archivos que eliminó) contiene "información de estado relacionada con una aplicación o el sistema", definida como "datos que los programas modifican mientras se ejecutan, y que pertenecen a un host específico".
Túen realidadNo debería eliminar archivos sin saber para qué sirve el archivo específico. Con los archivos que eliminó, a menos que tenga una copia de seguridad de estos archivos, creo que lo único que queda por hacer es hacer una copia de seguridad de /home
, /etc
etc. y reinstalarlos. Hasta que lo haga, no podrá utilizar dpkg
(ni APT, etc.). Aparte de eso, el sistema debería seguir funcionando.
Respuesta2
Los archivos ubicados en /var
son muy críticos para el sistema. Por ejemplo, /var/mail
o /var/spool/mail
contiene el correo electrónico de los usuarios; no borrarías eso, como tampoco encenderías un fuego en el buzón de tu vecino. Solo los archivos en ciertos subdirectorios de /var
contienen archivos que son más o menos transitorios: archivos de registro en /var/log
, cachés que generalmente se pueden recrear en /var/cache
, archivos temporales (¡que no debes eliminar mientras están en uso!) en /var/tmp
.
Los datos ingresados /var/lib
pueden ser bastante críticos. Por ejemplo, MySQL generalmente está configurado para almacenar sus bases de datos de /var/lib/mysql
forma predeterminada: si lo borra, borra sus bases de datos. Dpkg /var/lib
también incluye sus propias bases de datos ; /var/lib/dpkg/status
es uno.
/var/lib/dpkg/status
contiene información sobre los paquetes instalados. Si lo borraste, debes restaurarlo desde una copia de seguridad. Si su copia de seguridad no está completamente actualizada, verifique los registros de manipulaciones recientes de paquetes en /var/log/apt
y en /var/log/dpkg.log
. Deberá crear ese archivo antes de dpkg
que funcione.
/var/lib/dpkg/available
se construye a partir de datos descargados de Internet. apt-get update
debería reconstruirlo.
/var/lib/dpkg/info
contiene archivos que se envían con los paquetes de Debian. Puede restaurar estos archivos simplemente reinstalando los paquetes. Por supuesto, necesitará una lista de paquetes instalados para ello. Si ha restaurado /var/lib/dpkg/status
, puede extraer la lista de paquetes desde allí.
apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')
Si ha perdido /var/lib/dpkg/status
, es posible que pueda recrearlo creando un archivo vacío y luego ejecutándolo apt-get install --reinstall
en la lista de paquetes. Un lugar donde también se guarda la lista de paquetes es /var/lib/apt/extended_states
, al menos si solo ha usado APT para instalar paquetes (en lugar de dpkg
directamente), use ese archivo en lugar de /var/lib/dpkg/status
int el comando anterior. Si también lo ha eliminado, puede reconstruir una lista aproximada de paquetes con $(cd /usr/share/doc && ls)
, porque la mayoría de los paquetes crean una entrada en /usr/share/doc
. Probablemente haya algunas excepciones.
No solicite ayuda sobre la gestión de paquetes en este sistema. Recuperarse de la eliminación de archivos críticos para el sistema no es una ciencia exacta. Si no puede restaurar desde las copias de seguridad, debe instalar un sistema nuevo y limpio lo antes posible.
Respuesta3
No se puede "recrear" /var/lib/dpkg/status
en el sentido de simplemente ejecutar un comando y el archivo aparece mágicamente. No. Necesita utilizar una copia de seguridad del archivo y aprender a no borrar nunca cosas del /var/lib
directorio:
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
Esto le daría el estado del paquete del día anterior. Empiece a rezar para que no se rompa nada más.
Respuesta4
Si alguien termina bombardeando "/var/lib/dpkg":
sudo mkdir -p /var/lib/dpkg/updates
sudo mkdir -p /var/lib/dpkg/info
sudo mkdir -p /var/lib/dpkg/alternatives
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo cp /var/backups/dpkg.statoverride.0 /var/lib/dpkg/statoverride
sudo cp /var/backups/dpkg.diversions.0 /var/lib/dpkg/diversions
sudo cp /var/backups/dpkg.arch.0 /var/lib/dpkg/arch
sudo dpkg --clear-avail
sudo apt update
sudo apt upgrade # If needed.