Ich habe einige Dateien gelöscht /var/lib/dpkg/
, und zwar:
/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*
Ich verstehe, dass Debian diese Dateien verwendet, um Informationen über installierte Pakete zu speichern. Wenn ich das jetzt 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.
So wie ich das verstehe,FHS, die darin befindlichen Dateien /var
sollten nicht systemkritisch sein. Vielmehr sollten es temporäre Dateien, Logs, Caches und ähnliches sein.
Gibt es daher eine Möglichkeit, die gelöschten Dateien wiederherzustellen?
Antwort1
Wenn Sie sich dieZweck von /var gemäß Filesystem Hierarchy Standard, es sagt:
/var
enthält Dateien mit variablen Daten. Dazu gehören Spool-Verzeichnisse und -Dateien, Verwaltungs- und Protokolldaten sowie flüchtige und temporäre Dateien.
Beachten Sie, dass „vorübergehende und temporäre“ Dateien nureinsder darin enthaltenen Dinge. Es enthält auch „Spool-Verzeichnisse und -Dateien“ sowie „Verwaltungs- und Protokolldaten“. Sie haben kritische „Verwaltungsdaten“ gelöscht.
Weiter wird erklärt, warum /var
es Folgendes gibt:
/var
wird hier angegeben, um das Mounten/usr
nur lesend zu ermöglichen. Alles, was einmal dort hineinging und/usr
während des Systembetriebs (im Gegensatz zur Installation und Softwarewartung) beschrieben wird, muss in stehen/var
.
Das ist das Entscheidende an /var
: Die darin enthaltenen Daten ändern sich, im Gegensatz zu /usr
(das sich nur ändert, wenn Sie Software hinzufügen/entfernen/aktualisieren).
In weiteren Abschnitten werden die verschiedenen Unterverzeichnisse von erläutert /var
. Beispielsweise /var/lib
enthält (wo sich die von Ihnen gelöschten Dateien befanden) „Statusinformationen zu einer Anwendung oder dem System“, definiert als „Daten, die von Programmen während der Ausführung geändert werden und die sich auf einen bestimmten Host beziehen“.
DuWirklichSie sollten keine Dateien löschen, ohne zu wissen, wofür die jeweilige Datei gedacht ist. Wenn Sie keine Sicherungskopie der gelöschten Dateien haben, bleibt Ihnen meiner Meinung nach nur noch die Möglichkeit, eine Sicherungskopie von usw. zu erstellen /home
und /etc
die Installation erneut durchzuführen. Bis Sie dies tun, können Sie dpkg
(und APT usw.) nicht verwenden. Ansonsten sollte das System weiterhin funktionieren.
Antwort2
Dateien in /var
sind sehr systemkritisch. Beispielsweise enthält /var/mail
oder /var/spool/mail
die E-Mail-Adresse des Benutzers. Sie würden das genauso wenig löschen, wie Sie das Postfach Ihres Nachbarn anzünden würden. Nur Dateien in bestimmten Unterverzeichnissen von /var
enthalten Dateien, die mehr oder weniger flüchtig sind: Protokolldateien in /var/log
, Caches, die normalerweise in neu erstellt werden können /var/cache
, temporäre Dateien (die Sie nicht löschen sollten, während sie verwendet werden!) in /var/tmp
.
Daten in /var/lib
können ziemlich kritisch sein. MySQL ist beispielsweise normalerweise so konfiguriert, dass seine Datenbanken /var/lib/mysql
standardmäßig in gespeichert werden: Wenn Sie das löschen, werden Ihre Datenbanken gelöscht. Dpkg speichert seine eigenen Datenbanken /var/lib
ebenfalls unter; /var/lib/dpkg/status
ist ein Beispiel.
/var/lib/dpkg/status
enthält Informationen zu installierten Paketen. Wenn Sie diese gelöscht haben, sollten Sie sie aus einer Sicherungskopie wiederherstellen. Wenn Ihre Sicherungskopie nicht ganz auf dem neuesten Stand ist, überprüfen Sie die Protokolle der letzten Paketmanipulationen unter /var/log/apt
und in /var/log/dpkg.log
. Sie müssen diese Datei erstellen, bevor dpkg
es funktioniert.
/var/lib/dpkg/available
wird aus aus dem Internet heruntergeladenen Daten erstellt. apt-get update
sollte es neu erstellen.
/var/lib/dpkg/info
enthält Dateien, die mit Debian-Paketen geliefert werden. Sie können diese Dateien einfach wiederherstellen, indem Sie die Pakete neu installieren. Natürlich benötigen Sie dazu eine Liste der installierten Pakete. Wenn Sie wiederhergestellt haben /var/lib/dpkg/status
, können Sie die Paketliste 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 --reinstall
die Paketliste ausführen. Ein Ort, an dem die Paketliste auch gespeichert ist, ist /var/lib/apt/extended_states
, zumindest wenn Sie APT immer nur zum Installieren von Paketen verwendet haben (und nicht dpkg
direkt) – verwenden Sie diese Datei anstelle von /var/lib/dpkg/status
int im obigen Befehl. Wenn Sie das auch gelöscht haben, können Sie mit eine ungefähre Paketliste neu erstellen $(cd /usr/share/doc && ls)
, da die meisten Pakete einen Eintrag in erstellen /usr/share/doc
. Es gibt wahrscheinlich ein paar Ausnahmen.
Bitten Sie nicht um Hilfe bei der Paketverwaltung auf diesem System. Die Wiederherstellung nach dem Löschen systemkritischer Dateien ist keine exakte Wissenschaft. Wenn Sie keine Wiederherstellung aus Backups durchführen können, sollten Sie so schnell wie möglich ein neues, sauberes System installieren.
Antwort3
Sie können nicht „neu erstellen“, /var/lib/dpkg/status
indem Sie einfach einen Befehl ausführen und die Datei wie von Zauberhand erscheint. Nein. Sie müssen eine Sicherungskopie der Datei erstellen und lernen, niemals Dinge aus dem /var/lib
Verzeichnis zu löschen:
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
Dadurch erhalten Sie den Paketstatus vom Vortag. Beten Sie, dass nichts anderes kaputt gegangen ist.
Antwort4
Wenn jemand "/var/lib/dpkg" zerstört:
sudo mkdir -p /var/lib/dpkg/updates
sudo mkdir -p /var/lib/dpkg/info
sudo mkdir -p /var/lib/dpkg/alternatives
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo cp /var/backups/dpkg.statoverride.0 /var/lib/dpkg/statoverride
sudo cp /var/backups/dpkg.diversions.0 /var/lib/dpkg/diversions
sudo cp /var/backups/dpkg.arch.0 /var/lib/dpkg/arch
sudo dpkg --clear-avail
sudo apt update
sudo apt upgrade # If needed.