¿Cómo reconstruyo un archivo de estado dpkg corrupto?

26

Cada vez que escribo sudo apt-get removey luego presiono la Tabtecla para completar automáticamente, aparece el siguiente mensaje:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

No veo nada especialmente extraño en la línea 15945 en el archivo de estado. Es un carácter de punto en el campo de descripción de un paquete de biblioteca mono y la inserción de dos puntos no ayudó. La eliminación de la línea que contiene el punto tampoco funcionó. Sobrescribir el archivo con el estado anterior resultó en el mismo mensaje.

¿Hay alguna forma de reconstruir el archivo de estado?

Ramón
fuente
3
No creo que pueda reconstruir completamente el statusarchivo: es una fuente primaria de información, y aunque mucha de ella es redundante, no toda es. Sin embargo, probablemente sea posible reparar el archivo manualmente. Publique un trozo del archivo alrededor de la línea problemática, digamos 20–40 líneas incluyendo al menos una Package:línea antes y después de la línea 15945.
Gilles 'SO- deja de ser malvado'
Desde entonces he intentado desinstalar mono, pero todo lo que hizo fue cambiar el número de línea que se informa como un error. Si sigue el enlace pegar, el número de la línea ofensiva es 25, "Sección: python" paste.ubuntu.com/501929
Ramón
@ Ramón Así, apt-get, dpkgy amigos siguen funcionando correctamente, y lo que se erroring cabo es auto-realización?
Riccardo Murri
Correcto. Parece que solo tiene problemas para analizar el archivo de estado cuando se utiliza la finalización automática. De lo contrario, puedo instalar y eliminar paquetes sin ningún error aparente.
Ramón
Obteniendo el mismo problema. No creo que usar ciegamente una versión anterior de la base de datos de apt sea lo correcto aquí, independientemente de que solucione este problema.
Oli

Respuestas:

7

Finalmente he arreglado mi sistema de esto. Restaurar una copia de seguridad del archivo de estado no funcionó ya que he tenido el problema durante tanto tiempo, está en todas mis copias de seguridad.

La solución implica grepping para los saltos de formato reales y arreglarlos manualmente. No es tan difícil como parece.

http://thepcspy.com/read/fixing-dpkg-status-corruption/

Oli
fuente
Me alegra que hayas encontrado una solución, Oli, y gracias por compartir. En mi caso, además de la problemática deb de Lexmark, una deb de Webmin también tenía su descripción mal formada, pero en ese caso no causó ningún problema de análisis al hacer un autocompletado. Extraño.
Ramón
3
@Oli, ¿es titular de la licencia? ¿Puedes escribir eso aquí?
Braiam
Esto es cierto, bueno que leí tu publicación. Tenía una missing package namey descubrí que, por alguna extraña razón, es mejor que no pierda el tiempo descubriendo que tenía una línea Packaga: landscape-commonque estaba arreglada ortográficamente y bam, problema resuelto. La cuestión es que nunca he tocado este archivo, ni nadie más. ¿Cómo puede una computadora equivocarse con un error ortográfico?
Severo Raz
La respuesta real también debe estar aquí, para evitar que sea una respuesta de solo enlace [si el error es de una línea en blanco que no precede a "Paquete:", entonces agregue un .a esa línea en blanco].
Xen2050
20

Debería poder trabajar con un archivo de buen estado anterior conocido y actualizar desde allí. Cada vez que realiza una instalación o una actualización, el archivo de estado se guarda en una copia de seguridad comprimida en / var / backups . Haciendo un ls -l dpkg * en el directorio muestra:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

También hay una copia de seguridad del archivo creado en el directorio / var / lib / dpkg / denominado status-old. Haciendo un estado ls -l * en el directorio muestra:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

Por lo tanto, para recuperarse de una corrupción, debe poder hacer lo siguiente:

1. Haga una copia de seguridad del archivo de estado corrupto :

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. Copie un archivo de estado dpkg reciente de cualquiera de las fuentes anteriores:

ya sea

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

o

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3. Luego ejecute apt-get update:

sudo apt-get update

Deberias hacer eso.

