J'essaie de configurer un environnement intermédiaire dans une machine virtuelle, afin de tester les mises à jour avant de les appliquer à mon système principal.
Pour ce faire, j'ai effectué une installation de base de Debian Wheezy (comme sur le système principal) dans la VM, puis exécuté en tant que root depuis la VM :
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] '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 dpkg --set-selections
exécuter dans la machine virtuelle. J'ai certains packages qui nécessitent une gestion spéciale (c'est en fait la principale raison pour laquelle je veux un environnement de staging en premier lieu) mais lorsque j'exécute la dernière commande ci-dessus, j'obtiens environ un gazillion 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
, yelp
et 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) puis en appliquant ensuite ces modifications ? L'objectif est que les deux aient la même liste de packages installés, idéalement de sorte que faire un diff
entre les sorties de dpkg --get-selections
ou dpkg --list
sur les deux revient ne montrant aucune différence.
Le grep -v deinstall
la partie est empruntée à Empêcher les paquets d'être supprimés après avoir fait dpkg --set-selections
sur Ask Ubuntu.
J'ai changé la source dans la machine virtuelle 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 qu'entre acl
et aglfn
sont acpi-support-base
, acpid
et adduser
pour lesquels aucune erreur n'est signalée . Il semble que les packages pour lesquels des erreurs sont signalées soient soit un
selon dpkg -l
, ou dpkg -l
n'en a aucune idée (dpkg-query: no packages found matching ...
). Je sais qu'il existe des packages installés localement, mais pas beaucoup. i386
ne figure pas avant l'installation de gcc-4.7-base:i386 install
beaucoup plus bas dans la liste (ligne 342 dans la sortie –get-selections).
Réponse acceptée :
Pour cloner une installation Debian, utilisez le apt-clone
utilitaire. Il est disponible (en tant que paquet 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ù apt-clone
n'est pas disponible, ou si vous souhaitez simplement répliquer la liste des packages installés mais pas n'importe quel 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 rendu sifflant. Voir le bogue #703092 pour le contexte.
La petite histoire est que dpkg --set-selections
n'accepte désormais que les noms de packages présents dans le fichier /var/lib/dpkg/status
ou /var/lib/dpkg/available
. Si vous n'utilisez APT que pour gérer les packages, comme la plupart des gens, alors /var/lib/dpkg/available
n'est pas tenu à jour.
Après avoir exécuté apt-get update
et avant d'exécuter dpkg --set-selections
et 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 pour
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 paquet avec dpkg --set-selections
ne restaure pas la marque automatique/manuel dans APT. Voir Restauration de toutes les données et dépendances depuis 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 restaurez-les sur le système cible avec
xargs apt-mark auto <auto.list