Archiv/apt/Problembehebung

Archivierte Anleitung

Dieser Artikel wurde archiviert. Das bedeutet, dass er nicht mehr auf Richtigkeit überprüft oder anderweitig gepflegt wird. Der Inhalt wurde für keine aktuell unterstützte Ubuntu-Version getestet. Wenn du Gründe für eine Wiederherstellung siehst, melde dich bitte in der Diskussion zum Artikel. Bis dahin bleibt die Seite für weitere Änderungen gesperrt.


Anmerkung: Artikel wurde mit Paketverwaltung/Problembehebung zusammengeführt und Teile nach Paketverwaltung/Tipps ausgelagert.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Ein Terminal öffnen

  2. Root-Rechte

Inhaltsverzeichnis
  1. NO_PUBKEY
  2. Sämtliche Pakete neu installieren
  3. Defekte Pakete reparieren
  4. Paketverwaltung unbrauchbar
  5. Lock nicht aufrufbar
  6. Anzahl zu aktualisierender Pakete beim Kon...
  7. Paketlisten
  8. Links

Diese Seite dient dazu, bekannte Probleme bei der Arbeit mit der Paketverwaltung und deren Lösungswege zu bündeln, jeweils direkt im Terminal [1].

NO_PUBKEY

Wird der Schlüssel (Key) einer Paketquelle geändert - zum Beispiel weil er abläuft - muss der neue Schlüssel zunächst importiert werden. Die eindeutige ID des Schlüssel wird in der Fehlermeldung genannt. Hat man sich versichert, dass der genannte Key tatsächlich zur gewünschten Quelle gehört, kann er mit apt-key in den Keyring der Paketverwaltung eingetragen werden:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ID  

Achtung!

Fremdquellen können Schäden am System hervorrufen. Eine genaue Prüfung des Schlüssels im Fall einer Änderung wird dringend geraten

Sämtliche Pakete neu installieren

Sind sehr viele Pakete in schlechtem Zustand, lohnt es sich eventuell, alle installierten Programme neu aus den Quellen herunterzuladen und zu installieren.

dpkg --get-selections | grep "\binstall" | awk '{print $1}' > /tmp/dpkg.log 

sucht alle installierten Pakete und speichert diese in der Datei /tmp/dpkg.log.

sudo xargs -n1 apt-get --reinstall install -y < /tmp/dpkg.log 

nimmt einen Eintrag aus /tmp/dpkg.log und installiert dieses Paket erneut.

Defekte Pakete reparieren

Wenn ein Paket, das nicht zur separaten Installation gedacht ist, eigentlich weitere Pakete benötigt oder in anderer Weise nicht in die bestehende Installation passt, werden bei der nächsten Verwendung von apt-get "kaputte Pakete" gemeldet. Diese muss man reparieren lassen. Der Befehl:

sudo apt-get -f install 

führt entweder zur Installation weiterer Pakete oder zur Entfernung des installierten Pakets. In letzterem Fall sollte man sich vergewissern, ob das Paket wirklich für Ubuntu geeignet ist.

Falls die defekten Pakete bekannt sind, kann auch folgender Befehl das Problem lösen:

sudo apt-get -f install PAKET1 [PAKET2] 

wobei PAKET1 bzw. PAKET2 usw. durch die Namen der bekannten defekten Pakete ersetzt wird.

Paketverwaltung unbrauchbar

Es kann vorkommen, dass die Paketverwaltung nicht mehr funktioniert und z.B. ein

sudo apt-get check 

mit folgender Fehlermeldung abbricht:

Segmentation faulty Tree

Dieser Missstand kann durch das Löschen der beiden Dateien /var/cache/apt/pkgcache.bin und /var/cache/apt/srcpkgcache.bin behoben werden.

Sollte die Paketverwaltung nach einem upgrade bzw. dist-upgrade unbrauchbar werden, so hilft einer der folgenden Befehle:

sudo apt-get upgrade -f 

oder

sudo apt-get dist-upgrade -f 

oder

sudo dpkg --configure -a 

Lock nicht aufrufbar

Manchmal gibt ein Paketmanager die Fehlermeldung

Konnte Lock nicht bekommen

aus. Grund ist meistens, dass bereits ein weiteres Tool zur Paketverwaltung im Hintergrund arbeitet. Dies kontrolliert man zuerst mit

sudo lsof /var/cache/apt/archives/lock 

um dann gegebenenfalls mit Shell/ps herauszufinden, welcher Prozess die Paketverwaltung blockiert. Warten auf das Terminieren des Prozesses löst das Problem meist. Sollte der Prozess hängen, kann er mit kill zum Beenden gezwungen werden. Sollte das Lock danach immer noch nicht freigegeben sein, kann man als letzte Möglichkeit den Lock (mit Rootrechten) [2] löschen. Nach dem Löschen muss ein neuer Lock angelegt werden, zum Beispiel mit dem Befehl touch.

Anzahl zu aktualisierender Pakete beim Konsolenlogin falsch

Durch einen Bug im Update Notifier wird manchmal die Meldung über zur Verfügung stehende Aktualisierungen in der Konsole und beim SSH-Login nicht auf den neuesten Stand gebracht. Das behebt folgender Ablauf:

