Pacman-Datenbank reparieren

Aus wiki.archlinux.de

Sollte es während eines laufenden Pacman-Updates aus irgend einem Grund zu einem irregulären Abbruch kommen (Systemabsturz, Stromausfall o.ä.), besteht die Gefahr, dass die Pacman-Datenbank dadurch beschädigt worden ist.

Beschädigung der Pacman-Datenbank

Eine Beschädigung der Synchronisationsdatenbank im Verzeichnis /var/lib/pacman/sync ist in der Regel kein Problem, da sie mit dem Befehl pacman -Syy neu erstellt werden kann. Anders ist es mit dem Verzeichnis /var/lib/pacman/local. Dieser Teil der Datenbank ist als Ausgangsreferenz der lokalen Paketverwaltung ein Unikat, das im Falle einer Beschädigung nicht neu generiert werden kann.

Anzeichen für eine Beschädigung der lokalen Datenbank sind:

  • Der Befehl pacman -Q zeigt keine Ausgabe
  • Der Befehl pacman -Syu meldet fälschlicherweise, dass das System aktuell sei
  • Der Befehl pacman -S <Paket> gibt eine Liste zu installierender Abhängigkeiten aus, die bereits im System installiert sind

Die im System vorhandenen Pakete kann man nach irregulärem Abbruch eines Installations- oder Update-Vorganges mit dem Befehl pacman -Dk auf Gültigkeit überprüfen. Sollte die Ausgabe des Befehls eine vermisste Abhängigkeit für ein Paket anzeigen, kann das Paket mit pacman -S <Paketname> erneut installiert werden.

Backup der lokalen Pacman-Datenbank

Für den Fall einer Beschädigung der lokalen Pacman-Datenbank ist man mit einem frischen Backup des Verzeichnisses /var/lib/pacman/local gut gerüstet.

Manuelles Backup

Ein manuelles Backup der lokalen Pacman-Datenbank kann mit diesem Befehl vorgenommen werden:

tar -cjf pacman-local-backup.tar.bz2 /var/lib/pacman/local

Zur Wiederherstellung der lokalen Pacman-Datenbank legt man die Backup-Datei pacman-local-backup.tar.bz2 in das Root-Verzeichnis / und führt diesen Befehl aus:

tar -xjvf pacman-local-backup.tar.bz2

Automatisiertes Backup

Um das Backup stets auf aktuellem Stand zu halten, ist eine Automatisierung des vorgenannten Backup-Befehles sinnvoll. Diese kann mit dem Tool pakbak-gitAUR realisiert werden. Bei Pakbak handelt es sich um ein Bash-Script, das über einen Systemd-Dienst angestoßen wird, sobald die Inhalte des Verzeichnisses /var/lib/pacman/local verändert worden sind.

Nach der Installation von Pakbak können der Zielort und die Anzahl der im Rotationsverfahren aufzubewahrenden Backups festgelegt werden.

/etc/pakbak.conf
# Backup the database to this folder
target_folder=/var/local/pakbak

# Define how long backups should be kept
keep_days=5

# Define how many backups should be kept
keep_number=5

Hinweis: Das Zielverzeichnis muss angelegt werden bzw. bereits existieren. Umgebungsvariablen in der Pfadangabe wie z.B. $HOME werden nicht verarbeitet.

Um zu testen, ob das Bash-Script erwartungsgemäß funktioniert, kann man die Ausführung mit Root-Rechten manuell anstoßen:

sh /usr/lib/systemd/scripts/pakbak

Anschließend aktiviert man den Systemd-Dienst, der das Verzeichnis /var/lib/pacman/local automatisch auf Veränderungen hin überwacht:

systemctl enable pakbak.path

Restaurierung der lokalen Datenbank

Sollte man nicht über ein zeitnahes Backup verfügen, kann man mit einigem Aufwand versuchen, die lokale Pacman-Datenbank zu restaurieren. Voraussetzung dafür ist, dass die Pacman-Logdatei /var/log/pacman.log vorhanden und unbeschädigt ist. Die einzelnen zur Restauration erforderlichen Verfahrensschritte sind im engl. Wiki detailliert beschrieben.

Listen installierter Pakete sichern

Sollte eine Restauration der lokalen Paketdatenbank auf beschriebenem Wege nicht möglich sein, wird man an einer Neuinstallation des Systems nicht vorbeikommen. Um eine solche Neuinstallation möglichst einfach vornehmen zu können, ist es ratsam, vorsorglich Listen installierter Pakete als Textdatei zu sichern.

Folgender Befehl erstellt eine Liste der Pakete, die aus den Pacman-Repos über die Grundinstallation des Metapaketes base und der Paketgruppe base-devel hinausgehend ausdrücklich installiert worden sind:

pkg=$(comm -23 <(pacman -Qenq | sort) <(pactree -ld1 base | sort)) && comm -23 <(echo -e "$pkg") <(pacman -Qgq base-devel | sort) > Pakete-Repos

Hinweis: Um den Befehl ausführen zu können, muss das Paket pacman-contrib installiert sein.

Nach einer Neuinstallation des Grundsystems können die in der Liste enthaltenen Pakete reinstalliert werden:

pacman -S -< Pakete-Repos

Eine Liste der Pakete, die außerhalb der Pacman-Repos wie z.B. aus dem AUR installiert worden sind, kann man mit diesem Befehl erstellen:

pacman -Qqem > Pakete-AUR

Siehe auch