Wie erstelle ich eine beschädigte dpkg-Statusdatei neu?

26

Immer wenn ich tippe sudo apt-get removeund dann die TabTaste für die automatische Vervollständigung drücke, erhalte ich die folgende Meldung:

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

Ich sehe in der Statusdatei in Zeile 15945 nichts Besonderes. Es ist ein Punkt im Beschreibungsfeld eines Monobibliothekspakets und das Einfügen eines Doppelpunkts hat nicht geholfen. Das Entfernen der Linie mit dem Punkt hat ebenfalls nicht funktioniert. Das Überschreiben der Datei mit dem Status "Alt" führte zu derselben Meldung.

Gibt es eine Möglichkeit, die Statusdatei neu zu erstellen?

Ramón
quelle
3
Ich glaube nicht, dass Sie die statusDatei vollständig neu erstellen können: Sie ist eine Hauptinformationsquelle, und viele davon sind zwar redundant, aber nicht alle. Es ist jedoch wahrscheinlich möglich, die Datei manuell zu reparieren. Stellen Sie einen Teil der Datei um die problematische Zeile, z. B. Package:20 bis 40 Zeilen, einschließlich mindestens einer Zeile vor und nach Zeile 15945.
Gilles '
Ich habe seitdem versucht, Mono zu deinstallieren, aber alles, was es getan hat, war die Zeilennummer zu ändern, die als Fehler gemeldet wird. Wenn Sie dem Einfügen-Link folgen, lautet die Nummer der beleidigenden Zeile 25, "Abschnitt: Python" paste.ubuntu.com/501929
Ramón
@ Ramón So apt-get, dpkgund nach wie vor richtig, Freunde und was ist erroring aus Auto-Vervollständigung?
Riccardo Murri
Richtig. Es scheint nur Probleme beim Parsen der Statusdatei zu geben, wenn die automatische Vervollständigung verwendet wird. Ansonsten kann ich Pakete ohne offensichtliche Fehler installieren und entfernen.
Ramón
Immer das gleiche Problem. Ich denke nicht, dass es das Richtige ist, eine alte Version der apt-Datenbank blind zu verwenden, unabhängig davon, ob es dieses Problem behebt .
Oli

Antworten:

7

Ich habe endlich mein System davon behoben. Das Wiederherstellen eines Backups der Statusdatei hat nicht funktioniert, da ich das Problem so lange hatte, dass es in allen meinen Backups enthalten ist.

Das Update umfasst das Greifen nach den tatsächlichen Formatierungspausen und das manuelle Beheben dieser Pausen. Es ist nicht so schwer, wie es sich anhört.

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

Oli
quelle
Ich bin froh, dass du eine Lösung gefunden hast, Oli, und danke fürs Teilen. In meinem Fall war die Beschreibung einer Webmin-Deb zusätzlich zu der problematischen Lexmark-Deb auch falsch, aber in diesem Fall verursachte sie beim Ausführen einer automatischen Vervollständigung keine Analyseprobleme. Seltsam.
Ramón
3
@Oli sind Sie Inhaber der Lizenz? Kannst du das hier schreiben?
Braiam
Das stimmt, gut, dass ich deinen Beitrag gelesen habe. Ich hatte eine missing package nameund fand heraus, dass ich aus irgendeinem seltsamen Grund, den ich besser nicht verschwenden sollte, eine Leitung hatte, Packaga: landscape-commondie ortographisch repariert und das Problem gelöst war. Die Sache ist, ich habe diese Datei nie berührt, noch hat jemand anderes. Wie kann ein Computer einen Rechtschreibfehler verwechseln?
Severo Raz
Die eigentliche Antwort sollte auch hier sein, um zu vermeiden, dass es sich um eine Nur-Link-Antwort handelt [wenn der Fehler aus einer Leerzeile stammt, die nicht vor "Package:" steht, fügen Sie .dieser Leerzeile ein hinzu].
Xen2050
20

Sie sollten in der Lage sein, mit einer früheren bekannten guten Statusdatei zu arbeiten und von dort aus zu aktualisieren. Jedes Mal, wenn Sie eine Installation oder ein Update durchführen, wird die Statusdatei in einer komprimierten Sicherung unter / var / backups gespeichert . Wenn Sie ein ls -l dpkg * für das Verzeichnis ausführen, wird Folgendes angezeigt :

-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

Es gibt auch eine Sicherung der Datei, die im Verzeichnis / var / lib / dpkg / mit dem Namen status-old erstellt wurde. Wenn Sie für das Verzeichnis den Status ls -l * eingeben, wird Folgendes angezeigt :

-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

Um sich von einer Beschädigung zu erholen, sollten Sie in der Lage sein, Folgendes zu tun:

1. Erstellen Sie eine Sicherungskopie der beschädigten Statusdatei :

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

2. Kopieren Sie eine aktuelle dpkg-Statusdatei aus einer der oben genannten Quellen:

entweder

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

oder

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. Führen Sie dann apt-get update aus:

sudo apt-get update

Das sollte es tun.

