34.1. Die bestehende Paketkonfiguration auslesen

Zunächst betrachten wir, wie Sie die Liste der installierten Pakete auslesen und sichern. Das ist Voraussetzung dafür, um später alle diese Pakete wieder einspielen zu können — sei es auf dem gleichen System oder einem neuen Rechner, welcher identisch zum erstgenannten werden muss. Alle benötigten Informationen dazu stehen in der Debconf-Datenbank.

34.1.1. Mit dpkg

Wie wir bereits in Abschnitt 8.5, „Liste der installierten Pakete anzeigen und deuten“ erklärt haben, ist dpkg das zentrale Werkzeug, um die Paketdatenbank auszulesen und Ihnen die derzeit installierten und vollständig konfigurierten Pakete auf der Standardausgabe (stdout) aufzulisten. Über das nachfolgend gezeigte Kommando erhalten Sie eine entsprechende Liste mit den Namen der Pakete.

Liste der installierten Pakete namentlich sortiert in einer Datei ablegen (Version 1). 

$ dpkg -l | egrep "^ii" | awk ' { print $2 } ' | sort > paketliste
$

Das Werkzeug egrep filtert zunächst nur die Zeilen aus der Ausgabe von dpkg heraus, die mit ii beginnen — sprich: die installierten und vollständig konfigurierten Pakete. Die zusätzlichen informationen wie Installationsstatus, Kurzbeschreibung und die Version des jeweiligen Pakets werden dann mit Hilfe von awk aus jeder verbliebenen Zeile herausgefiltert. Anschließend sortieren wir die Liste der Paketnamen mit Hilfe von sort noch alphabetisch aufsteigend. Die Ausgabe des Kommandos landet in der Datei paketliste im aktuellen Verzeichnis:

Um den Aufwand etwas zu verringern, ist der Schalter --get-selections von dpkg nützlich. Dieser sorgt dafür, daß dpkg nur den Namen und den Installationsstatus eines Pakets ausgibt. Kombiniert mit grep, awk und einem abschließenden sort bauen Sie sich daraus eine sortierte Liste wie folgt:

Liste der installierten Pakete namentlich sortiert in einer Datei ablegen (Version 2). 

$ dpkg --get-selections | grep -v deinstall | awk ' { print $1 } ' | sort > paketliste
$

Bitte beachten Sie, daß dpkg lediglich die Namen der Pakete ermittelt. Sofern der Aufruf auf einem Multiarch-System erfolgt, fügt dpkg in bestimmten Fällen noch die Architektur hinzu, zu der das Paket gehört. Sämtliche Konfiguration bleibt hingegen unbeachtet.

Mit dpkg ermittelte Liste der installierten Pakete (Ausschnitt). 

$ cat paketliste
aapt
acl
acpi
adduser
adwaita-icon-theme
alsa-base
alsa-utils
binutils
binutils-common:amd64
...
$

Diese soeben erzeugten Liste nutzen Sie als Referenz, um nun andere Systeme identisch aufzusetzen. Wie das geht, lesen Sie in Abschnitt 34.2.1, „Mit apt-get nach.

34.1.2. Mit apt

Die nachfolgende Kombination aus apt, awk, sed, tail und sort liefert Ihnen ebenfalls eine Liste der installierten Pakete in alphabetisch aufsteigender Sortierung ähnlich zur Liste aus Abschnitt 34.1.1, „Mit dpkg. Jedoch ist hier noch ein kleines Hindernisse zu umschiffen: das Ausgabeformat von apt ist anders — die Architektur eines Paketes wird stets in einer zusätzlichen Spalte benannt. Daher werden zunächst die erste und vierte Spalte zusammengezogen und danach die Angabe der Architektur all mittels sed entfernt. Der Aufruf von tail gibt alle Zeilen ab der zweiten Zeile aus, sort sortiert abschließend.

apt zur Erstellung der Paketliste benutzen. 

$ apt list --installed | awk -F '[/ ]' '{ print $1":"$4 }' | sed -e 's/:all$//' | tail -n +2 | sort > paketliste
$

Mit apt ermittelte Liste der installierten Pakete (Ausschnitt). 

$ cat paketliste
acl:amd64
adduser
adwaita-icon-theme
aglfn
alsa-oss:amd64
alsa-topology-conf
alsa-ucm-conf
alsa-utils:amd64
alsamixergui:amd64
alsaplayer-alsa:amd64
alsaplayer-common:amd64
binutils-common:amd64
binutils-x86-64-linux-gnu:amd64
binutils:amd64
...
$

Bitte beachten Sie, daß apt nur die Namen der Pakete ermittelt. Sämtliche Konfiguration bleibt ebenfalls unbeachtet. Diese soeben erzeugten Liste nutzen Sie als Referenz, um nun andere Systeme identisch aufzusetzen. Wie das geht, lesen Sie in Abschnitt 34.2.1, „Mit apt-get nach.

