26 Oct 2014, 00:00

APT, Pinning et fichier preferences

Share

RAPPEL : La gestion des priorités est à considérer comme une fonction avancée, ne remettant pas en cause les choix indiqués par le sysadmin de la machine, et pouvant facilement mener à une corruption totale du système. Il faut l’utiliser avec parcimonie, et en connaissance de cause. Ou sur une machine que l’on compte réinstaller dans la demi-heure suivante :-)

Généralités

Le système APT, via apt-get ou aptitude fait appel à un niveau de priorité, appelé Pinning, affecté à chaque paquet disponible. Lors de l’installation d’un paquet, celui installé est le paquet ayant la plus haute version parmi les paquets ayant la plus haute priorité.
Si aucune version par défaut n’est spécifiée, via la directive APT::Default-Release dans le fichier /etc/apt/apt.conf[.d/XXX] (cas par défaut sous Debian), elle affecte :

  • une prorité de 100 à tout paquet actuellement installé
  • une priorité de 500 à tout paquet disponible dans un dépôt
  • une priorité de 1 à tout paquet disponible dans un dépôt qui a la directive NotAutomatic
  • une priorité de 100 à tout paquet disponible dans un dépôt qui a la directive NotAutomatic ET la directive ButAutomaticUpdates

(Ces directives sont mentionnés dans le fichier Release que nous verrons plus loin.)

Il est possible de voir toutes les versions et priorités d’un paquet, avec la commande apt-cache policy nomdepaquet, sachant que la ligne /var/lib/dpkg/status correspond à la version actuellement installée, et donc référencée par DPKG/APT.

Le but du pinning est de modifier ces priorités par défaut, afin d’avoir, typiquement, un système complètement stable avec quelques bouts de backports, testing ou encore unstable dedans, pour les composants utiles à mettre à jour régulièrement (navigateur web, par exemple).

Affectation des priorités

Chaque entrée du fichier sources.list ramène à une URL. Lorsqu’on a une entrée du type deb http://depot.monsite.org/path/ version archive1 archive2 aptitude va chercher les infos du dépôt à l’empacement http://depot.monsite.org/path/dists/version/Release

Ce fichier Release contient plusieurs lignes, définissant le dépôt, qui aident à configurer correctement un éventuel fichier /etc/apt/preferences , ou plus proprement des fichiers /etc/apt/preferences.d/XXX.pref . Le nom de ces fichiers n’accepte que les les caractères alphanumériques, les points, les traits d’union - et les underscore _. Ils doivent avoir une extension en .pref ou pas d’extension du tout. Ces fichiers servent au pinning, c’est-à-dire la gestion avancée des versions de logiciels.

La syntaxe générale d’une entrée d’un fichier de préference est la suivante :

Package: *
Pin: keyword x=definition
Pin-Priority: integer

La ligne Package définit le ou les paquets auxquels s’applique cette entrée de pinning. Ce peut être un nom précis de paquet (iceweasel), un ensemble de paquets commençant par le même motif (iceweasel*), un ensemble de paquet contenant le même motif (/weasel/) ou tous les paquets (*).

La ligne Pin définit les sources dont les paquets seront sujets à cette entrée. Il contient un mot-clé (keyword) qui définit le mode de sélection de ces sources. Il y a 2 modes de sélection de ces sources : origin, release et version. Origin est le plus simple, il selectionne toutes les entrées sorrespondant à une url de dépot. Par exemple :

Package: *
Pin: origin "ftp.debian.org"
Pin-Priority: 990

affectera une priorité de 990 à tous les paquets de l’archive principale de Debian, quelle que soit l’archive. On ne peut pas faire plus précis avec le mot-clé origin.

Pour le mot clé release, nous pouvons spécifier plusieurs paramètres, séparés par des virgules, qui cadreront très précisément les groupe de paquets auquel s’applique le ping. Ces paramètres sont comparés avec les valeurs du fichier Release de chaque dépôt, vu plus haut. Les paramètres sont : o pour l’origine (la valeur Origin du fichier Release, à ne pas confondre avec le mot clé Origin désignant l’URL), a pour l’archive (testing, stable etc), n pour le codename (squeeze, wheezy etc), v pour la version de paquet, l pour le Label (trouvé dans le fichier Release, toujours), et c pour le composant (main, contrib, non-free etc) Par exemple :

Package: *
Pin: release o=Debian Backports,n=wheezy-backports,l=Debian Backports
Pin-Priority: 50

affectera une priorité de 50 à tous les paquets venant de l’archive wheezy-backports, on voit que les valeurs correspondent avec le fichier Release.

Le mot clé version est assez explicite. Par exemple :

Package: perl
Pin: version 5.10*
Pin-Priority: 1001

Installation de packages non-prioritaires

Le plus souvent, il suffira de fournir l’option -t à aptitude, pour lui indiquer l’archive à partir de laquelle nous souhaitons installer le paquet. Il est également possible, dans le cas de paquets de versions différentes sur le même nom d’archive (par exemple l’archive wheezy de Debian, et l’archive wheezy de deb-multimedia.org), de spécifier la version précise que nous souhaitons installer, grâce à la syntaxe paquet=version. Le numéro de version précis à entrer est celui renvoyé par apt-cache policy paquet Par exemple :

aptitude install build-essential=11.7

tentera d’installer la version 11.7 de build-essential, c’est à dire celle de Jessie. Ce paquet faisant appel à plein de paquets de jessie, qu’aptitude ne priorise pas, il ne proposera d’installer ces paquets qu’après plusieurs solutions refusées. On peut taper à la place :

aptitude install build-essential=11.7 -t jessie

ainsi nous précisons la version exacte à utiliser, tout en donnant à aptitude l’ordre d’installer à partir de jessie tout ce quie est nécessaire.

Pour plus d’informations, consultez man apt_preferences.