Ich versuche, eine Staging-Umgebung in einer VM einzurichten, um Updates zu testen, bevor ich sie auf mein Hauptsystem anwende.
Um dies zu tun, habe ich eine grundlegende Installation von Debian Wheezy (wie auf dem Hauptsystem) in der VM durchgeführt und dann als root von innerhalb der VM aus ausgeführt:
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] 'dpkg --get-selections | grep -v deinstall' |
dpkg --set-selections
Die i386-Architektur wird in meinem Fall leider benötigt; Das System ist AMD64-nativ.
Das Problem liegt bei dpkg --set-selections
in der VM ausführen. Ich habe einige Pakete, die eine besondere Behandlung erfordern (das sind eigentlich die Hauptgründe, warum ich überhaupt eine Staging-Umgebung möchte), aber wenn ich den letzten Befehl oben ausführe, erhalte ich ungefähr eine Unmenge an Ausgaben wie:
dpkg: warning: package not in database at line NNN: package-name
für Pakete, die eigentlich im Basissystem vorhanden sein sollten. Beispiele sind xterm
, yelp
und zip
.
Nun zu meiner Frage:
Wie sieht der spezifische Prozess zum Übertragen der Paketauswahlliste von einem Debian-System auf ein anderes aus (unter der Annahme des gleichen Debian-Release-Levels in Wheezy) und anschließend diese Änderungen anwenden? Das Ziel ist, dass beide dieselbe Liste installierter Pakete haben, idealerweise so, dass ein diff
durchgeführt wird zwischen den Ausgaben von dpkg --get-selections
oder dpkg --list
auf den beiden kommt zurück und zeigt keine Unterschiede.
Die grep -v deinstall
Teil ist entlehnt von Verhindern, dass Pakete entfernt werden, nachdem dpkg --set-selections
ausgeführt wurde drüben auf Ask Ubuntu.
Ich habe die Quelle in der VM so geändert, dass sie dieselbe wie auf dem Hauptsystem ist, und auch apt-transport-https
installiert :
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main
Wenn ich mir die Ausgabe von –set-selections anschaue, sehe ich:
dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...
Die Zeilennummern sahen seltsam aus, und der entsprechende Teil der Ausgabe von –get-selections ist:
a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install
Beachten Sie, dass zwischen acl
und aglfn
sind acpi-support-base
, acpid
und adduser
für die keine Fehler gemeldet werden . Es scheint, dass die Pakete, für die Fehler gemeldet werden, entweder un
sind gemäß dpkg -l
, oder dpkg -l
hat überhaupt keine Ahnung davon (dpkg-query: no packages found matching ...
). Ich weiß, dass es einige lokal installierte Pakete gibt, aber nicht viele. i386
erscheint erst gcc-4.7-base:i386 install
viel weiter unten in der Liste (Zeile 342 in der Ausgabe von –get-selections).
Akzeptierte Antwort:
Um eine Debian-Installation zu klonen, verwenden Sie apt-clone
Nützlichkeit. Es ist (als separates Paket, nicht Teil der Standardinstallation) in Debian seit Wheezy und in Ubuntu seit 12.04 verfügbar. Führen Sie auf dem vorhandenen Computer
apt-clone clone foo
Dadurch wird eine Datei foo.apt-clone.tar.gz
erstellt . Kopieren Sie es auf den Zielcomputer und führen Sie es aus
apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz
Wenn Sie mit einem alten System arbeiten, auf dem apt-clone
nicht verfügbar ist oder wenn Sie nur die Liste der installierten Pakete, aber keine Konfigurationsdatei replizieren möchten, finden Sie hier die manuellen Schritte.
-
Auf dem Quellcomputer:
cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list dpkg --get-selections >selections.list apt-mark showauto >auto.list
-
Auf dem Zielcomputer:
cp sources.list /etc/apt/ apt-get update /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/ dpkg --set-selections <selections.list apt-get dselect-upgrade xargs apt-mark auto <auto.list
Ich glaube, dass Sie von einer inkompatiblen Änderung in dpkg betroffen sind, die es zuerst in Wheezy geschafft hat. Siehe Fehler Nr. 703092 für Hintergrundinformationen.
Die Kurzgeschichte ist, dass dpkg --set-selections
akzeptiert jetzt nur Paketnamen, die in der Datei /var/lib/dpkg/status
vorhanden sind oder /var/lib/dpkg/available
. Wenn Sie APT nur zum Verwalten von Paketen verwenden, wie die meisten Leute, dann /var/lib/dpkg/available
wird nicht aktuell gehalten.
Nach dem Ausführen von apt-get update
und bevor Sie dpkg --set-selections
ausführen und apt-get -u dselect-upgrade
, führen Sie den folgenden Befehl aus:
apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail
Ab Jessie können Sie dies vereinfachen zu
apt-cache dumpavail | dpkg --merge-avail
Alternativ führen Sie
aus/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
oder noch einfacher
apt-get install dctrl-tools
sync-available
Eine weitere einfache Methode, bei der kein zusätzliches Paket installiert werden muss, sondern die Paketlisten erneut heruntergeladen werden, ist
dselect update
Weitere Informationen finden Sie in den häufig gestellten Fragen zu dpkg. (Dies wird in der dpkg-Manpage erwähnt, aber eher auf eine Weise, die Sie an das Problem erinnern würde, wenn Sie es bereits wüssten, nicht auf eine Weise, die erklärt, wie das Problem gelöst werden kann!)
Beachten Sie, dass das Klonen einer Paketinstallation mit dpkg --set-selections
stellt die automatische/manuelle Markierung in APT nicht wieder her. Weitere Einzelheiten finden Sie unter Wiederherstellen aller Daten und Abhängigkeiten von dpkg –set-selections ‘*’. Mit
apt-mark showauto >auto.list
und mit
auf dem Zielsystem wiederherstellenxargs apt-mark auto <auto.list