Wie erstelle ich / var / lib / dpkg / status neu?

10

Ich habe einige Dateien gelöscht /var/lib/dpkg/, nämlich:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*

Ich verstehe, dass Debian diese Dateien verwendet, um einige Informationen über installierte Pakete zu speichern. Wenn ich das tue apt-get update, erhalte ich folgenden Fehler:

Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open 
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.

Nach meinem Verständnis der FHS sollten Dateien in /varnicht systemkritisch sein. Bewerter sollten dies temporäre Dateien, Protokolle, Caches und ähnliches sein.

Gibt es daher eine Möglichkeit, die gelöschten Dateien neu zu erstellen?

Martin Vegter
quelle
1
Mit Braiams Antwort erhalten Sie die Statusdatei zurück. Aber das, was Sie unter gelöscht haben, /var/lib/dpkg/infoist auch ziemlich wichtig. Sie haben die FHS falsch verstanden, und AFAIK die einzigen Wiederherstellungspfade sind (a) Wiederherstellung aus dem Backup oder (b) Neuinstallation.
Derobert

Antworten:

13

Wenn Sie sich den Zweck von / var ansehen, wie er im Dateisystem-Hierarchiestandard angegeben ist , heißt es:

/varenthält variable Datendateien. Dies umfasst Spool-Verzeichnisse und -Dateien, Verwaltungs- und Protokolldaten sowie vorübergehende und temporäre Dateien.

Beachten Sie, dass "vorübergehende und temporäre" Dateien nur eines der darin enthaltenen Elemente sind. Es enthält auch "Spool-Verzeichnisse und -Dateien" und "Verwaltungs- und Protokolldaten". Sie haben wichtige "Verwaltungsdaten" gelöscht.

Es wird weiter erklärt, warum es /varexistiert:

/varwird hier angegeben, um das Mounten /usrschreibgeschützt zu ermöglichen. Alles, was einmal in ging /usrdas geschrieben wird, um während des Systembetriebs (im Gegensatz zu Installation und Software - Wartung im Gegensatz) in sein müssen /var.

Das ist das Wichtigste /var: Die darin enthaltenen Daten ändern sich im Gegensatz zu /usr(was sich nur ändert, wenn Sie Software hinzufügen / entfernen / aktualisieren).

Weitere Abschnitte erläutern die verschiedenen Unterverzeichnisse von /var; Beispiel /var/lib(wo die von Ihnen gelöschten Dateien zum Leben erweckt wurden) enthält "Statusinformationen zu einer Anwendung oder zum System", definiert als "Daten, die Programme während der Ausführung ändern und die sich auf einen bestimmten Host beziehen".

Sie sollten Dateien wirklich nicht löschen, ohne zu wissen, wofür die jeweilige Datei bestimmt ist. Mit den Dateien , die Sie gelöscht, wenn Sie eine Sicherung dieser Dateien haben, ich glaube , das einzige , was ein Backup ist nimm mehr zu tun /home, /etcusw. und wieder installieren. Bis Sie dies tun, können Sie dpkg(und APT usw.) nicht verwenden. Ansonsten sollte das System weiterhin funktionieren.

derobert
quelle
Kann ich die Dateien von einem anderen Computer kopieren oder sind sie maschinenspezifisch?
Martin Vegter
1
Der @ MartinVegter-Status listet auf, welche Pakete auf diesem bestimmten Computer installiert sind. Sie können es von einem Computer mit genau denselben Paketzuständen kopieren (nicht nur installiert, sondern auch entfernt, aber nicht gelöscht). apt-get updatewird wieder verfügbar bauen, glaube ich. Die Informationen / Inhalte stammen von jedem installierten Paket, spiegeln aber auch den Verlauf wider, zumindest für alte Conf-Dateien ... aber Sie könnten wahrscheinlich mit dem Kopieren von genau derselben
Paketmaschine davonkommen
In der aktuellen Dokumentation heißt es: " /var/libStatusinformationen. Persistente Daten, die von Programmen während der Ausführung geändert wurden, z. B. Datenbanken, Metadaten des Verpackungssystems usw."
Mikko Rantalainen
8

Sie können nicht "neu erstellen", /var/lib/dpkg/statusindem Sie nur einen Befehl ausführen, und die Datei wird auf magische Weise angezeigt. Nein. Sie müssen eine Sicherungskopie der Datei verwenden und lernen, niemals Dinge aus dem /var/libVerzeichnis zu löschen :

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

Dies würde Ihnen den Paketstatus des Vortages geben. Fangen Sie an zu beten, es hat nichts anderes kaputt gemacht.

