34.1. Die bestehende Paketkonfiguration auslesen

Zunächst gehen wir der Frage nach, wie Sie die bestehende Konfiguration ihrer installierten Pakete auslesen und sichern. Das nutzen Sie in einem späteren Schritt, um 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 bereits in Abschnitt 8.5, „Liste der installierten Pakete anzeigen und deuten“ erklärt, 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.

egrep filtert zunächst nur die Zeilen aus der Ausgabe von dpkg heraus, die mit ii beginnen — sprich: die installierten und 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 wird die Liste der Paketnamen mit Hilfe von sort noch alphabetisch aufsteigend sortiert. Die Ausgabe des Kommandos landet in der Datei paketliste im aktuellen Verzeichnis:

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

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

Um den Aufwand zu verringern, ist der Schalter --get-selections spannend. Dieser sorgt dafür, daß dpkg nur den Paketnamen samt Installationsstatus ausgibt. Kombiniert mit grep und awk 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 } ' > paketliste
$

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 Kombination aus apt, awk und tail liefert Ihnen ebenfalls eine Liste der installierten Pakete in alphabetisch aufsteigender Sortierung:

apt zur Erstellung der Paketliste benutzen. 

# apt list --installed | awk -F "/" ' { print $1 } ' | tail -n +2 > paketliste
# cat paketliste
aapt
acl
acpi
adduser
adwaita-icon-theme
alsa-base
alsa-utils
anacron
android-framework-res
...
#

Bitte beachten Sie, daß apt nur die Namen der Pakete ermittelt. Sämtliche Konfiguration bleibt unbeachtet.

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 Datei paketliste, die lediglich die Paketnamen in sortierter Reihenfolge enthält, 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
$

In Abschnitt 34.2.2, „Mit debconf-set-selections lesen Sie, 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 bei Debian 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).