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.
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.
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.
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 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.
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:
/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.41, „Pakete aktualisieren“) und dem Vorgehen nichts entgegenspricht.
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.
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
“).