Braiam
quelle
Siehe auch /var/backups, es gibt dort mehrere Kopien.
Derobert
@Braiam - Ich habe weder den Status alt noch etwas in / var / backups. Kann ich die Dateien von einem anderen Computer kopieren oder sind sie maschinenspezifisch?
Martin Vegter
1
@ MartinVegter nein, es wird nicht funktionieren. Der schnellste Weg für Sie besteht darin, Ihre wichtigen Dateien zu sichern und das System neu zu installieren. Übrigens nicht einmal /var/backups/dpkg.status.0?
Braiam
8

Dateien in /varsind sehr systemkritisch. Zum Beispiel /var/mailoder /var/spool/mailenthält die E-Mail der Benutzer; Sie würden das nicht mehr löschen, als Sie ein Feuer in der Mailbox Ihres Nachbarn entzünden würden. Es sind nur Dateien in bestimmten Unterverzeichnissen /var, die mehr oder weniger vergängliche Dateien enthalten: Anmeldedateien /var/log, Caches, in denen normalerweise neu erstellt werden kann /var/cache, temporäre Dateien (die Sie nicht löschen sollten, während sie verwendet werden!) /var/tmp.

Daten in /var/libkönnen sehr kritisch sein. Beispielsweise ist MySQL normalerweise so konfiguriert, dass seine Datenbanken /var/lib/mysqlstandardmäßig gespeichert werden: Wenn Sie dies löschen, löschen Sie Ihre Datenbanken. Dpkg stellt auch seine eigenen Datenbanken unter /var/lib; /var/lib/dpkg/statusist ein.

/var/lib/dpkg/statusenthält Informationen zu installierten Paketen. Wenn Sie das gelöscht haben, sollten Sie es aus einer Sicherung wiederherstellen. Wenn Ihre Sicherung nicht vollständig auf dem neuesten Stand ist, überprüfen Sie die Protokolle der letzten Paketmanipulationen unter /var/log/aptund in /var/log/dpkg.log. Sie müssen diese Datei erstellen, bevor dpkgsie funktioniert.

/var/lib/dpkg/availablebasiert auf Daten, die aus dem Internet heruntergeladen wurden. apt-get updatesollte es wieder aufbauen.

/var/lib/dpkg/infoenthält Dateien, die mit Debian-Paketen geliefert werden. Sie können diese Dateien einfach wiederherstellen, indem Sie die Pakete neu installieren. Dazu benötigen Sie natürlich eine Liste der installierten Pakete. Wenn Sie wiederhergestellt haben /var/lib/dpkg/status, können Sie die Liste der Pakete von dort extrahieren.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Wenn Sie verloren haben /var/lib/dpkg/status, können Sie es möglicherweise neu erstellen, indem Sie eine leere Datei erstellen und dann apt-get install --reinstalldie Liste der Pakete ausführen. Ein Ort, an dem auch die Liste der Pakete gespeichert wird /var/lib/apt/extended_states, ist , zumindest wenn Sie APT nur zum Installieren von Paketen verwendet haben (im Gegensatz zu dpkgdirekt) - verwenden Sie diese Datei anstelle des /var/lib/dpkg/statusobigen Befehls. Wenn Sie dies ebenfalls gelöscht haben, können Sie eine ungefähre Liste von Paketen mit neu $(cd /usr/share/doc && ls)erstellen, da die meisten Pakete einen Eintrag in erstellen /usr/share/doc. Es gibt wahrscheinlich einige Ausnahmen.

Bitten Sie nicht um Unterstützung bei der Paketverwaltung auf diesem System. Die Wiederherstellung nach dem Löschen systemkritischer Dateien ist keine exakte Wissenschaft. Wenn Sie aus Backups keine Wiederherstellung durchführen können, sollten Sie so bald wie möglich ein neues, sauberes System installieren.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich würde sagen, dass es in Ordnung ist, um Hilfe zu Paketen auf einem solchen System zu bitten, solange Sie mit der Beschreibung des historischen Problems und der Art und Weise, wie Sie es behoben haben, beginnen . Manchmal kann das Reparieren solcher Systeme das Erkennen von Sicherheitslücken in einigen Paketverwaltungsprozessen ermöglichen, und es kann wertvoll sein, obwohl der Umgang mit einem solchen System schwierig sein kann.
Mikko Rantalainen
5

Die /var/lib/dpkg/availablekönnen aus den apt-Daten neu erstellt werden. Der einfachste Weg, dies zu tun, bestand darin dselect, ein Update zu verwenden und auszuwählen. Ich gehe davon aus, dass dies nur funktioniert, wenn Sie als Aktualisierungsmethode ausgewählt haben. Scheint wie dselectein:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Beachten Sie jedoch, dass sich die Dinge seit Debian Sarge möglicherweise geändert haben.

