À 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?
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.
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.
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.
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é).
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
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
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.
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