Apt/Paketliste

Aus Foxwiki

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.list 

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

Hinweis

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

Paketliste zur Wiederherstellung erzeugen

Um z.B. einen zweiten 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

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

eine Liste packages.list 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):

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.sav:

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 aller manuell hinzugefügten vertrauenswürdigen Schlüssel in die Datei trusted-keys.gpg:

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.

Installation von Paketen aus einer Liste

Nachdem die sources.list synchronisiert wurde, sollten die Paketlisten aktualisiert werden. Ein zuvor gesicherter Schlüsselbund sollte ebenfalls vorher importiert werden:

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:

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

Wurden die erweiterten Paketstatus gesichert, können die Statuslisten für das neue System eingelesen werden:

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.

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

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

wget -i wget.list 

heruntergeladen werden. 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 Synaptic-Paketverwaltung oder mit dpkg installiert werden.

Verlaufslisten

Eine Liste der in der letzten Zeit installierten Pakete kann durch Auswerten der dpkg-Log-Dateien mit grep ausgegeben werden:

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

Diese Log-Dateien werden regelmäßig durch 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 zgrep:

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

Alternativ kann mit find eine Liste, der in den letzten drei Tagen installierten Pakete, angezeigt werden:

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:

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

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 entfernen

Deinstalliert man Pakete nur mit dem remove-Befehl, werden nich die Konfigurationsdateien unter /etc entfernt.

Um dies manuell für alle nicht vollständig deinstallierten Pakete nachzuholen, kann folgender Befehl genutzt werden:

dpkg -l | grep '^rc ' | cut -d" " -f3 | xargs dpkg --purge 

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:

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.