Es gibt Tricks, die neu erstellt werden müssen /var/lib/dpkg/status, da jedes Paket ein Verzeichnis zum /usr/share/docVerzeichnis hinzufügen muss . Siehe Beitrag unter http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Es wird ein Skript vorgestellt, das eine gefilterte Liste von / usr / share / doc verwendet, um eine Liste der installierten Pakete zu erstellen und diese dann alle neu zu installieren.

Chris Gibson
quelle
1

Nun, ich nehme an, Sie könnten die leere Datei neu erstellen und dann apt-get install long-list ausführen, vorausgesetzt, Sie wissen, was Sie beim ersten Mal installiert haben.

Ich habe ein altes Skript, das dies im Grunde aus den kleinsten Paketen macht, die apt-get ausführen können. Bei der Verwendung habe ich Dutzende nicht deklarierter Abhängigkeiten gemeldet.

Wenn Sie nicht alles wissen, was Sie installiert haben, installieren Sie das System neu.

Joshua
quelle
0

Unter Linux Mint 17 stieß ich auf ein ähnlich klingendes Problem. Ich war begeistert beim Löschen von Dateien und fand mich dort wieder, wo der "Administration -> Upgrade Manager" einfach nicht glücklich aussah .......

Die Lösung, die für mich funktioniert hat, bestand darin, ein Verzeichnis mit dem Namen "dpkg" gemäß der Fehlermeldung zu erstellen und darin eine leere Datei mit dem Namen "status" zu erstellen.

Ich habe dann Update Manager ausgeführt.

Es hat für mich funktioniert :-)

Bluegerbil
quelle
0

Wenn Sie andere Benutzerkonten als 'roo't' hätten, könnten Sie versuchen, ein dist-Upgrade von einem von ihnen durchzuführen. Apt lädt die Archive herunter, kann sie jedoch aufgrund fehlender Verzeichnisse in / var / nicht installieren. Die Verzeichnisse werden angezeigt. Erstellen Sie sie und führen Sie apt-get dist-upgrade erneut aus. Falls das Erstellen von ihnen fehlschlägt, melden Sie sich vom alternativen Konto zurück zum Stammverzeichnis. n Erstellen Sie die Verzeichnisse von dort und führen Sie apt erneut aus. Sie werden über die Logrotate-Konfiguration und einige andere Konfigurationen aufgefordert. Geben Sie einfach Y ein. Fahren Sie bis zum Ende fort und starten Sie den Computer neu, wenn das apt dist-Upgrade abgeschlossen ist. alles sollte jetzt wieder normal sein.

Der Eine
quelle
-2

Wenn Sie ein Himbeer-Pi 3 gekauft haben und das Problem aufgetreten ist und die Fehlermeldung "Datei / var / lib / dpkg / status konnte nicht analysiert oder geöffnet werden" angezeigt wurde, ist dies eine Problemumgehung, die für mich funktioniert hat:

Wie erstelle ich die Datei "/ var / lib / dpkg / status" neu? Nur weil dies keine ungenutzte Datei ist, ist dies eine sehr wichtige Datei, die einige Informationen zu installierten Paketen in Ihrem Raspbian-Betriebssystem enthält. Hier ist also, wie ich neu erstellt wurde ::

  1. Führen Sie ein Wget in Ihrem Raspbian-System durch:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Erteilen Sie einige Berechtigungen:

    chmod 777 recover1.sh
    
  3. Analysieren Sie den Dokumentationsordner in Ihrem System und generieren Sie die Statusdatei neu:

    ./recover1.sh
    
  4. Sobald Sie fertig sind, laden Sie die Datei herunter und lesen Sie sie sorgfältig durch. Befolgen Sie die in der Datei beschriebenen Schritte:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    
Dog Labs Corporation
quelle
Hallo! Bitte posten Sie den Code als Teil Ihrer Antworten und nicht als Links.
Dhag
Warnung: recover1.shZerstört Ihren Strom /var/lib/dpkg/statusohne zu testen, wenn er bereits in Ordnung ist. Dann wird eine gemischte Trickkiste ausgeführt, um zu versuchen, eine funktionierende Version wiederherzustellen. Führen Sie das obige Skript niemals aus, es sei denn, Sie vermissen die Datei / var / lib / dpkg / status vollständig. Andernfalls ist es strings /var/lib/dpkg/statusmöglicherweise besser, die beschädigte Datei neu zu erstellen.
Mikko Rantalainen