¿Cómo recrear / var / lib / dpkg / status?

10

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 mantener cierta 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 entiendo el FHS , /varno se supone que los archivos ubicados en sean críticos para el sistema. Califique estos deben ser archivos temporales, registros, cachés y similares.

¿Existe, por lo tanto, una manera de recrear los archivos eliminados?

Martin Vegter
fuente
1
La respuesta de Braiam le devolverá el archivo de estado; pero las cosas que eliminaste también /var/lib/dpkg/infoson bastante importantes. Usted ha entendido mal el FHS, y AFAIK las únicas rutas de recuperación son (a) restaurar desde la copia de seguridad o (b) reinstalar.
derobert

Respuestas:

13

Si observa el propósito de / var como se indica en el Estándar de jerarquía del sistema de archivos , dice:

/varcontiene 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 solo una de las cosas que contiene. También contiene "directorios y archivos de spool" y "datos administrativos y de registro". Eliminó "datos administrativos" críticos.

Continúa explicando por qué /varexiste:

/varse especifica aquí para que sea posible montar /usrsolo lectura. Todo lo que una vez entró en /usreso se escribe durante la operación del sistema (a diferencia de la instalación y el mantenimiento del software) debe estar dentro /var.

De eso se trata /var: los datos que contiene cambian, a diferencia /usr(solo cambia cuando agrega / elimina / actualiza software).

Otras secciones explican los diversos subdirectorios de /var; por ejemplo, /var/lib(donde los archivos que eliminó solían vivir) 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".

Usted realmente no debe borrar archivos sin saber lo que el archivo específico es para. 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 /home, /etcetc. y reinstalar. Hasta que lo haga, no podrá usar dpkg(y APT, etc.). Aparte de eso, el sistema debería continuar funcionando.

derobert
fuente
¿Puedo copiar los archivos desde otra máquina o son específicos de la máquina?
Martin Vegter
1
El estado de @MartinVegter enumera qué paquetes están instalados en esta máquina en particular. Puede copiarlo desde una máquina con exactamente los mismos estados del paquete (no solo instalado, sino también eliminado pero no purgado). apt-get updatereconstruirá disponible, creo. La información / material proviene de cada paquete instalado, pero también refleja el historial, al menos para los viejos archivos conf ... pero probablemente podría salirse con la copia de esa misma máquina de paquetes)
derobert
La documentación actual declara " /var/libInformación de estado. Datos persistentes modificados por los programas a medida que se ejecutan, por ejemplo, bases de datos, metadatos del sistema de empaquetado, etc."
Mikko Rantalainen
8

No se puede "recrear" /var/lib/dpkg/statusen el sentido de simplemente ejecutar un comando y el archivo aparece mágicamente. No. Necesitas usar una copia de seguridad del archivo y aprender a no andar borrando cosas del /var/libdirectorio:

sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status

Esto le daría el estado del paquete del día anterior. Comienza a rezar para que no haya roto otra cosa.

Braiam
fuente
También vea /var/backups, hay varias copias allí.
derobert
@Braiam: no tengo el estado anterior ni tengo nada en / var / backups. ¿Puedo copiar los archivos desde otra máquina o son específicos de la máquina?
Martin Vegter
1
@ MartinVegter no, no funcionará. La forma más rápida para usted es hacer copias de seguridad de sus archivos importantes y reinstalar el sistema. Por cierto, ni siquiera /var/backups/dpkg.status.0?
Braiam
8

Los archivos ubicados en /varson muy críticos para el sistema. Por ejemplo, /var/mailo /var/spool/mailcontiene el correo electrónico de los usuarios; no eliminarías más de lo que encenderías un fuego en el buzón de tu vecino. Solo los archivos en ciertos subdirectorios /varcontienen archivos que son más o menos transitorios: archivos de inicio de sesión /var/log, cachés que generalmente se pueden recrear /var/cache, archivos temporales (que no debe eliminar mientras están en uso) /var/tmp.

Los datos /var/libpueden ser bastante críticos. Por ejemplo, MySQL generalmente está configurado para almacenar sus bases de datos /var/lib/mysqlde forma predeterminada: si borra eso, borrará sus bases de datos. Dpkg también pone sus propias bases de datos /var/lib; /var/lib/dpkg/statuses uno.

/var/lib/dpkg/statuscontiene información sobre paquetes instalados. Si ha borrado eso, debe restaurarlo desde una copia de seguridad. Si su copia de seguridad no está completamente actualizada, revise los registros de las manipulaciones recientes de paquetes debajo /var/log/apty dentro /var/log/dpkg.log. Tendrá que crear ese archivo antes de dpkgque funcione.

/var/lib/dpkg/availableestá construido a partir de datos descargados de Internet. apt-get updateDebería reconstruirlo.

