Comment répliquer les sélections de paquets installés d'un système Debian à un autre? (Debian Wheezy)

19

J'essaie de configurer un environnement de transfert dans une machine virtuelle, afin de tester les mises à jour avant de les appliquer à mon système principal.

Pour ce faire, j'ai fait une installation de base de Debian Wheezy (la même que sur le système principal) dans la VM, puis j'ai exécuté en tant que root à partir de la 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'architecture i386 est malheureusement nécessaire dans mon cas; le système est natif amd64.

Le problème vient de l' dpkg --set-selectionsexécution dans la machine virtuelle. J'ai quelques paquets qui nécessitent une manipulation spéciale (ce sont en fait la principale raison pour laquelle je veux un environnement de transfert en premier lieu) mais quand j'exécute la dernière commande ci-dessus, j'obtiens environ un milliard de lignes de sortie comme:

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

pour les packages qui devraient vraiment être disponibles dans le système de base. Les exemples incluent xterm, yelpet zip.

Maintenant pour ma question:

Quel est le processus spécifique pour transférer la liste de sélection de paquets d'un système Debian à un autre (en supposant le même niveau de version Debian, dans Wheezy) et ensuite appliquer ces modifications? L'objectif est que les deux aient la même liste de packages installés, idéalement de telle sorte que faire un diffentre les sorties de dpkg --get-selectionsou dpkg --listsur les deux revienne sans aucune différence.

La grep -v deinstallpartie est empruntée à Empêcher les packages d'être supprimés après avoirdpkg --set-selections terminé sur Ask Ubuntu.

J'ai changé la source dans la VM pour qu'elle soit la même que sur le système principal, en installant également 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

En regardant la sortie --set-selections, je vois:

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
...

Les numéros de ligne semblaient impairs, et la partie correspondante de la sortie de --get-selections est:

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

Notez que entre aclet aglfnsont acpi-support-base, acpidet adduser pour lesquels aucune erreur sont signalées . Il semble que les paquets pour lesquels des erreurs sont signalées sont unconformes dpkg -lou dpkg -ln'ont aucune idée à leur sujet ( dpkg-query: no packages found matching ...). Je sais qu'il existe des packages installés localement, mais pas beaucoup. i386n'apparaît que gcc-4.7-base:i386 install beaucoup plus bas dans la liste (ligne 342 dans la sortie --get-selections).

un CVn
la source
dpkg --get-selections … | … dpkg --set-selectionsest le moyen de répliquer les sélections de packages. Si cela échoue pour vous, vous devrez fournir plus d'informations sur la raison. Publiez votre ensemble complet de sources sur les deux systèmes, la sortie de dpkg --get-selectionset la transcription complète de dpkg --get-selections(peut-être pouvons-nous discerner un modèle en voyant ce qui fonctionne et ce qui ne fonctionne pas). Si le système principal amd64 ou i386? Cela fonctionne-t-il si vous n'ajoutez pas l'architecture i386?
Gilles 'SO- arrête d'être méchant'
@Gilles Doit-il vraiment être la sortie complète de dpkg --get-selections(et je suppose que vous vouliez dire la dpkg --set-selectionstranscription?)? Même le premier contient plus de 3 600 lignes et environ 100 Ko.
un CVn
Vous devez publier suffisamment pour que nous discernions le modèle des paquets qui déclenchent des erreurs et ceux qui ne le font pas (sauf si vous pouvez le découvrir par vous-même). Une copie de /var/lib/dpkg/Packages(qui est encore plus longue) pourrait également être utile - cela pourrait être le symptôme d'un fichier Packages cassé.
Gilles 'SO- arrête d'être méchant'
@Gilles Point intéressant. Je n'avais pas vraiment envisagé la possibilité, mais j'utilise différents miroirs sur ceux-ci. Voyons si cela se produit toujours si je pointe la VM vers le même miroir Debian. Etre prêt.
un CVn
@Gilles Cela n'a pas vraiment fait de différence, mais j'ai trouvé autre chose. Voir la question mise à jour.
un CVn

Réponses:

17

