Article écrit et wikisé par Julien Reveret.
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.
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.
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 :
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 :
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 :
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
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
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.