[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:sudo:Root-Rechte] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/Tango/dialog-information.png, 48, align=left)]] Diese Seite dient dazu, Tipps zum Umgang mit der Paketverwaltung [:APT:] zu bündeln. Dazu zählen auch die diversen Möglichkeiten, Paketlisten zu erstellen, die beim Umzug auf einen neuen Rechner oder bei der Installation mehrerer Rechner mit gleicher Software-Ausstattung nützlich sein können. = 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.list }}} aus. Die Paketliste befindet sich danach in der Datei '''packages_list.list'''. {{{#!vorlage Hinweis Diese Liste ist rein informativ und lässt sich nicht (d.h. nur schwer) zum Wiederherstellen nach einer Neuinstallation verwenden! }}} === Liste der händisch nachinstallierten Pakete === Um eine Liste zu erstellen, die nur die selbst installierten Pakete enthält, führt man folgenden Befehl aus: {{{#!vorlage Befehl comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u) > nachinstallierte_pakete.txt }}} === Paketliste zur Wiederherstellung erzeugen === {{{#!vorlage Hinweis Die im folgenden beschriebenen Befehle eignen sich nicht, um Programme bei einem [https://wiki.ubuntuusers.de/Upgrade Upgrade] auf eine neuere Version zu sichern. }}} Um z.B. einen zweiten Ubuntu-Rechner 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 '$2 == "install" {print $1}' > packages.list.save }}} eine Liste '''packages.list.save''' zur Wiederherstellung der Pakete erzeugen. Außerdem empfiehlt es sich, den erweiterten Paketstatus (automatisch oder manuell installiert) zu sichern (Dateien '''package-states-auto''' und '''package-states-manual'''): {{{#!vorlage Befehl apt-mark showauto > package-states-auto apt-mark showmanual > package-states-manual }}} Möchte man diese Liste zur Installation in einer Ubuntu-Neuinstallation verwenden, ist außerdem ein Sichern bzw. Kopieren der Paketquellen sowie das Exportieren der vertrauenswürdigen Signierungsschlüssel nötig, damit auch Pakete aus nachträglich hinzugefügten Quellen ohne Probleme installiert werden können. Der folgende Befehl sichert diese Informationen in die Datei '''sources.list.save''': {{{#!vorlage Befehl find /etc/apt/sources.list* -type f -name '*.list' -exec bash -c 'echo -e "\n## $1 ";grep "^[[:space:]]*[^#[:space:]]" ${1}' _ {} \; > sources.list.save }}} Das Ergebnis enthält eine kommentierte Liste aller eingetragenen Paketquellen. Folgender Befehl kopiert den Schlüsselbund fast aller manuell hinzugefügten vertrauenswürdigen Schlüssel in die Datei '''trusted-keys.gpg''': {{{#!vorlage Befehl sudo cp /etc/apt/trusted.gpg trusted-keys.gpg }}} Extra installierte Schlüsselbunde unter '''/etc/apt/trusted.gpg.d''' werden dabei nicht gesichert, sollten aber über die jeweiligen Pakete nachinstalliert werden. Man kann diese auch mit folgendem Befehl extra sichern: {{{#!vorlage Befehl sudo cp -R /etc/apt/trusted.gpg.d trusted.gpg.d.save }}} Wenn man Software über das Ubuntu-Software-Center erworben hat und diese mit der oben erstellten Paketliste mit installieren möchte, benötigt man noch die Datei auth.conf: {{{#!vorlage Befehl sudo cp /etc/apt/auth.conf auth.conf }}} === Installation von Paketen aus einer Liste === Nachdem die [:sources.list:] synchronisiert wurde, sollten die Paketlisten aktualisiert werden (siehe auch [https://forum.ubuntuusers.de/topic/wie-sources-list-synchronisieren/#post-6250277 hier]). Ein zuvor gesicherter Schlüsselbund sollte ebenfalls vorher importiert werden: {{{#!vorlage Befehl sudo apt-key add trusted-keys.gpg # Schlüsselbund importieren sudo apt-get update }}} Um alle auf der Liste gespeicherten Pakete zu installieren, gibt man folgenden Befehl ein: {{{#!vorlage Befehl xargs -a "packages.list.save" sudo apt-get install }}} Wurden die erweiterten Paketstatus gesichert, können die Statuslisten für das neue System eingelesen werden: {{{#!vorlage Befehl xargs -a "package-states-auto" sudo apt-mark auto xargs -a "package-states-manual" sudo apt-mark manual }}} Der zweite Befehl kann auch ausgelassen werden, da die über die Paketliste nachinstallierten Pakete automatisch als "manuell installiert" gekennzeichnet wurden. [[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 Internetanbindung zur Erzeugung einer Liste benutzen, um diese Pakete dann auf 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 {{{#!vorlage Befehl wget -i wget.list }}} heruntergeladen werden. 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 [:Synaptic#Heruntergeladene-Pakete-einbinden:Synaptic]-Paketverwaltung oder mit [:Paketinstallation_DEB#Terminal:dpkg] installiert werden. == Verlaufslisten == Eine Liste der in der letzten Zeit installierten Pakete kann durch Auswerten der dpkg-Log-Dateien mit [:grep:] ausgegeben werden: {{{#!vorlage Befehl grep 'install ' /var/log/dpkg.log }}} Diese Log-Dateien werden regelmäßig durch [:Logdateien#Logrotate:logrotate] archiviert ('''/var/log/dpkg.log.NUMMER.gz'''). Liegt die Änderung also schon weiter zurück, können diese Dateien durchsucht werden. Man braucht die mit [:gzip:] komprimierten Dateien nicht erst zu entpacken, sondern benutzt einfach [:gzip#Programme-fuer-gepackte-Archive:zgrep]: {{{#!vorlage Befehl zgrep 'install ' /var/log/dpkg.log.NUMMER.gz }}} Alternativ kann mit [:find:] eine Liste, der in den letzten drei Tagen installierten Pakete, angezeigt werden: {{{#!vorlage Befehl find /var/lib/dpkg/info -name \*.list -mtime -3 | sed 's#.list$##;s#.*/##' | sort }}} === apt-history === Eine andere Möglichkeit ist die Erstellung eines eigenen Befehls `apt-history`. 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 } }}} Anschließend neu einloggen (oder ein neues Terminalfenster öffnen), damit der Befehl verfügbar ist. Mittels {{{#!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``. = Konfigurationsdateien von deinstallierten Paketen entfernen = Deinstalliert man Pakete nur mit dem [:apt/apt-get#apt-get-remove:remove]-Befehl, werden nicht die Konfigurationsdateien unter '''/etc''' entfernt. Um dies manuell für alle nicht vollständig deinstallierten Pakete nachzuholen, kann die folgende Befehlssequenz genutzt werden: {{{#!vorlage Befehl sudo -i dpkg -l | grep '^rc ' | cut -d" " -f3 | xargs dpkg --purge exit }}} Sollten keine zurückgebliebenen Konfigurationsdateien vorhanden sind, erhält man stattdessen die Fehlermeldung `dpkg: Fehler: --purge benötigt mindestens ein Paketnamen-Argument`. = Sonstiges = == Anzahl zu aktualisierender Pakete beim Anmelden an der Konsole 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: {{{#!vorlage Befehl 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 '''motd.tail.backup''' umbenannt, dann eine neue leere Datei '''motd.tail''' erstellt und anschließend der Update-Notifier zur Korrektur der Angabe gezwungen. == Paketlisten selektiv aktualisieren == Paketlisten können mit entsprechender Option dateiweise oder ordnerweise aktualisiert werden. Dazu werden die Pfade für die normale [:sources.list:] und für das Quellenlistenverzeichnis (standardmäßig '''/etc/apt/sources.list.d''') angepasst und außerdem das automatische Entfernen nicht benötigter Listendateien deaktiviert. Möchte man z.B. nur die Quellen in der Datei '''/etc/apt/sources.list.d/lokalequellen.list''' aktualisieren, so wird das Quellenlistenverzeichnis auf '''/dev/null''' gesetzt: {{{#!vorlage Befehl sudo apt-get -o APT::List-Cleanup=0 -o Dir::Etc::sourceparts="/dev/null" -o Dir::Etc::sourceslist="/etc/apt/sources.list.d/lokalequellen.list" }}} Soll nur die Standardquellenlistendatei aktualisiert werden, kann die letzte Option auch weggelassen werden (anstatt manuell "`-o Dir::Etc::sourceslist="/etc/apt/sources.list"`" zu nutzen). Entsprechend können manuell genau ein Verzeichnis und/oder eine Datei jeweils angegeben oder die Standardeinstellung deaktiviert werden. Diese Optionen können analog mit [:aptitude:] verwendet werden. = Links = * [:Paketverwaltung/Problembehebung:] * [:APT:] {Übersicht} Übersichtsartikel #tag: System, Shell, Installation, Paketverwaltung