Pour cloner une installation Debian, utilisez l' apt-cloneutilitaire. Il est disponible (en tant que package séparé, ne faisant pas partie de l'installation par défaut) dans Debian depuis Wheezy et dans Ubuntu depuis 12.04. Sur la machine existante, exécutez

apt-clone clone foo

Cela crée un fichier foo.apt-clone.tar.gz. Copiez-le sur la machine de destination et exécutez

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

Si vous travaillez avec un ancien système où il apt-clonen'est pas disponible, ou si vous souhaitez simplement répliquer la liste des packages installés mais pas de fichier de configuration, voici les étapes manuelles.

  • Sur la machine source:

    cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list
    dpkg --get-selections >selections.list
    apt-mark showauto >auto.list
    
  • Sur la machine cible:

    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
    

Je crois que vous êtes affecté par un changement incompatible dans dpkg qui l'a d'abord transformé en sifflement. Voir bug # 703092 pour le fond.

La petite histoire est que dpkg --set-selectionsmaintenant accepte uniquement les noms de packages qui sont présents dans le fichier /var/lib/dpkg/statusou /var/lib/dpkg/available. Si vous utilisez uniquement APT pour gérer les packages, comme la plupart des gens, il /var/lib/dpkg/availablen'est pas tenu à jour.

Après avoir exécuté apt-get updateet avant d'exécuter dpkg --set-selectionset apt-get -u dselect-upgrade, exécutez la commande suivante:

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

À partir de Jessie, vous pouvez simplifier cela en

apt-cache dumpavail | dpkg --merge-avail

Sinon, exécutez

/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/

ou encore plus simple

apt-get install dctrl-tools
sync-available

Une autre méthode simple qui ne nécessite pas l'installation d'un package supplémentaire mais qui téléchargera à nouveau les listes de packages est

dselect update

Voir la FAQ dpkg pour plus d'informations. (Ceci est mentionné dans la page de manuel de dpkg, mais plus d'une manière qui vous rappellerait le problème si vous étiez déjà au courant, pas d'une manière qui explique comment résoudre le problème!)

Notez que le clonage d'une installation de package avec dpkg --set-selectionsne restaure pas la marque automatique / manuelle dans APT. Voir Restauration de toutes les données et dépendances de dpkg --set-selections '*' pour plus de détails. Vous pouvez enregistrer les repères sur le système source avec

apt-mark showauto >auto.list

et les restaurer sur le système cible avec

xargs apt-mark auto <auto.list
Gilles 'SO- arrête d'être méchant'
la source
3
Ce problème devrait être beaucoup plus visible qu'il ne l'est. Je ne peux pas croire que je n'en ai jamais entendu parler auparavant!
Faheem Mitha
Intéressant. Je vais essayer. Merci!
un CVn
@FaheemMitha Ouais, je suis surpris de n'en avoir jamais entendu parler avant aujourd'hui. Je ne peux pas croire que je n'ai pas utilisé dpkg --set-selectionsdepuis pré-sifflement!
Gilles 'SO- arrête d'être méchant'
D'accord, cela donne une liste d'avertissements beaucoup plus courte --set-selections. Maintenant, comment appliquer les modifications? Même apt-get -u dist-upgradene mentionne qu'une poignée de packages (tous liés à ZFS) où il devrait y avoir des centaines sinon des milliers de packages affectés.
un CVn
@ MichaelKjörling C'estapt-get -u dselect-upgrade
Gilles 'SO- arrête d'être méchant'
0

Comment je l'ai fait

  1. Sur l' hôte source :

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

    attention /etc/apt/sources.list.dsi utilisé ...

    Copiez ensuite le source.selfichier sur l'hôte de destination.

  2. Sur l' hôte de destination :

    vi /etc/apt/sources.list 
    

    adapter sources.list même avec différents miroirs, mais même liste de composants .

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

    Et maintenant, mon hôte de destination installe actuellement beaucoup de choses, alors je pourrais prendre un certain temps pour poster ceci.

techno
la source
Peut-être que «dselect upgrade» devrait être «dselect update» dans la description «Comment je l'ai fait» ci-dessus.
Jonathan Kimmitt