Jim
quelle
2
Ich wusste nichts über die Statusdateien in / var / backups. Dies ist eine gute Information für den Fall, dass es wieder vorkommt. Danke, Jim.
Ramón
Aber ist es sicher, eine alte Version zu verwenden? Ich meine, es ist sicherlich nicht nur die automatische Vervollständigung, die diese Datei verwendet, und die Verwendung einer alten Version mit älteren Paketinformationen wird andere, weitaus wichtigere Dinge vermasseln ... wie z. B. apt selbst.
Oli
Ich bin mir nicht sicher. Ich musste das nur einmal machen. Ich glaube, ich musste die App, die das Problem verursacht hat, neu installieren, aber es hat funktioniert. Wie bei allen Ratschlägen im Internet (oder zumindest Ratschlägen von mir im Internet) hat dies bei mir funktioniert. Das bedeutet nicht, dass es für Sie unbedingt funktionieren wird. Ich biete es ohne Garantie und ohne ausdrückliche Kenntnis darüber an, wie es sich auf Ihrem System verhält. Ihr Kilometerstand kann variieren. Versuchen Sie es auf eigenes Risiko.
Jim
Diese Lösung scheint meine Probleme behoben zu haben. Ich werde aktualisieren, wenn Probleme bei der Verwendung einer alten Statusdatei auftreten.
Matthew
In der alten Datei fehlen möglicherweise einige Paketänderungen, die am System vorgenommen wurden. Meistens ist dies jedoch in Ordnung. Dadurch sudo apt update && sudo apt dist-upgradesollten die meisten Probleme behoben werden, die durch die alte statusDatei verursacht werden könnten. Wenn Ihr System ein größeres Chaos hat, sudo aptitude dist-upgradestatt sudo apt ...manchmal bessere Möglichkeiten vorschlagen , den Bruch zu beheben.
Mikko Rantalainen
6

Ich konnte dieses Problem beheben, indem ich die Pakete entfernte, die Einträge in der Statusdatei beschädigt hatten.

sudo dpkg -r handbrake-cli

Die akzeptierte Lösung über pcregrep hat nicht funktioniert (pcregrep hat nichts gefunden).

Spalt
quelle
Vielen Dank, es funktioniert für mich und in der Tat ist es der richtige Ansatz Danke
user2671192
6

Versuchen Sie es mit einem "dpkg -P" für das fehlerhafte Paket. Dadurch wird es aus dem lokalen Repository gelöscht und alle Spuren werden entfernt. Auf meinem System war dies die Korrektur für entfernte (aber noch nicht gelöschte) Pakete, die diesen Fehler verursachten.

gewöhnlich
quelle
5

In diesem Fall würde ich die beschädigte /var/lib/dpkg/statusDatei sichern und sie dann manuell korrigieren (um die Zeilen 1888 und 9550), wobei ich die Informationen von verwende

apt-cache show libssl0.9.8
apt-cache show udev
ordnen
quelle
Verstanden . apt-get läuft jetzt reibungslos.
ændrük
3

Dies war ein Fehler (der behoben werden sollte): Launchpad-Fehler 613018

Upstream: Debian-Bug 590885

Dies sollte eine Problemumgehung sein (Backup, "Fix" -Versionszeichenfolge):

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

Sohn einer...

Okay, der eigentliche Fehler war in Zeile 15266, obwohl er etwa 700 Zeilen weiter unten gemeldet wurde. Der problematische Eintrag in der Statusdatei wurde durch ein Deb verursacht, das ich installiert habe, um meinen Lexmark Drucker vor langer Zeit zum Laufen zu bringen. Der Eintrag war für das Paket lexmark-inkjet-08-driver. Das Feld Beschreibung enthielt keinen .Zeilenumbruch. Dies verursachte den Parsing-Fehler.

Um dies herauszufinden, griff ich auf eine Methode zur Fehlerbehebung bei Schrotflinten zurück und fing an, die Dinge so ziemlich zufällig auszuprobieren. Einer meiner albernen Versuche bestand darin, grep-status -P eherauszufinden, dass e der häufigste Buchstabe im Alphabet ist. Dumm, ich weiß, aber der letzte Statusbericht, der ausgedruckt wurde, bevor er sich über einen fehlenden Doppelpunkt beschwerte, betraf das Lexmark-Paket und ich bemerkte das Fehlen eines .Zeichens, nachdem ich ein paar Minuten lang auf den Bildschirm gestarrt hatte .

Wenn möglich, hätte ich gerne eine andere Antwort, die eine bessere Methode zum Auffinden solcher Probleme beschreibt, falls jemand in Zukunft auf ein ähnliches Problem stößt. Vielen Dank.

Ramón
quelle
grep-status -r -P ^sollte immer mit einem Paket übereinstimmen, damit die gesamte Datei analysiert und abgebrochen wird, wenn sie nicht analysiert werden kann.
Mikko Rantalainen
2

Weil mein Status alt war auch mit zu problematisch apt-get update,

Das hat bei mir ganz gut geklappt:

(als root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

In diesem Befehl werden mit den Argumenten -c und -d des Befehls tr alle Zeichen aus dem Eingabestream entfernt, mit Ausnahme der ASCII-Oktalwerte, die zwischen den einzelnen Anführungszeichen angezeigt werden. Mit diesem Befehl können insbesondere die folgenden Zeichen diesen Unix-Filter passieren:

Oktal 11: Tab

Oktal 12: Zeilenvorschub

Oktal 15: Wagenrücklauf

oktal 40 bis oktal 176: alle "guten" tastaturzeichen

Alle anderen Binärzeichen - die "Müll" -Zeichen in Ihrer Datei - werden während dieses Übersetzungsvorgangs entfernt.

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

Wenn Sie neugierig sind, was sich geändert hat oder wo der Schaden liegen würde: (möglicherweise lang)

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