8.46. Paketstatusdatenbank reparieren

dpkg führt permanent Buch über alle Pakete auf einem Debian-System. Es merkt sich in seiner Paketstatusdatenbank den Zustand jedes einzelnen deb-Pakets, welches es jemals in den Fingern hatte (siehe dazu auch Abschnitt 8.4, „Paketstatus erfragen“ und Abschnitt 8.5, „Liste der installierten Pakete anzeigen und deuten“). Die Paketstatusdatenbank befindet sich in der Datei /var/lib/dpkg/status.

Daraus ersehen Sie ganz eindeutig, ob ein Paket schon einmal installiert war, ob alle notwendigen Schritte vollständig und fehlerfrei abgelaufen sind, ob das Paket auf hold gesetzt wurde, ob es wieder entfernt wurde und ob bspw. noch Reste aus dem Paket auf ihrem System verblieben sind. Zu letzterem zählen z.B. die Konfigurationsdateien eines Pakets.

8.46.1. Bit-Dreher reparieren

Die Einträge in der Paketstatusdatenbank sind 7-Bit-Werte, d.h. das achte Bit ist nicht gesetzt. Mittlerweile ist dpkg recht robust gegen unbekannte Felder, auch wenn diese 8-Bit-Werte enthalten. Trotzdem funktioniert vieles nicht mehr, wenn die Paketstatusdatenbank außerhalb des Formates gemäß der Spezifikation nach RFC 822 vorliegt [RFC822].

Die Ursache für dieses gedrehte Bit kann sowohl ein Hardware-Crash sein, während dpkg werkelte, als auch ein Bit-Dreher auf dem Speichermedium selbst. Das nachfolgende Beispiel demonstriert das anhand des Eintrags zum Paket geekcode. In Zeile 10 liegt ein solcher Bitfehler vor – das achte Bit für den Doppelpunkt : ist hier gesetzt.

Bit-Dreher in der Datei /var/lib/dpkg/status für das Paket geekcode (Ausschnitt). 

Package: geekcode
Status: install ok installed
Priority: optional
Section: games
Installed-Size: 166
Maintainer: Eric Dorland <eric@debian.org>
Architecture: amd64
Multi-Arch: foreign
Version: 1.7.3-6
Depends° libc6 (>= 2.7)
Description: Program for generating geekcode
 This is a program for generating the geekcode.
 See http://www.geekcode.com for more info and for discovering
 if you need the geekcode.
Homepage: http://sourceforge.net/projects/geekcode/

Verarbeitet dpkg diese Daten, kann es mit diesem Wert nichts anfangen und bringt seine Verärgerung darüber mit einer deutlichen Fehlermeldung zum Ausdruck. Dieser Fall ist noch vergleichsweise leicht zu reparieren, indem Sie das ISO-Latin-1-Zeichen º mit Hilfe ihres Texteditors wieder durch einen Doppelpunkt ersetzen. Daraufhin ist dpkg wieder glücklich.

dpkg bricht nach einem Bit-Dreher in der Statusdatenbank ab. 

# dpkg --configure --pending
dpkg: error: parsing file '/var/lib/dpkg/status' near line 9 package 'geekcode':
 field name `Dependsº' must be followed by colon

8.46.2. Die Paketstatusdatenbank aus dem lokalen Backup wiederherstellen

Anspruchsvoller wird es jedoch bspw. dann, wenn mehr als nur ein einzelnes Bit oder Byte kaputt ging, plötzlich ganze Blöcke fehlen, oder sich diese nach einer Reparatur des Dateisystems in ganz anderen Formaten in dieser Datei wiederfinden. Dann hilft meist nur noch ein Wiederherstellen der Paketstatusdatenbank aus ihrem Backup.

Zum Glück gibt es auf einem Debian-System mehrere Backups der Paketstatusdatenbank. Ging die Datei erst gerade eben kaputt, so ist die Chance sehr hoch, dass die vorhergehende Sicherheitskopie namens /var/lib/dpkg/status-old noch intakt ist. Dieses Backup entspricht dem Zustand der Paketstatusdatenbank vor der letzten Änderung und hinkt somit nur um eine einzige Aktion hinterher. Kopieren Sie diese zurück nach /var/lib/dpkg/status, so fehlt dpkg nur das Wissen über die letzte Installation oder Deinstallation eines Pakets. Führen Sie diese letzte Aktion erneut durch, ist alles gerettet.

Ist hingegen auch /var/lib/dpkg/status-old defekt, so gibt es unter /var/backups/dpkg.status.* tlw. komprimierte Schnappschüsse der Paketstatusdatenbank. Diese beziehen sich auf die letzten sieben Tage, an denen ihr Rechnersystem eingeschaltet war.

Ersetzen Sie die aktuelle Paketstatusdatenbank durch eine ältere Version, so weiß dpkg nichts mehr von sämtlichen Aktionen, die Sie seitdem durchgeführt haben. Insbesondere denkt es, ein Paket sei noch installiert, wenn es seit dem Backup der Datei deinstalliert wurde. In diesem Fall führen Sie die Entfernung des entsprechenden Pakets nochmals durch. Schlägt diese Aktion fehl, weil die dazu erwarteten Dateien bereits nicht mehr da sind, so kann es helfen, das entsprechende Paket mittels dpkg -i vorher nochmals zu installieren, um wieder einen konsistenten Zustand zu erreichen.

8.46.3. Die Paketstatusdatenbanken von APT und aptitude

Auch APT und aptitude führen eigene Archive über ihre Aktionen, zu denen ebenfalls unter /var/backups/ tägliche Schnappschüsse existieren. Allerdings ist ein Verlust dieser Statusdatenbanken weniger kritisch, da die meisten Informationen darin durch ein apt-get update bzw. aptitude update schnell wiederherstellbar sind. Grundlage dafür sind jedoch die Daten aus der Paketstatusdatenbank von dpkg.

Das einzige, was auf diese Art und Weise nicht wiederhergestellt werden kann, sind APT- und aptitude-spezifische Informationen. Dazu zählen bspw. die Markierungen automatisch installiert sowie die Vormerkungen und User-Tags von aptitude (siehe Kapitel 11, Mit aptitude Vormerkungen machen).