L’épinglage APT (APT pinning)

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.

Contexte

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

L’option Default-Release

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 :

  • 100 pour la version déjà installée (si elle existe) ;
  • 500 pour les versions qui ne sont pas installées et qui n’appartiennent pas à wheezy ;
  • 990 pour les versions qui ne sont pas installées et qui appartiennent à wheezy.

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.

L’épinglage personnalisé

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.

Les mises à jour dist-upgrade

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

Le dépôt DMO

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

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *