Comment reconstruire un fichier d'état dpkg corrompu?

23

Chaque fois que je tape sudo apt-get remove puis que je clique sur la touche Tab pour une 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 du fichier de statut. Il s'agit d'un point dans le champ de description d'un package de bibliothèque mono et l'insertion d'un deux-points n'a pas aidé. Supprimer la ligne contenant le point ne fonctionnait pas non plus. Le remplacement du fichier par status-old a abouti au même message.

Y a-t-il un moyen de reconstruire le fichier d'état?

    
posée Ramón 27.09.2010 - 23:08
la source

8 réponses

7

J'ai finalement corrigé mon système. La restauration d’une sauvegarde du fichier d’état ne fonctionnait pas car j’ai eu le problème depuis si longtemps, c’est dans toutes mes sauvegardes.

Le correctif implique la saisie des bris de mise en forme et leur correction manuelle. Ce n'est pas aussi dur que ça en a l'air.

lien

    
réponse donnée Oli 30.01.2011 - 03:07
la source
16

Vous devriez pouvoir travailler avec un fichier de bon état connu et le mettre à jour à partir de là. Chaque fois que vous effectuez une installation ou une mise à jour, le fichier d'état est enregistré dans une sauvegarde gzippée sous / var / backups . Faire un ls -l dpkg * dans le répertoire indique:

-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 état ls -l * dans le répertoire indique:

-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. Effectuez une sauvegarde du fichier d'état endommagé :

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

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

soit

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

ou

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. Ensuite, lancez apt-get update:

sudo apt-get update

Cela devrait le faire.

    
réponse donnée Jim 04.10.2010 - 17:20
la source
4

Dans ce cas, je sauvegarderais le fichier /var/lib/dpkg/status corrompu, puis le corrigerais manuellement (autour des lignes 1888 et 9550) en utilisant les informations de

apt-cache show libssl0.9.8
apt-cache show udev
    
réponse donnée arrange 10.03.2011 - 00:07
la source
4

J'ai pu résoudre ce problème en supprimant les paquets 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é).

    
réponse donnée gap 08.07.2011 - 13:41
la source
4

Essayez un "dpkg -P" pour le package incriminé. Cela le purgera du dépôt local, en supprimant toutes les traces. Sur mon système, c'était le correctif pour les packages supprimés (mais pas encore purgés) qui produisaient cette erreur.

    
réponse donnée ordually 25.08.2011 - 18:08
la source
3

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

En amont: Bogue Debian 590885

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

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
    
réponse donnée htorque 12.06.2011 - 04:17
la source
1

Fils d'un ...

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

Pour trouver cela, j'ai eu recours à une méthode de dépannage de type shotgun et j'ai commencé à essayer les choses à peu près au hasard. Un de mes tentatives maladroites était grep-status -P e pensant que e était la lettre la plus commune dans l'alphabet. Dumb, je sais, mais le dernier enregistrement de statut imprimé avant de se plaindre d'un colon manquant était pour le package lexmark et j'ai remarqué l'absence de caractère . après quelques minutes de regarder l'écran.

Si possible, j'aimerais une autre réponse qui pourrait décrire une meilleure méthode pour trouver ce type de problème au cas où quelqu'un se heurterait à un problème similaire dans le futur. Merci.

    
réponse donnée Ramón 30.09.2010 - 01:57
la source
0

Parce que mon ancien statut é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 '-6' < 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 autre que l'octal ASCII   valeurs affichées entre les guillemets simples. Cette commande   autorise spécifiquement les caractères suivants à traverser cet Unix   filtre:

     

octal 11: tab

     

octal 12: saut de ligne

     

octal 15: retour chariot

     

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

     

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

CRÉDIT: lien

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

diff /var/lib/dpkg/{status-old,status} |less
    
réponse donnée Marcos 29.08.2014 - 11:23
la source

Lire d'autres questions sur les étiquettes