Comment reconstruire un fichier d'état dpkg corrompu?

26

Chaque fois que je tape sudo apt-get remove, puis appuie sur la Tabtouche de saisie semi-automatique, j'obtiens 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 package de bibliothèque mono et l'insertion de deux points n'a pas aidé. La suppression de la ligne contenant le point n'a pas fonctionné non plus. L'écrasement du fichier avec status-old a donné le même message.

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

Ramón
la source
3
Je ne pense pas que vous puissiez reconstruire complètement le statusfichier: c'est une source principale d'informations, et bien qu'une grande partie soit redondante, ce n'est pas tout. Cependant, il est probablement possible de réparer le fichier manuellement. Postez une partie du fichier autour de la ligne problématique, disons 20 à 40 lignes, dont au moins une Package:ligne avant et après la ligne 15945.
Gilles 'SO- arrête d'être méchant'
Depuis, j'ai essayé de désinstaller mono, mais tout ce qu'il a fait, c'est changer le numéro de ligne qui est signalé comme une erreur. Si vous suivez le lien de collage
Ramón
@ Ramón Ainsi, apt-get, dpkget amis fonctionnent toujours correctement, et ce qui est la moindre erreur est auto-complétion?
Riccardo Murri
Correct. Il semble que vous ne rencontrez que des problèmes lors de l'analyse du fichier d'état lors de l'utilisation de la saisie semi-automatique. Sinon, je peux installer et supprimer des packages sans aucune erreur apparente.
Ramón
Obtenir le même problème. Je ne pense pas que l'utilisation aveugle d'une ancienne version de la base de données d'apt soit la bonne chose à faire ici, même si cela résout ce problème.
Oli

Réponses:

7

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

Le correctif consiste à rechercher les pauses de formatage réelles et à les corriger manuellement. Ce n'est pas aussi difficile qu'il y paraît.

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

Oli
la source
Heureux que vous ayez trouvé une solution, Oli et merci pour le partage. Dans mon cas, en plus du deb problématique de Lexmark, un deb Webmin avait également sa description mal formulée mais dans ce cas, il n'a pas posé de problème d'analyse lors de la saisie semi-automatique. Bizarre.
Ramón
3
@Oli êtes-vous titulaire de la licence? Pouvez-vous écrire cela ici?
Braiam
C'est vrai, c'est bien que j'ai lu votre post. J'en avais un missing package nameet j'ai découvert que, pour une raison étrange, je ferais mieux de ne pas perdre mon temps à le découvrir, j'avais une ligne Packaga: landscape-commonqui a été fixée orthographiquement et bam, problème résolu. Le fait est que je n'ai jamais touché à ce dossier, ni personne d'autre. Comment un ordinateur peut-il gâcher une faute d'orthographe?
Severo Raz
La réponse réelle doit également être ici, pour éviter que ce soit une réponse de lien uniquement [si l'erreur provient d'une ligne vierge qui ne précède pas «Package:», puis ajoutez un .à cette ligne vide].
Xen2050
20

Vous devriez être en mesure de travailler avec un fichier de bon état 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é dans 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 état ls -l * 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

Ainsi, pour récupérer d'une corruption, vous devriez pouvoir effectuer les opérations suivantes:

1. Effectuez une sauvegarde du fichier d'état corrompu :

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

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

non plus

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. Exécutez ensuite la mise à jour apt-get:

sudo apt-get update

Ça devrait le faire.

Jim
la source
2
Je ne connaissais pas les fichiers d'état conservés dans / var / backups. C'est une bonne information à avoir au cas où cela se reproduirait. Merci, Jim.
Ramón
Mais est-il sûr d'utiliser une ancienne version? Je veux dire, ce n'est pas seulement l'auto-complétion qui utilise ce fichier et l'utilisation d'une ancienne version avec des informations de package plus anciennes va visser d'autres choses, beaucoup plus importantes ... comme apt lui-même.
Oli
@Oli, je ne suis pas sûr. Je n'ai eu à le faire qu'une seule fois. Je pense que j'ai dû réinstaller l'application à l'origine du problème, mais à l'avenir, cela a fonctionné. Comme pour tous les conseils sur Internet (ou du moins les conseils de moi sur Internet), cela a fonctionné pour moi. Cela ne signifie pas que cela fonctionnera nécessairement pour vous. Je l'offre sans garantie et sans connaissance expresse de son comportement sur votre système. Votre kilométrage peut varier. Essayez à vos risques et périls.
Jim
Cette solution semble avoir résolu mes problèmes. Je mettrai à jour si des problèmes surviennent lors de l'utilisation d'un ancien fichier d'état.
Matthew
Il est possible que certains fichiers du paquet manquent dans l'ancien fichier, mais ce sera généralement correct. Cette opération sudo apt update && sudo apt dist-upgradedevrait résoudre la plupart des problèmes que l'ancien statusfichier peut provoquer. Si votre système a un plus gros gâchis, sudo aptitude dist-upgradeau lieu de sudo apt ...peut parfois suggérer de meilleures façons de réparer la rupture.
Mikko Rantalainen
6

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

écart
la source
Merci beaucoup, ça marche pour moi et en fait c'est la bonne approche Merci
user2671192
6

Essayez un "dpkg -P" pour le package incriminé. Cela le purgera du référentiel local, supprimant toutes les traces. Sur mon système, c'était le correctif pour les packages supprimés (mais pas encore purgés) qui ont produit cette erreur.

ordinairement
la source
5

Dans ce cas, je voudrais sauvegarder le /var/lib/dpkg/statusfichier corrompu , puis le corriger manuellement (autour des lignes 1888 et 9550) en utilisant les informations de

apt-cache show libssl0.9.8
apt-cache show udev
organiser
la source
J'ai compris . apt-get fonctionne désormais correctement.
ændrük
3

Il s'agit d'un bug (censé être corrigé): Launchpad Bug 613018

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
htorque
la source
2

Fils de...

D'accord, l'erreur réelle se trouvait sur la ligne 15266, bien qu'elle ait é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 faire fonctionner mon imprimante Lexmark il y a longtemps. L'entrée était pour le paquet lexmark-inkjet-08-driver. Le champ Description n'avait pas de signe .à la place d'un saut de ligne. Cela a provoqué l'erreur d'analyse.

Pour trouver cela, j'ai eu recours à une méthode de dépannage du fusil de chasse et j'ai commencé à essayer les choses de manière assez aléatoire. L'une de mes tentatives maladroites était de grep-status -P epenser que e était la lettre la plus courante de l'alphabet. Bête, je sais, mais le dernier enregistrement de statut imprimé avant qu'il ne se plaigne d'un côlon manquant était pour le paquet lexmark et j'ai remarqué le manque de .personnage après quelques minutes à regarder l'écran.

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

Ramón
la source
grep-status -r -P ^doit toujours correspondre à n'importe quel package, il doit donc analyser l'intégralité du fichier et abandonner s'il ne peut pas l'analyser.
Mikko Rantalainen
2

Parce que mon 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 '\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: 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 caractères "poubelle" de votre fichier - sont supprimés lors de 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ù seraient les dégâts: (peut-être long)

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