34.1.3. Mit debconf-get-selections

Das Werkzeug debconf-get-selections aus dem Paket debconf-utils [Debian-Paket-debconf-utils] erzeugt eine Liste der Pakete, die installiert sind und für die eine weitere Konfiguration durch APT bei der Installation des Paketes notwendig ist. Das Verfahren kommt im Rahmen des sogenannten preseeding zum Einsatz, auf Deutsch mit Vorbelegen von Konfigurationswerten übersetzbar.

Die Ausgabe von debconf-get-selections umfaßt den Paketnamen und dessen Konfiguration, sprich: die Fragen plus die Antworten, aus denen Sie bei der Installation des Paketes durch APT wählen können sowie ihre tatsächliche Antwort. Der nachfolgende Ausschnitt zeigt das für das Paket cups:

Die Ausgabe von debconf-get-selections

...
# Backends für die Kommunikation mit dem Drucker:
# Choices: lpd, Socket, USB, SNMP, dnssd
cups    cupsys/backend  multiselect     lpd, socket, usb, snmp, dnssd
...

Abbildung 34.1, „Fragen zum Paket cups zeigt den dazugehörigen Konfigurationsdialog, den Sie auch stets mit Hilfe von dpkg-reconfigure cups erreichen können.

Abbildung 34.1. Fragen zum Paket cups

praxis/paketkonfiguration-sichern/dpkg-reconfigure-cups.png

Die Ausgabe von debconf-get-selections erfolgt auf der Standardausgabe (stdout). Eine Liste in einer Ausgabedatei namens paketliste mit den Paketnamen in sortierter Reihenfolge erzeugen Sie mit Hilfe der Kombination aus den fünf Werkzeugen debconf-get-selection, grep, awk, sort und uniq wie folgt:

Auslesen der bestehenden Paketkonfiguration aus der Debconf-Datenbank. 

# debconf-get-selections | grep -v "^#" | awk ' { print $1 } ' | sort | uniq > paketliste
#

Die ermittelte Liste sieht dann wie folgt aus:

Mit debconf-get-selections ermittelte Liste der installierten Pakete (Ausschnitt). 

# cat paketliste
apparmor
base-passwd
ca-certificates
console-setup
...
#

In Abschnitt 34.2.2, „Mit debconf-set-selections lesen Sie nach, wie Sie die erzeugte Liste benutzen, um die darin genannten Pakete auf einem anderen System wieder einzuspielen.

34.1.4. Mit apt-clone

Dieses Werkzeug steht über die gleichnamigen Pakete bis Debian 11 Bullseye und Ubuntu bereit (siehe [Debian-Paket-apt-clone] und [Ubuntu-Paket-apt-clone]). Es sieht sich selbst als helper script, welches das Klonen einer bestehenden Linuxinstallation vereinfacht.

Das Debian- bzw. Ubuntupaket beinhaltet das Python-Skript apt-clone sowie eine passende, gleichnamige Python-Klasse für Python 3. Intern ruft es das Werkzeug dpkg-repack [Debian-Paket-dpkg-repack] auf, welches aus den bereits installierten Dateien wieder Binärpakete erstellt, sofern das möglich ist.

Es stellt beim Aufruf nach Möglichkeit auf dem Bestandssystem so viele Informationen zur zu klonenden Installation zusammen, wie möglich sind. Das umfasst:

  • die Paketquellen über die Datei /etc/apt/sources.list
  • die Paketquellen über das komplette Verzeichnis /etc/apt/sources.list.d samt Inhalt
  • die hinterlegten Voreinstellungen über das Verzeichnis /etc/apt/preferences.d/
  • den Debian-Schlüsselring mit den darin hinterlegten GPG-Schlüsseln für die verwendeten Paketquellen unter /etc/apt/trusted.gpg und dem Verzeichnis /etc/apt/trusted.gpg.d
  • den Paketstatus aus der Paketdatenbank
  • die zusätzlichen Pakete, d.h. Pakete, die nicht über die hinterlegten Paketquellen installiert wurden. Dazu legt es im Archiv ein Verzeichnis /var/lib/apt-clone/debs an.
  • die Pakete, die nicht mehr von den Paketquellen heruntergeladen werden können. Diese landen ebenfalls unter /var/lib/apt-clone/debs im Archiv. Dazu bedient sich apt-clone des Werkzeugs dpkg-repack [Debian-Paket-dpkg-repack]. Im nachfolgenden Beispiel sehen Sie, dass das nicht immer sauber gelingt und auch zu Paketen führen kann, die defekt sind (broken) — d.h. unvollständige Abhängigkeiten besitzen — und nicht ohne weiteres wiedereinspielbar sind.

