Quand on mixe plusieurs dépôts, l’épinglage APT permet de définir des priorités d’installation et de mise à jour, par dépôt ou par paquet.
Les commandes préfixées d’un # sont à lancer en root. Les commandes préfixées d’un % sont à lancer en simple utilisateur.
J’ai encore plusieurs serveurs qui tournent avec OpenVZ. Une fois qu’on a appris à l’utiliser, OpenVZ est efficace : son overhead se limite à quelques pourcents. Mais depuis wheezy, OpenVZ n’est plus supporté par Debian. À terme, il faudra migrer vers LXC ou Xen.
Mes premiers tests avec LXC n’étaient pas concluants, le projet était encore trop jeune. Je suis donc resté avec OpenVZ pour un moment, en attendant de faire un choix entre un LXC plus mature, ou bien Xen. Seulement, si on mets à jour un conteneur VZ vers wheezy, on tombe sur ce problème.
Mon workaround “rapide et sale”, c’était apt-mark hold bash. Mais la récente faille de sécurité dans bash m’a incité à utiliser une solution mieux adaptée : l’épinglage APT (et squeeze-lts).
Un moyen simple pour trier les dépôts quand on en utilise que deux, c’est l’épinglage automatique fourni par Default-Release.
Créez un fichier /etc/apt/apt.conf.d/00default-release et mettez dedans :
APT::Default-Release "wheezy";
En résumé, pour chaque paquet, cette option mets en place l’épinglage suivant :
On peut avoir plus de détails avec man apt_preferences, dans la section « Méthode d’interprétation des priorités par APT ». Extrait :
Les priorités (P) indiquées dans le fichier des préférences doivent être des entiers positifs ou négatifs. Ils sont interprétés à peu près comme suit : P >= 1000 cette priorité entraîne l'installation du paquet même s'il s'agit d'un retour en arrière. 990 <= P < 1000 la version sera installée, même si elle n'appartient pas à la distribution par défaut ; mais elle ne sera pas installée si la version installée est plus récente. 500 <= P < 990 La version sera installée, sauf s'il existe une version appartenant à la distribution par défaut ou si la version installée est plus récente. 100 <= P < 500 la version sera installée, sauf s'il existe une version appartenant à une autre distribution ou si la version installée est plus récente. 0 < P < 100 la version sera installée si aucune version du paquet n'est installée.
Mais ça ne permet pas d’appliquer des règles spécifiques pour un paquet. Donc, dans notre conteneur wheezy, la version wheezy de bash prendra le pas sur la version squeeze-lts. Pour forcer la version qui ne bloque pas vzctl enter, il va falloir définir des règles d’épinglage personnalisées.
Il faut commencer par supprimer le fichier /etc/apt/apt.conf.d/00default-release, s’il existe. L’option Default-Release semble écraser toute règle personnelle.
Dans le fichier /etc/apt/preferences, on définit une règle qui reproduit le comportement de Default-Release :
Package: *
Pin: release o=Debian,n=wheezy
Pin-Priority: 990
Pour on ajoute une règle pour bash. Attention, il faut une ligne vide entre chaque règle.
Package: bash
Pin: release a=squeeze-lts
Pin-Priority: 991
Le o signifie origine, le n correspond à la distribution wheezy dans sa globalité, le a correspond à une ligne dans sources.list. Il faut parfois jongler avec Pin: release o=, Pin: release a= et Pin: origin "url" jusqu’à ce qu’APT identifie le dépôt visé et qu’il l’épingle correctement.
On vérifie que l’épinglage est bien pris en compte.
% apt-cache policy bash bash: Installé : 4.1-3+deb6u2 Candidat : 4.1-3+deb6u2 Épinglage de paquet : 4.1-3+deb6u2 Table de version : 4.2+dfsg-0.1+deb7u3 991 990 http://security.debian.org/ wheezy/updates/main i386 Packages 4.2+dfsg-0.1 991 990 http://ftp.fr.debian.org/debian/ wheezy/main i386 Packages *** 4.1-3+deb6u2 991 500 http://http.debian.net/debian/ squeeze-lts/main i386 Packages 100 /var/lib/dpkg/status 4.1-3 991 500 http://ftp.fr.debian.org/debian/ squeeze/main i386 Packages
Les 990 en gras, sur les lignes des dépôts wheezy, indique que la release wheezy a la bonne priorité. Le 991 en gras, sur la ligne des paquets, indique que bash est bien épinglé par une règle, ici sur la version squeeze-lts. J’ignore pourquoi les développeurs Debian ont choisi d’afficher l’épinglage devant chaque version plutôt que juste devant la version squeeze-lts. En tous cas, la ligne « Épinglage de paquet » vous assure que tout marche comme prévu.
Durant une mise à jour, après apt-get upgrade et avant dist-upgrade, on peut avoir des choses bizarres avec l’épinglage. Si des paquets ne doivent pas être mis à jour, il faut les geler avec :
# apt-mark hold paquet
Si apt-mark répond « Error importing apt_pkg, is python-apt installed? » alors que ce paquet est installé :
# echo paquet hold | dpkg --set-selections
Si vous utilisez le dépôt DMO de Christian Marillat, je vous conseille de créer un fichier /etc/apt/preferences.d/dmo :
Package: *
Pin: origin www.deb-multimedia.org
Pin-Priority: 600
De cette manière, les paquets DMO n’écraseront pas la version de la release par défaut, mais resteront prioritaires par rapport aux autres sources (par défaut à 500), et par rapport aux paquets déjà installés (par défaut à 100), ou encore des backports (“packages are pinned to 100 by using ButAutomaticUpgrades: yes in the Release files”).
Ensuite, pour chaque paquet dont vous voulez la version DMO, ajoutez une règle pour épingler ce paquet à 991, comme pour bash dans les conteneurs VZ.
Package: mplayer
Pin: origin www.deb-multimedia.org
Pin-Priority: 991
Si vous voulez plus de détails, je vous conseille la lecture de ces pages :
https://wiki.debian.org/AptPreferences
http://www.argon.org/~roderick/apt-pinning.html
https://www.isalo.org/wiki.debian-fr/L'etiquetage_de_paquets_via_le_fichier_/etc/apt/preferences