/var/lib/dpkg/infocontiene archivos que se envían con paquetes Debian. Puede restaurar estos archivos simplemente reinstalando los paquetes. Por supuesto, necesitará una lista de paquetes instalados para eso. 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, puede volver a crearlo creando un archivo vacío y luego ejecutándolo apt-get install --reinstallen la lista de paquetes. Un lugar donde también se guarda la lista de paquetes es /var/lib/apt/extended_states, al menos si alguna vez usó APT para instalar paquetes (en lugar de dpkgdirectamente): use ese archivo en lugar de /var/lib/dpkg/statusint el comando anterior. Si también lo ha eliminado, puede reconstruir una lista aproximada de paquetes $(cd /usr/share/doc && ls), ya que la mayoría de los paquetes crean una entrada /usr/share/doc. Probablemente hay algunas excepciones.

No solicite asistencia sobre la administració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.

Gilles 'SO- deja de ser malvado'
fuente
Diría que está bien pedir ayuda sobre paquetes en un sistema de este tipo, siempre y cuando comience a describir el problema histórico y la forma en que lo solucionó . En ocasiones, la reparación de dichos sistemas puede permitir detectar, por ejemplo, vulnerabilidades de seguridad en algunos procesos de administración de paquetes y puede ser valioso a pesar de que tratar con un sistema de este tipo puede ser difícil.
Mikko Rantalainen
5

Se /var/lib/dpkg/availablepuede recrear a partir de los datos de apt. La forma más fácil que encontré para hacer esto fue usar dselecty elegir la actualización. Espero que esto solo funcione si has elegido como método de actualización. Parece que dselecthace un:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Tenga en cuenta que las cosas pueden haber cambiado desde Debian sarge.

Hay trucos para recrear /var/lib/dpkg/statusbasados ​​en el hecho de que cada paquete es necesario para agregar un directorio en el /usr/share/docdirectorio. Ver publicación en http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Se presenta un script que utiliza una lista filtrada de / usr / share / doc para crear una lista de paquetes que se instalaron y luego los reinstala todos.

Chris Gibson
fuente
1

Bueno, supongo que podría volver a crear el archivo vacío y luego hacer apt-get install long-list, suponiendo que sepa lo que instaló la primera vez.

Tengo un script antiguo que básicamente hace esto desde el conjunto más pequeño de paquetes que pueden ejecutar apt-get. Al usarlo, terminé informando docenas de dependencias no declaradas.

Si no sabe todo lo que instaló, reinstale el sistema.

Joshua
fuente
0

En Linux Mint 17 encontré un problema de sonido similar. Estaba entusiasmado con la eliminación de archivos y me encontré donde la "Administración -> Administrador de actualizaciones" no parecía feliz .......

La solución que funcionó para mí fue crear un directorio llamado "dpkg" según el mensaje de error, y crear un archivo vacío llamado "estado".

Luego ejecuté Update Manager.

Me funcionó :-)

Bluegerbil
fuente
0

Si tuviera otras cuentas de usuario distintas de 'roo't, podría intentar apt-get dist-upgrade de una de ellas. Apt descargará los archivos pero se detendrá al instalarlos debido a que faltan algunos directorios en / var /. Se mostrarán los directorios. créelos y ejecute apt-get dist-upgrade de nuevo. en caso de que su creación falle desde el registro de cuenta alternativo de nuevo a la raíz n cree los directorios desde allí y luego ejecute apt nuevamente. se le preguntará sobre la configuración de logrotate y algunas otras configuraciones simplemente escriba Y n continúe hasta el final y luego reinicie cuando termine apt dist-upgrade. ahora todo debería volver a la normalidad.

El único
fuente
0

Perdón por el retraso. Briam, vuelve a crear los directorios y archivos manualmente y luego actualiza los repositorios ( mkdiry touch, según lo requiera el error mostrado), y úsalo dpkg --configure -a.

Su sistema funcionaría bien, pero es importante reinstalarlo para asegurarse de que no esté dañado; anterior es solo para ganar tiempo para programar una reinstalación ... y cuidar de eliminar /var/lib/*archivos.

Daniel Ospitia
fuente
-2

Si compró un raspberry pi 3 y se enfrentó al problema y obtuvo el error "no se pudo abrir el archivo / var / lib / dpkg / status analizado o abierto", esta es una solución que funcionó para mí:

¿Cómo recrear el archivo "/ var / lib / dpkg / status" ?, solo porque este no es un archivo inútil, este es un archivo muy importante que guarda información sobre los paquetes instalados en su sistema operativo raspbian, así que aquí es cómo me recreé :

  1. Realice un wget dentro de su sistema Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Conceder algunos permisos:

    chmod 777 recover1.sh
    
  3. Analice la carpeta de documentación en su sistema y regenere el archivo de estado:

    ./recover1.sh
    
  4. Una vez hecho esto, descargue el archivo y léalo detenidamente. Siga los pasos descritos en el archivo:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    
Dog Labs Corporation
fuente
¡Hola! Publique el código como parte de sus respuestas en lugar de como enlaces.
dhag
Advertencia: recover1.shdestruirá su corriente /var/lib/dpkg/statussin probar si ya está bien. Luego ejecutará una mezcla de trucos para intentar reconstruir una versión que funcione. Nunca ejecute el script anterior a menos que le falte totalmente el archivo / var / lib / dpkg / status. De strings /var/lib/dpkg/statuslo contrario, podría ser una mejor manera de comenzar a reconstruir el archivo dañado.
Mikko Rantalainen