sudo mv /etc/motd.tail /etc/motd.tail.backup
sudo touch /etc/motd.tail
sudo /usr/lib/update-notifier/update-motd-updates-available --force

Dabei wird zuerst die aktuelle Datei nach backup umbenannt, dann eine neue leere motd-Datei erstellt und anschließend der Update-Notifier zur Korrektur der Angabe gezwungen.

Paketlisten

Übersicht der installierten Pakete

Reine Informationsliste erzeugen

Um eine Liste zu erstellen, die alle installierten Pakete und deren Beschreibungen enthält, führt man den Befehl

COLUMNS=200 dpkg-query -l > packages.list 

aus. Die Paketliste befindet sich danach in der Datei packages.list.

Hinweis:

Diese Liste ist rein informativ und lässt sich nicht (bzw. nur schwer) zum Wiederherstellen nach einer Neuinstallation verwenden!

Paketliste zur Wiederherstellung erzeugen

Um z.B. einen zweiten Ubunturechner mit der gleichen Paketkonfiguration zu erstellen oder bei einer Neuinstallation des Systems schnell alle zuvor installierten Pakete zu übernehmen, kann man mit dem Befehl

dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > ~/packages.list 

eine Liste ~/packages.list zur Wiederherstellung der Pakete erzeugen.

Möchte man diese Liste zur Installation in einer Ubuntu-Neuinstallation verwenden, ist außerdem ein Sichern bzw. Kopieren der Paketquellen nötig, damit auch Pakete aus nachträglich hinzugefügten Quellen installiert werden können. Der folgende Befehl sichert diese Informationen in die Datei ~/sources.list.sav:

find /etc/apt/sources.list* -type f -name '*.list' -exec bash -c 'echo -e "\n## $1 ";grep -v -e ^# -e ^$ ${1}' _ {} \; > ~/sources.list.sav 

Das Ergebnis enthält eine kommentierte Liste aller eingetragenen Paketquellen.

Installation von Paketen aus einer Liste

Um später alle in dieser Liste gespeicherten Pakete zu installieren, gibt man folgenden Befehl ein:

xargs -a "packages.list" sudo apt-get install 

Vorher muss evtl. noch die zuvor gesicherte sources.list mit der aktuellen synchronisiert werden und eine Aktualisierung der Paketliste durchgeführt werden:

sudo apt-get update 

URL-Liste zu installierender Pakete

Die Option --print-uris von apt-get liefert eine URL für alle zu installierenden Pakete. Dies kann man auf einem Rechner mit schlechter oder fehlender Internetanbindung zur Erzeugung einer Liste benutzen, um diese Pakete dann mit einem anderen Rechner herunterzuladen. Der Befehl:

sudo apt-get -q -y --print-uris install PAKETNAME | grep ^\' | awk '{print $1}' | tr -d "'" > ~/wget.list 

schreibt die Adressen in eine Liste ~/wget.list. Der Inhalt dieser kann dann mittels wget heruntergeladen werden:

wget -i wget.list 

Wget steht auch für die Windows-Plattform zur Verfügung 🇬🇧, so dass man die Liste auch auf einem Windows-Rechner herunterladen kann. Anschließend können die so heruntergeladenen Pakete über die Paketverwaltung Synaptic oder mit dpkg installiert werden.

Verlaufslisten

Der folgende Befehl erzeugt eine Liste der in den letzten drei Tagen installierten Pakete:

find /var/lib/dpkg/info -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' | sort 

Einfacher ist jedoch die Auswertung der dpkg Logdateien.

grep 'install ' /var/log/dpkg.log 

Die Logdateien werden regelmäßig archiviert (/var/log/dpkg.log.NUMMER.gz). Liegt die Änderung also schon weiter zurück können diese Dateien durchsucht werden. Man muss die mit gzip komprimierten Dateien nicht erst entpacken, sondern benutzt einfach zgrep.

zgrep 'install ' /var/log/dpkg.log.2.gz 

Eine andere Möglichkeit ist die Erstellung eines eigenen apt-history-Befehls. Dieser beruht auf den Log-Dateien /var/log/dpkg.log und /var/log/dpkg.log.1. Dazu wird die Datei ~/.bashrc editiert und folgendes am Ende angefügt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function apt-history(){
      case "$1" in
        install)
              cat /var/log/{dpkg.log,dpkg.log.1} | grep 'install '
              ;;
        upgrade|remove)
              cat /var/log/{dpkg.log,dpkg.log.1} | grep $1
              ;;
        rollback)
              cat /var/log/{dpkg.log,dpkg.log.1} | grep upgrade | \
                  grep "$2" -A10000000 | \
                  grep "$3" -B10000000 | \
                  awk '{print $4"="$5}'
              ;;
        *)
              cat /var/log/{dpkg.log,dpkg.log.1}
              ;;
      esac
}

Quelle: apt-history 🇬🇧

Anschließend neu anmelden oder ein neues Terminalfenster öffnen, damit der Befehl verfügbar ist. Mit dem Befehl:

apt-history upgrade 

lassen sich nun beispielsweise die zuletzt aktualisierten Pakete inkl. Datum und Uhrzeit ermitteln. Andere Möglichkeiten sind install, remove oder rollback.