Le package pinning, mixer les distributions

La théorie sur le package pinning

Le package pinning va permettre de faire plusieurs choses. Une des utilités est de pouvoir remplacer certains paquets par la version disponible dans une autre release. On peut aussi remplacer certains paquets officiels par d'autres non officiels, sans pour autant casser toutes les dépendances de la distribution.

Mixer plusieurs distributions

Avant toute chose, je tiens à prévenir que mettre un package de testing ou unstable dans stable, ce n'est pas de la magie, il viendra avec toutes ses dépendances si elles ne sont pas satisfaites par les packages de la distribution installée, ce qui veut dire qu'on peut facilement se retrouver avec une libc6, ou d'autres librairies de testing, unstable, si on ne fait pas attention.

Mon conseil est celui-ci : “prudence, et pas de assume-yes “true” dans apt.conf”.

Commençons par voir comment remplacer un paquet de stable par le paquet de testing ou d'unstable (le package pinning ne sert généralement pas à faire des downgrades). La priorité des paquets est simple, à base de nombres dont voici la signification :

  • 1001 : Le package ne sera jamais remplacé par APT
  • 1000 : idem, mais APT refusera d'installer le package si une autre version est déjà présente.
  • 990 : Le package ne pourra être remplacé que si une version supérieure est disponible dans la distribution « préférée »
  • 500 : Toute version du package supérieure à celle présente sera installée.
  • 100 : Toute version du package, supérieure ou inférieure, remplacera la version en place
  • -1 : On empêche un package (ou une version spécifique) d'être installé.

Pour retrouver ses priorités, on fait appel à la commande “apt-cache policy” qui va nous renvoyer une sortie à peu près équivalente à celle ci :

[shaddai@kavado]~ $ apt-cache policy
Package files:
 100 /var/lib/dpkg/status
     release a=now
 500 ftp://ftp.fr.debian.org sid/non-free Packages
     release o=Debian,a=unstable,l=Debian,c=non-free
     origin ftp.fr.debian.org
 500 ftp://ftp.fr.debian.org sid/contrib Packages
     release o=Debian,a=unstable,l=Debian,c=contrib
     origin ftp.fr.debian.org
 500 ftp://ftp.fr.debian.org sid/main Packages
     release o=Debian,a=unstable,l=Debian,c=main
     origin ftp.fr.debian.org
 990 file: apt-build/main Packages
     release o=apt-build,l=apt-build,c=main
Pinned packages:

On comprend alors que pour installer un package de testing sur une stable, on doit parfois changer les priorités. Seulement, il y a un “détail”, c'est que les paquets de tesing sont souvent plus récents que ceux de stable, et donc ont la priorité dûe à leur numéro de version. Voilà pourquoi il faut se méfier lorsqu'on rajoute une cible dans le sources.list. Si on rajoute une cible pour testing, il faut modifier les priorités, pour cela on crée le fichier /etc/apt/preferences s'il n'existe pas déjà, et on règle les priorités comme suit :

  1. On met la priorité la plus grande à la cible par défaut, qui se trouve être la version stable dans notre cas.
  2. On met une priorité moindre pour la version testing.
  3. Enfin, pour la version unstable, si on l'a rajoutée, on donne la priorité la plus basse.

Remplacer des paquets officiels

Ici, on s'attaque à une partie un peu plus facile, car généralement, les paquets non officiels ont la même version que ceux du dépot officiel, mis à part les backports, pour lesquels le numéro de version donne une plus grande priorité.

Les dépôts non-officiels sont à rajouter dans votre sources.list, ensuite, dans le fichier des préférences, on règle la priorité de ce dépôt pour qu'il soit utilisé en lieu et place du dépôt officiel pour les paquets qu'il contient. On peut aussi, dans le cas où un seul paquet de ce dépôt nous interesse, juste mettre en préférence le paquet en question. On arrive donc à deux solutions :

  • Mettre une priorité au dépôt non-officiel plus grande qu'au dépôt officiel, ainsi tous les paquets du dépôt non-officiel seront installés à la place de leur homologue du serveur officiel.
  • Donner une priorité supérieure à un (ou quelques) paquet(s) du dépôt non-officiel, et garder le reste des paquets officiels.