Bevor Sie apt-clone clone ausführen, legen Sie ein (lokales) Verzeichnis fest, in dem das Archiv abgelegt werden soll. Im nachfolgenden Beispiel heißt das lokale Verzeichnis schlicht und einfach packagelist. Ergebnis des Aufrufs von apt-clone ist ein Archiv im Format tar.gz, welches Sie auf dem Zielsystem wieder mit Hilfe von apt-clone einspielen (siehe Abschnitt 34.2.3, „Mit apt-clone).

apt-clone liest alle installierten Pakete auf dem Ursprungsrechner ein. Möchten Sie ebenfalls alle zusätzlichen, manuell installierten Pakete mit erfassen, geben Sie beim Aufruf den Schalter --with-dpkg-repack mit an.

apt-clone sammelt Informationen. 

# apt-clone clone --with-dpkg-repack packagelist/.
dpkg-deb: building package 'sge' in './sge_8.1.8_amd64.deb'.
dpkg-deb: building package 'libnccl2' in './libnccl2_2.3.5-2+cuda10.0_amd64.deb'.
dpkg-repack: warning: unknown information field 'Original-Maintainer' in input data in entry in dpkg's status file
dpkg-deb: building package 'lesstif2' in './lesstif2_0.95.2-1_amd64.deb'.
dpkg-repack: warning: unknown information field 'Original-Maintainer' in input data in entry in dpkg's status file
dpkg-deb: building package 'libcudnn7' in './libcudnn7_7.3.1.20-1+cuda10.0_amd64.deb'.
dpkg-deb: building package 'libcudnn7-dev' in './libcudnn7-dev_7.3.1.20-1+cuda10.0_amd64.deb'.
dpkg-deb: error: conffile '/opt/sge/util/install_modules/inst_template.conf' does not appear in package
dpkg-repack: Error running: dpkg-deb --build dpkg-repack.sge-common.3EAu1a .
dpkg-repack: Problems were encountered in processing.
dpkg-repack: The package may be broken.
not installable: sge, libnccl2, lesstif2, libdb5.1, libcudnn7, libcudnn7-dev, sge-common, cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48, libnccl-dev, libxp6, db5.1-util, libdb5.1++
version mismatch: libssl1.1, mdadm, python3-distutils, libitm1, libmagic-mgc, samba-libs, lxd-client, wget, postfix, cpp,
...
#

Das Archiv wird im vorgenannten Verzeichnis erzeugt. Der Name des Archivs setzt sich aus apt-clone-state- und dem Hostnamen zusammen, also bspw. apt-clone-state-kiste.tar.gz für den Computer mit dem Hostnamen kiste. Mit dem Schalter info analysieren Sie das soeben erzeugte Archiv. Nachfolgendes Listing stammt von einem Archiv für ein Ubuntu 18 Bionic, welcher den Rechnernamen kiste trägt:

Informationen zum erzeugten apt-clone-Archiv anzeigen. 

$ apt-clone info apt-clone-state-kiste.tar.gz
Hostname: kiste
Arch: amd64
Distro: bionic
Meta:
Installed: 1301 pkgs (751 automatic)
Date: Tue Oct 15 14:55:03 2019
$

Bitte beachten Sie bei der Verwendung von apt-clone noch die folgenden Punkte:

  • Das Zielsystem muss das gleiche Betriebssystem und die gleiche Veröffentlichung wie das Originalsystem besitzen.
  • apt-clone gleicht den Paketbestand des Originalsystems mit den Paketquellen ab. Es merkt an, wenn installierte Pakete nicht mehr aktuell sind und im Paketmirror bereits eine neuere Version vorliegt. Um das o.g. erzeugte Archiv möglichst klein zu halten, aktualisieren Sie das Originalsystem vor dem Aufruf von apt-clone, sofern das möglich und auch praktikabel ist (siehe Abschnitt 8.41, „Pakete aktualisieren“) und dem Vorgehen nichts entgegenspricht.
  • Räumen Sie ihr Originalsystem vor dem Klonen auf. Entfernen Sie nicht mehr benötigte Software und auch verwaiste Pakete, bspw. über das Kommando apt-get autoremove (siehe Abschnitt 8.44, „Umgang mit Waisen“).
  • apt-clone benachrichtigt Sie, wenn Dateien vorliegen, die nicht im Originalpaket enthalten sind, bspw. Konfigurationsdateien. Es ist so angelegt, dass es bestehende, geänderte Dateien übernimmt und somit eine exakte Kopie des Zustands des installierten Pakets erzeugt.
  • apt-clone gibt am Ende eine Liste der Pakete aus, die es für nicht installierbar hält.
  • Führen Sie apt-clone später auf dem Zielsystem aus, überschreibt es ihre bereits bestehende Paketliste. Es löscht Pakete bzw. installiert fehlende nach (siehe Abschnitt 34.2.3, „Mit apt-clone).