Jim
fuente
2
No sabía sobre los archivos de estado guardados en / var / backups. Esta es una buena información para tener en caso de que vuelva a suceder. Gracias Jim.
Ramón
Pero, ¿es seguro usar una versión antigua? Quiero decir, seguramente no es solo el autocompletado el que usa este archivo y usar una versión anterior con información de paquete anterior va a arruinar otras cosas mucho más importantes ... como apt en sí mismo.
Oli
@Oli no estoy seguro. Solo he tenido que hacer esto una vez. Creo que tuve que reinstalar la aplicación que estaba causando el problema, pero en el futuro funcionó. Como con todos los consejos en Internet (o al menos los consejos míos en Internet), esto funcionó para mí. Eso no significa que necesariamente funcione para usted. Lo ofrezco sin garantía y sin conocimiento expreso de cómo se comportará en su sistema. Su experiencia puede ser diferente. Intenta bajo tu propio riesgo.
Jim
Esta solución parece haber solucionado mis problemas. Actualizaré si surge algún problema al usar un archivo de estado antiguo.
Mateo
En el archivo antiguo pueden faltar algunos cambios de paquete que se han realizado en el sistema, pero sobre todo estará bien. Hacerlo sudo apt update && sudo apt dist-upgradedebería solucionar la mayoría de los problemas que statuspuede causar un archivo antiguo . Si su sistema tiene un desorden más grande, en sudo aptitude dist-upgradelugar de sudo apt ...algunas veces puede sugerir mejores formas de solucionar la rotura.
Mikko Rantalainen
6

Pude solucionar este problema eliminando los paquetes que tenían entradas corruptas en el archivo de estado.

sudo dpkg -r handbrake-cli

La solución aceptada a través de pcregrep no funcionó (pcregrep no encontró nada).

brecha
fuente
Muchas gracias, funciona para mí y, de hecho, es el enfoque correcto Gracias
usuario2671192
6

Pruebe con un "dpkg -P" para el paquete ofensivo. Eso lo purgará del repositorio local, eliminando todos los rastros. En mi sistema, esa fue la solución para los paquetes eliminados (pero aún no purgados) que produjeron ese error.

normalmente
fuente
5

En este caso, haría una copia de seguridad del /var/lib/dpkg/statusarchivo dañado y luego lo corregiría manualmente (alrededor de las líneas 1888 y 9550) utilizando la información de

apt-cache show libssl0.9.8
apt-cache show udev
organizar
fuente
Entendido . apt-get ahora funciona sin problemas.
ændrük
3

Esto ha sido un error (supuestamente corregido): Error de Launchpad 613018

Upstream: Debian Bug 590885

Esto debería ser una solución (copia de seguridad, cadena de versión "arreglo"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
htorque
fuente
2

Hijo de...

De acuerdo, el error real estaba en la línea 15266 a pesar de que se informaron unas 700 líneas más abajo. La entrada problemática en el archivo de estado fue causada por un deb que instalé para que mi impresora Lexmark funcionara hace mucho tiempo. La entrada era para el paquete lexmark-inkjet-08-driver. El campo Descripción no tenía un. en lugar de un salto de línea. Esto provocó el error de análisis.

Para encontrar esto, recurrí a un método de solución de problemas de escopeta y comencé a probar cosas al azar. Uno de mis intentos tontos fue grep-status -P epensar que e era la letra más común del alfabeto. Tonto, lo sé, pero el último registro de estado impreso antes de quejarse de un colon perdido era para el paquete Lexmark y noté la falta de un. personaje después de unos minutos de mirar la pantalla.

Si es posible, me gustaría otra respuesta que podría describir un mejor método para encontrar este tipo de problema en caso de que alguien tenga un problema similar en el futuro. Gracias.

Ramón
fuente
grep-status -r -P ^siempre debe coincidir con cualquier paquete, por lo que debe analizar todo el archivo y abortar si no puede analizarlo.
Mikko Rantalainen
2

Porque mi estado anterior era demasiado problemático incluso conapt-get update ,

Esto funcionó bastante bien para mí:

(como root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

Este comando usa los argumentos -c y -d del comando tr para eliminar todos los caracteres de la secuencia de entrada que no sean los valores octales ASCII que se muestran entre las comillas simples. Este comando permite específicamente que los siguientes caracteres pasen por este filtro de Unix:

octal 11: pestaña

octal 12: salto de línea

octal 15: retorno de carro

octal 40 a octal 176: todos los caracteres de teclado "buenos"

Todos los demás caracteres binarios, los caracteres "basura" en su archivo, se eliminan durante este proceso de traducción.

CRÉDITO: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Si tiene curiosidad por saber qué ha cambiado o dónde sería el daño: (posiblemente largo)

diff /var/lib/dpkg/{status-old,status} |less
Marcos
fuente