En pratique, comment ça se passe ?

Nous allons voir en pratique, comment éditer le fichier preferences pour mixer 2 distributions, ou jouer avec un site non-officiel. Le fichier à modifier est donc : /etc/apt/preferences

Mixer plusieurs distributions

Si l'on dispose déjà d'une sources dans le fichier sources.list pour la distribution stable, il ne reste qu'à rajouter une seconde source pour testing ou unstable, selon ce qu'on veut :

deb ftp://ftp.fr.debian.org/debian stable  main contrib
deb ftp://ftp.fr.debian.org/debian testing  main contrib

Comme dit dans la partie théorique, on doit penser à baisser la priorité de la version testing si l'on est en stable. Dans le fichier preferences, on aura les lignes suivantes :

# Tous les paquets de la cible testing ont une priorité de 200
# le a=testing est là pour dire à apt quelle archive utiliser
Package: *
Pin: release a=testing
Pin-Priority: 500
# Les paquets de la cible stable reste avec un priorité supérieure, pour
# éviter que les paquets de testing remplacent tous ceux de stable.
Package: *
Pin: release a=stable 
Pin-Priority: 990

Maintenant, pour installer un paquet de la cible testing, on doit modifier un peu la ligne apt, ce qui donne :

# apt-get install -t testing paquet

Remplacer des paquets officiels

Comme dit plus haut, cette façon de faire est moins contraignante, car généralement les numéros de version sont les même. On procède d'une façon similaire, on ajoute le dépôt dans le sources.list, et on édite le fichier preferences :

# J'ai choisi de prendre le paquet synergy sur le site debian.moolfreet.com
# Bien sûr je vous invite à voir les autres paquets de ce site
# Pour indiquer à apt l'origine du paquet, on met o=DotDeb, l'information sur
# l'origine est donné par la sortie de la commande apt-cache policy
Package: synergy
Pin: release o=DotDeb
Pin-Priority: 990
# le package synergy de stable sera ignoré, mais les autres resteront
# prioritaires
Package: *
Pin: release a=stable
Pin-Priority: 900

Maintenant, je vais installer ledit paquet :

shaddai@dahmer:~$ sudo apt-get install synergy
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libfreetype6 xfree86-common xlibs 
The following NEW packages will be installed:
    libfreetype6 synergy xfree86-common xlibs 
0 packages upgraded, 4 newly installed, 0 to remove and 0  not  upgraded.
Need to get 2352kB of archives. After unpacking 7496kB will be used.
Do you want to continue? [Y/n] 
Get:1 http://debian.moolfreet.com ./ synergy 1.0.3-1 [375kB]
Get:2 ftp://ftp2.fr.debian.org stable/main libfreetype6 2.0.9-1 [209kB]
Get:3 ftp://ftp2.fr.debian.org stable/main xfree86-common 4.1.0-16 [545kB]
Get:4 ftp://ftp2.fr.debian.org stable/main xlibs 4.1.0-16 [1223kB]                           
Fetched 2169kB in 35s (60.4kB/s)                                                             
Reading changelogs...
Selecting previously deselected package libfreetype6.
(Reading database ... 7154 files and directories currently installed.)
Unpacking libfreetype6 (from .../libfreetype6_2.0.9-1_i386.deb) ...
Selecting previously deselected package xfree86-common.
Unpacking xfree86-common (from .../xfree86-common_4.1.0-16_all.deb) ...
Selecting previously deselected package xlibs.
Unpacking xlibs (from .../xlibs_4.1.0-16_i386.deb) ...
Selecting previously deselected package synergy.
Unpacking synergy (from .../synergy_1.0.3-1_i386.deb) ...
Setting up libfreetype6 (2.0.9-1) ...
Setting up xfree86-common (4.1.0-16) ...
Setting up xlibs (4.1.0-16) ...
Setting up synergy (1.0.3-1) ...

On a donc bien pris le paquet synergy sur le bon serveur, et les dépendances ne s'y trouvant pas, on les prends sur le dépôt officiel, tout marche parfaitement.

 
paquets/le-package-pinning-mixer-les-distributions.txt · Dernière modification: 11/12/2010 15:24 par orgrim