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.
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.
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.
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.
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.
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:
/etc/apt/sources.list
/etc/apt/sources.list.d
samt Inhalt
/etc/apt/preferences.d/
/etc/apt/trusted.gpg
und dem Verzeichnis
/etc/apt/trusted.gpg.d
/var/lib/apt-clone/debs
an.
/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:
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.40, „Pakete aktualisieren“) und dem Vorgehen nichts entgegenspricht.
apt-get autoremove
(siehe Abschnitt 8.43, „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.
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
“).