Come posso replicare le selezioni dei pacchetti installati da un sistema Debian a un altro? (Debian Wheezy)


19

Sto provando a configurare un ambiente di gestione temporanea in una macchina virtuale, al fine di testare gli aggiornamenti prima di applicarli al mio sistema principale.

Per fare ciò, ho fatto un'installazione di base di Debian Wheezy (uguale al sistema principale) nella VM, quindi ho eseguito come root dall'interno della VM:

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

L'architettura i386 è purtroppo necessaria nel mio caso; il sistema è nativo amd64.

Il problema è con l' dpkg --set-selectionsesecuzione nella VM. Ho alcuni pacchetti che richiedono una gestione speciale (quelli sono in realtà il motivo principale per cui voglio un ambiente di gestione temporanea in primo luogo) ma quando eseguo l'ultimo comando sopra, ottengo circa un gazillion di righe di output come:

dpkg: warning: package not in database at line NNN: package-name

per i pacchetti che dovrebbero davvero essere disponibili nel sistema di base. Gli esempi includono xterm, yelpe 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 (presupponendo 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 tali che il ritorno difftra gli output di dpkg --get-selectionso dpkg --listsui due ritorni non mostri differenze.

La grep -v deinstallparte è presa in prestito da Impedisci che i pacchetti vengano rimossi dopo averdpkg --set-selections ripetuto su Ask Ubuntu.

Ho modificato l'origine nella VM in modo che sia la stessa 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 --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 porzione 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

Si noti che in mezzo acle aglfnsono acpi-support-base, acpide adduser per i quali sono stati segnalati errori . Sembra che i pacchetti per i quali vengono segnalati errori siano unconformi dpkg -lo dpkg -lnon abbiano alcuna idea al riguardo ( dpkg-query: no packages found matching ...). So che ci sono alcuni pacchetti installati localmente, ma non molti. i386non appare fino a gcc-4.7-base:i386 install molto più in basso nell'elenco (riga 342 nell'output --get-selections).


dpkg --get-selections … | … dpkg --set-selectionsè il modo di replicare le selezioni di pacchetti. Se fallisce, dovrai fornire maggiori informazioni sul perché. Pubblica il tuo set completo di fonti su entrambi i sistemi, l'output da dpkg --get-selectionse la trascrizione completa da dpkg --get-selections(forse possiamo discernere uno schema vedendo cosa funziona e cosa no). Se il sistema principale amd64 o i386? Funziona se non aggiungi l'architettura i386?
Gilles 'SO- smetti di essere malvagio' il

@Gilles Deve davvero essere l' output completo di dpkg --get-selections(e presumo tu intendessi la dpkg --set-selectionstrascrizione?)? Anche solo il primo ha oltre 3.600 linee e circa 100 KB.
un CVn del

Devi pubblicare un numero sufficiente per consentirci di individuare il modello di quali pacchetti generano errori e quali no (a meno che tu non riesca a capire da solo). Anche una copia di /var/lib/dpkg/Packages(che è ancora più lunga) potrebbe essere utile - questo potrebbe essere un sintomo di un file di pacchetti rotto.
Gilles 'SO- smetti di essere malvagio' il

@Gilles Punto interessante. Non avevo davvero considerato la possibilità, ma uso diversi mirror su questi. Fammi vedere se succede ancora se punto la VM sullo stesso mirror Debian. Pausa.
un CVn del

@Gilles Non ha fatto alcuna differenza, ma ho trovato qualcos'altro. Vedi la domanda aggiornata.
un CVn del

Risposte:


17

Per clonare un'installazione Debian, usare l' apt-cloneutilità. È disponibile (come pacchetto separato, non parte dell'installazione predefinita) in Debian da quando wheezy e in Ubuntu dal 12.04. Sulla macchina esistente, eseguire

apt-clone clone foo

Questo crea un file foo.apt-clone.tar.gz. Copiarlo sul computer di destinazione ed eseguirlo

apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz

Se stai lavorando con un vecchio sistema in cui apt-clonenon è disponibile o se desideri semplicemente replicare l'elenco dei pacchetti installati ma non un file di configurazione, ecco i passaggi manuali.

  • Sulla macchina 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 target:

    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 influenzato da una modifica incompatibile in dpkg che per prima cosa è diventata sibilante. Vedi bug # 703092 per lo sfondo.

Il racconto è che dpkg --set-selectionsora accetta solo i nomi dei pacchetti presenti nel file /var/lib/dpkg/statuso /var/lib/dpkg/available. Se si utilizza APT solo per gestire i pacchetti, come la maggior parte delle persone, /var/lib/dpkg/availablenon viene aggiornato.

Dopo l'esecuzione apt-get updatee prima di eseguire dpkg --set-selectionse apt-get -u dselect-upgrade, eseguire 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

Vedi le FAQ di dpkg per maggiori informazioni. (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!)

Si noti che la clonazione di un'installazione di pacchetto con dpkg --set-selectionsnon ripristina il segno automatico / manuale in APT. Vedere Ripristino di tutti i dati e le dipendenze da dpkg --set-selections '*' per maggiori dettagli. È possibile 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

3
Questo problema dovrebbe essere molto più visibile di quello che è. Non posso credere di non averne sentito parlare prima!
Faheem Mitha,

Interessante. Ci provo. Grazie!
un CVn del

@FaheemMitha Sì, sono sorpreso di non averne mai sentito parlare prima di oggi. Non riesco a credere di non aver usato dpkg --set-selectionsdal pre-respiro sibilante!
Gilles 'SO- smetti di essere malvagio' il

Ok, questo ha fornito un elenco molto più breve di avvisi da --set-selections. Ora come posso applicare le modifiche? Anche apt-get -u dist-upgrademenziona solo una manciata di pacchetti (tutti relativi a ZFS) in cui dovrebbero esserci centinaia se non migliaia di pacchetti interessati.
un CVn del

@ MichaelKjörling Cioèapt-get -u dselect-upgrade
Gilles

0

Come l'ho fatto

  1. Sull'host di origine :

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

    importa /etc/apt/sources.list.dse usato ...

    Quindi copiare il source.selfile sull'host di destinazione.

  2. Sull'host di destinazione :

    vi /etc/apt/sources.list 
    

    adattare sources.list anche con mirror diversi, ma con lo stesso elenco di componenti .

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

    E ora, il mio host di destinazione sta installando molte cose, quindi potrei impiegare del tempo per pubblicarlo.


Forse 'dselect upgrade' dovrebbe essere 'dselect update' nella descrizione 'Come ho fatto' sopra.
Jonathan Kimmitt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.