[[Vorlage(Archiviert, "Artikel wurde mit [:Paketverwaltung/Problembehebung:] zusammengeführt und Teile nach [:Paketverwaltung/Tipps:] ausgelagert.")]] ##[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:sudo:Root-Rechte] }}} [[Inhaltsverzeichnis(1)]] 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/apt-key:apt-key] in den Keyring der Paketverwaltung eingetragen werden: {{{#!vorlage Befehl sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ID }}} {{{#!vorlage warnung [: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. {{{#!vorlage Befehl dpkg --get-selections | grep "\binstall" | awk '{print $1}' > /tmp/dpkg.log }}} sucht alle installierten Pakete und speichert diese in der Datei '''/tmp/dpkg.log'''. {{{#!vorlage Befehl 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: {{{#!vorlage 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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: {{{#!vorlage Befehl sudo apt-get upgrade -f }}} oder {{{#!vorlage Befehl sudo apt-get dist-upgrade -f }}} oder {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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 [:Shell/kill:kill] zum Beenden gezwungen werden. Sollte das Lock danach immer noch nicht freigegeben sein, kann man als letzte Möglichkeit den Lock (mit [:sudo: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 {{{#!vorlage Befehl COLUMNS=200 dpkg-query -l > packages.list }}} aus. Die Paketliste befindet sich danach in der Datei '''packages.list'''. {{{#!vorlage 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 {{{#!vorlage 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''': {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl sudo apt-get update }}} [[Anker(urlliste)]] == 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: {{{#!vorlage 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: {{{#!vorlage Befehl wget -i wget.list }}} Wget steht auch für die Windows-Plattform zur [http://gnuwin32.sourceforge.net/packages/wget.htm Verfügung] {en}, so dass man die Liste auch auf einem Windows-Rechner herunterladen kann. Anschließend können die so heruntergeladenen Pakete über die Paketverwaltung [:Synaptic#Heruntergeladene-Pakete-einbinden:Synaptic] oder mit [:Paketinstallation_DEB#Terminal:dpkg] installiert werden. == Verlaufslisten == Der folgende Befehl erzeugt eine Liste der in den letzten drei Tagen installierten Pakete: {{{#!vorlage Befehl find /var/lib/dpkg/info -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' | sort }}} Einfacher ist jedoch die Auswertung der dpkg Logdateien. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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: {{{#!code bash 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: [http://redclay.altervista.org/wiki/doku.php?id=projects:old-projects&s=apt apt-history] {en} Anschließend neu anmelden oder ein neues Terminalfenster öffnen, damit der Befehl verfügbar ist. Mit dem Befehl: {{{#!vorlage 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``. = Links = * [:APT:] {Übersicht} Übersichtsartikel * [:Paketverwaltung/Problembehebung:] # tag: System, Shell, Installation, Server, Paketverwaltung