Wie repliziere ich die installierte Paketauswahl von einem Debian-System auf ein anderes? (Debian Wheezy)

19

Ich versuche, eine Staging-Umgebung in einer VM einzurichten, um Updates zu testen, bevor sie auf mein Hauptsystem angewendet werden.

Zu diesem Zweck habe ich eine Basisinstallation von Debian Wheezy (wie auf dem Hauptsystem) in der VM durchgeführt und bin dann als root von der VM aus gelaufen:

# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh me@main-system 'dpkg --get-selections | grep -v deinstall' | \
  dpkg --set-selections

Die i386 Architektur wird in meinem Fall leider benötigt; das system ist amd64 native.

Das Problem liegt beim dpkg --set-selectionsAusführen in der VM. Ich habe einige Pakete, die eine spezielle Behandlung erfordern (das ist eigentlich der Hauptgrund, warum ich überhaupt eine Staging-Umgebung haben möchte), aber wenn ich den letzten obigen Befehl ausführe, erhalte ich ungefähr eine Unmenge von Ausgabezeilen 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, yelpund zip.

Nun zu meiner Frage:

Was ist der genaue Vorgang, um die Paketauswahlliste von einem Debian-System auf ein anderes zu übertragen (bei gleichem Debian-Release-Stand in Wheezy) und diese Änderungen anschließend anzuwenden? Das Ziel ist, dass beide die gleiche Liste der installierten Pakete haben, idealerweise so, dass das Ausführen eines diffzwischen den Ausgaben von dpkg --get-selectionsoder dpkg --listauf den beiden zurückkommt und keine Unterschiede zeigt.

Der grep -v deinstallTeil wurde von Prevent-Paketendpkg --set-selections entlehnt , die nach dem Ausführen von Ask Ubuntu entfernt wurden.

Ich habe die Quelle in der VM so geändert, dass sie mit der auf dem Hauptsystem übereinstimmt, und Folgendes installiert apt-transport-https:

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 ansehe, 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 ungerade 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 in zwischen aclund aglfnsind acpi-support-base, acpidund adduser für die keine Fehler gemeldet werden . Es scheint, dass die Pakete, für die Fehler gemeldet werden, entweder den unAngaben entsprechen dpkg -loder dpkg -lüberhaupt keine Ahnung davon haben ( dpkg-query: no packages found matching ...). Ich weiß, dass es einige lokal installierte Pakete gibt, aber nicht viele. i386nicht Figur , bis gcc-4.7-base:i386 install viel weiter unten in der Liste (Linie 342 in der --get-Auswahlausgabe).

ein CVn
quelle
dpkg --get-selections … | … dpkg --set-selectionsist der Weg, um die Paketauswahl zu replizieren. Wenn es für Sie fehlschlägt, müssen Sie weitere Informationen darüber bereitstellen, warum. Veröffentlichen Sie Ihren vollständigen Quellensatz auf beiden Systemen, die Ausgabe von dpkg --get-selectionsund das vollständige Transkript von dpkg --get-selections(vielleicht können wir ein Muster erkennen, indem wir sehen, was funktioniert und was nicht). Ist das Hauptsystem amd64 oder i386? Funktioniert es, wenn Sie die i386-Architektur nicht hinzufügen?
Gilles 'SO- hör auf böse zu sein'
@Gilles Muss es wirklich die vollständige Ausgabe von sein dpkg --get-selections(und ich nehme an, Sie meinten das dpkg --set-selectionsTranskript?)? Sogar nur der erstere hat mehr als 3.600 Zeilen und ungefähr 100 KB.
ein Lebenslauf vom
Sie müssen genügend Beiträge veröffentlichen, damit wir das Muster erkennen können, bei dem Pakete Fehler auslösen und bei denen dies nicht der Fall ist (es sei denn, Sie können dies selbst herausfinden). Eine Kopie von /var/lib/dpkg/Packages(die noch länger ist) könnte ebenfalls nützlich sein - dies könnte ein Symptom für eine beschädigte Paketdatei sein.
Gilles 'SO- hör auf böse zu sein'
@ Gilles Interessanter Punkt. Ich hatte die Möglichkeit nicht wirklich in Betracht gezogen, aber ich benutze verschiedene Spiegel für diese. Lassen Sie mich sehen, ob es immer noch passiert, wenn ich die VM auf denselben Debian-Spiegel zeige. Bereithalten.
ein Lebenslauf vom
@Gilles Das hat eigentlich keinen Unterschied gemacht, aber ich habe etwas anderes gefunden. Siehe die aktualisierte Frage.
ein

