web-dev-qa-db-fra.com

Comment reconstruire un fichier d'état corrompu de dpkg?

À chaque fois que je tape Sudo apt-get remove et que j'appuie ensuite sur la touche Tab clé pour la saisie automatique, je reçois le message suivant:

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

Je ne vois rien de particulièrement étrange à la ligne 15945 dans le fichier d’état. C'est un caractère point dans le champ de description d'un paquet de bibliothèque mono et l'insertion de deux points n'a pas aidé. Supprimer la ligne contenant le point ne fonctionnait pas non plus. Le remplacement du fichier avec status-old a entraîné le même message.

Est-il possible de reconstruire le fichier d'état?

26
Ramón

J'ai finalement fixé mon système de cela. La restauration d'une sauvegarde du fichier d'état n'a pas fonctionné, car le problème persiste depuis si longtemps que toutes mes sauvegardes en font partie.

Le correctif implique de rechercher les interruptions de formatage réelles et de les corriger manuellement. Ce n'est pas aussi difficile que ça en a l'air.

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

7
Oli

Vous devriez être capable de travailler avec un fichier de bon état antérieur connu et de le mettre à jour à partir de là. Chaque fois que vous effectuez une installation ou une mise à jour, le fichier d’état est enregistré sur une sauvegarde compressée sous /var/backups . Faire un ls -l dpkg * sur le répertoire montre:

-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

Il existe également une sauvegarde du fichier créé dans le répertoire/var/lib/dpkg/nommé status-old. Faire un ls -l status * sur le répertoire montre:

-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

Donc, pour récupérer d'une corruption, vous devriez pouvoir faire ce qui suit:

1. Faites une sauvegarde du fichier d’état corromp:

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

2. Copiez un fichier de statut récent de dpkg à partir de l’une des sources ci-dessus:

soit

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

. Ensuite, lancez apt-get update:

Sudo apt-get update

Ça devrait le faire.

19
Jim

Essayez un "dpkg -P" pour le paquet incriminé. Cela le purgera du référentiel local en supprimant toutes les traces. Sur mon système, c’était le correctif pour les paquets supprimés (mais pas encore purgés) ayant généré cette erreur.

6
ordually

J'ai pu résoudre ce problème en supprimant les packages contenant des entrées corrompues dans le fichier d'état.

Sudo dpkg -r handbrake-cli

La solution acceptée via pcregrep n'a pas fonctionné (pcregrep n'a rien trouvé).

6
gap

Dans ce cas, je sauvegarderais le fichier /var/lib/dpkg/status corrompu, puis le corrigerais manuellement (autour des lignes 1888 et 9550) à l'aide des informations de

apt-cache show libssl0.9.8
apt-cache show udev
5
arrange

Cela a été un bogue (censé être corrigé): bug du Launchpad 613018

En amont: bogue Debian 590885

Cela devrait être une solution de contournement (sauvegarde, chaîne de version "correctif"):

cp /var/lib/dpkg/status ~/dpkg-status.back
Sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
3
htorque

Fils de...

D'accord, l'erreur était sur la ligne 15266, alors qu'elle avait été signalée quelque 700 lignes plus bas. L'entrée problématique dans le fichier d'état a été causée par un deb que j'ai installé pour que mon imprimante Lexmark fonctionne il y a longtemps. L'entrée était pour le paquet lexmark-inkjet-08-driver. Le champ Description n'avait pas . à la place d'un saut de ligne. Cela a causé l'erreur d'analyse.

Pour trouver cela, j'ai eu recours à une méthode de dépannage des armes à feu et j'ai commencé à essayer des choses à peu près au hasard. Une de mes tentatives loufoques a été grep-status -P e, estimant que e était la lettre la plus commune de l'alphabet. Dumb, je sais, mais le dernier état enregistré avant de se plaindre d’un colon manquant concernait le package lexmark et j’ai remarqué l’absence du caractère . après quelques minutes à regarder l'écran.

Si possible, j'aimerais une autre réponse qui pourrait décrire une meilleure méthode pour résoudre ce type de problème au cas où quelqu'un rencontrerait un problème similaire à l'avenir. Merci.

2
Ramón

Parce que mon statut-old était trop problématique, même avec apt-get update,

Cela a plutôt bien fonctionné pour moi:

(en tant que root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

Cette commande utilise les arguments -c et -d de la commande tr pour supprimer tous les caractères du flux d'entrée autres que les valeurs octales ASCII affichées entre les guillemets simples. Cette commande permet spécifiquement aux caractères suivants de passer à travers ce filtre Unix:

octal 11: onglet

octal 12: saut de ligne

octal 15: retour chariot

octal 40 à 176: tous les "bons" caractères du clavier

Tous les autres caractères binaires - les caractères "garbage" de votre fichier - sont supprimés pendant ce processus de traduction.

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

Si vous êtes curieux de savoir ce qui a changé ou où serait le dommage: (éventuellement long)

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