Sto provando a configurare un ambiente di staging in una VM, per testare gli aggiornamenti prima di applicarli al mio sistema principale.
Per fare ciò, ho eseguito un'installazione di base di Debian Wheezy (come sul sistema principale) nella VM, quindi ho eseguito come root dall'interno della VM:
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] 'dpkg --get-selections | grep -v deinstall' |
dpkg --set-selections
L'architettura i386 è purtroppo necessaria nel mio caso; il sistema è nativo per amd64.
Il problema è con dpkg --set-selections
eseguire nella VM. Ho alcuni pacchetti che richiedono una gestione speciale (questi sono in realtà il motivo principale per cui voglio un ambiente di staging in primo luogo) ma quando eseguo l'ultimo comando sopra, ottengo circa un miliardo di righe di output come:
dpkg: warning: package not in database at line NNN: package-name
per i pacchetti che dovrebbero essere realmente disponibili nel sistema di base. Gli esempi includono xterm
, yelp
e zip
.
Ora per la mia domanda:
Qual è il processo specifico per trasferire l'elenco di selezione dei pacchetti da un sistema Debian a un altro (supponendo lo stesso livello di rilascio di Debian, in Wheezy) e successivamente applicare tali modifiche? L'obiettivo è che entrambi abbiano lo stesso elenco di pacchetti installati, idealmente in modo tale da eseguire un diff
tra gli output di dpkg --get-selections
o dpkg --list
sui due torna senza mostrare differenze.
grep -v deinstall
parte è presa in prestito da Impedisci la rimozione dei pacchetti dopo aver eseguito dpkg --set-selections
su Chiedi a Ubuntu.
Ho cambiato il sorgente nella VM in modo che sia lo stesso del sistema principale, installando anche 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
Guardando l'output di –set-selections, vedo:
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
...
I numeri di riga sembravano dispari e la parte corrispondente dell'output di –get-selections è:
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
Nota che tra acl
e aglfn
sono acpi-support-base
, acpid
e adduser
per i quali non vengono segnalati errori . Sembra che i pacchetti per i quali vengono segnalati gli errori siano un
secondo dpkg -l
o dpkg -l
non ha alcuna idea su di loro (dpkg-query: no packages found matching ...
). So che ci sono alcuni pacchetti installati localmente, ma non molti. i386
non viene visualizzato fino a gcc-4.7-base:i386 install
molto più in basso nell'elenco (riga 342 nell'output –get-selections).
Risposta accettata:
Per clonare un'installazione Debian, usa apt-clone
utilità. È disponibile (come pacchetto separato, non parte dell'installazione predefinita) in Debian da wheezy e in Ubuntu dal 12.04. Sul computer esistente, esegui
apt-clone clone foo
Questo crea un file foo.apt-clone.tar.gz
. Copialo sul computer di destinazione ed esegui
apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz
Se stai lavorando con un vecchio sistema in cui apt-clone
non è disponibile o se vuoi semplicemente replicare l'elenco dei pacchetti installati ma non un file di configurazione, ecco i passaggi manuali.
-
Sul computer di origine:
cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list dpkg --get-selections >selections.list apt-mark showauto >auto.list
-
Sulla macchina di destinazione:
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
Credo che tu sia interessato da una modifica incompatibile in dpkg che per la prima volta è diventata sibilante. Vedi il bug #703092 per lo sfondo.
La storia breve è che dpkg --set-selections
ora accetta solo i nomi dei pacchetti che sono presenti nel file /var/lib/dpkg/status
o /var/lib/dpkg/available
. Se usi APT solo per gestire i pacchetti, come la maggior parte delle persone, allora /var/lib/dpkg/available
non è aggiornato.
Dopo aver eseguito apt-get update
e prima di eseguire dpkg --set-selections
e apt-get -u dselect-upgrade
, esegui il comando seguente:
apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail
Da jessie in poi, puoi semplificarlo a
apt-cache dumpavail | dpkg --merge-avail
In alternativa, esegui
/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
o anche più semplice
apt-get install dctrl-tools
sync-available
Un altro metodo semplice che non richiede l'installazione di un pacchetto aggiuntivo ma scaricherà nuovamente gli elenchi dei pacchetti è
dselect update
Per ulteriori informazioni, vedere le domande frequenti su dpkg. (Questo è menzionato nella pagina man di dpkg, ma più in un modo che ti ricorderebbe il problema se ne fossi già a conoscenza, non in un modo che spieghi come risolvere il problema!)
Nota che clonare l'installazione di un pacchetto con dpkg --set-selections
non ripristina il contrassegno automatico/manuale in APT. Vedere Ripristino di tutti i dati e le dipendenze da dpkg –set-selections '*' per maggiori dettagli. Puoi salvare i segni sul sistema di origine con
apt-mark showauto >auto.list
e ripristinarli sul sistema di destinazione con
xargs apt-mark auto <auto.list