Antworten:

17

Verwenden Sie das apt-cloneDienstprogramm , um eine Debian-Installation zu klonen . Es ist in Debian seit wheezy und in Ubuntu seit 12.04 verfügbar (als separates Paket, nicht Teil der Standardinstallation). Führen Sie auf dem vorhandenen Computer aus

apt-clone clone foo

Dadurch wird eine Datei erstellt foo.apt-clone.tar.gz. 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-clonees nicht verfügbar ist, oder wenn Sie nur die Liste der installierten Pakete, aber keine Konfigurationsdatei replizieren möchten, führen Sie die folgenden manuellen Schritte aus.

  • 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 zu Keuchen brachte. Siehe Fehler # 703092 für den Hintergrund.

Die Kurzgeschichte ist, dass dpkg --set-selectionsjetzt nur Paketnamen akzeptiert werden, die in der Datei /var/lib/dpkg/statusoder vorhanden sind /var/lib/dpkg/available. Wenn Sie APT nur zum Verwalten von Paketen verwenden, wie die meisten Leute, /var/lib/dpkg/availablewird dies nicht auf dem neuesten Stand gehalten.

Führen Sie nach dem Ausführen apt-get updateund vor dem Ausführen von dpkg --set-selectionsund apt-get -u dselect-upgradeden folgenden Befehl aus:

apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail

Ab Jessie können Sie dies vereinfachen

apt-cache dumpavail | dpkg --merge-avail

Alternativ können Sie auch ausführen

/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 Manpage von dpkg erwähnt, aber eher auf eine Weise, die Sie an das Problem erinnert, wenn Sie es bereits gewusst haben, und nicht auf eine Weise, die erklärt, wie Sie das Problem lösen können!)

Beachten Sie, dass das Klonen einer Paketinstallation mit dpkg --set-selectionsnicht die automatische / manuelle Markierung in APT wiederherstellt. Weitere Informationen finden Sie unter Wiederherstellen aller Daten und Abhängigkeiten aus dpkg --set-selections '*' . Mit können Sie die Markierungen im Quellsystem speichern

apt-mark showauto >auto.list

und stellen Sie sie auf dem Zielsystem mit wieder her

xargs apt-mark auto <auto.list
Gilles 'SO - hör auf böse zu sein'
quelle
3
Dieses Problem sollte viel offensichtlicher sein als es ist. Ich kann nicht glauben, dass ich noch nie davon gehört habe!
Faheem Mitha
Interessant. Ich werde es versuchen. Vielen Dank!
ein Lebenslauf vom
@FaheemMitha Ja, ich bin überrascht, dass ich heute noch nie davon gehört habe. Ich kann nicht glauben, dass ich dpkg --set-selectionsseit dem Pre-Wheezy nichts mehr benutzt habe !
Gilles 'SO - hör auf böse zu sein'
Okay, das gab eine sehr viel kürzere Liste von Warnungen aus --set-selections. Wie wende ich die Änderungen an? Sogar apt-get -u dist-upgradeerwähnt nur eine Handvoll Pakete (alle ZFS-bezogen), von denen Hunderte, wenn nicht Tausende betroffen sein sollten.
ein Lebenslauf vom
@ MichaelKjörling Das istapt-get -u dselect-upgrade
Gilles 'SO - hör auf böse zu sein'
0

Wie ich es gemacht habe

  1. Auf Quelle host:

    apt-get update && apt-get dist-upgrade
    dpkg --get-selection >/tmp/source.sel
    cat /etc/apt/sources.list
    

    Pflege, /etc/apt/sources.list.dwenn verwendet ...

    Kopieren Sie dann die source.selDatei auf den Zielhost.

  2. Am Ziel - Host:

    vi /etc/apt/sources.list 
    

    passe sources.list auch mit unterschiedlichen spiegeln an, aber gleiche komponentenliste .

    apt-get update
    dselect upgrade
    dpkg --set-selection </tmp/source.sel
    dselect install
    

    Und jetzt installiert mein Zielhost gerade eine Menge Dinge. Dann könnte ich mir etwas Zeit nehmen, um dies zu veröffentlichen.

Techno
quelle
Vielleicht sollte 'dselect upgrade' 'dselect update' in der obigen Beschreibung 'How I Do It' sein.
Jonathan Kimmitt