Apt-build, optimisez les paquets Debian pour votre système

Introduction

Depuis quelques temps, et plus précisement depuis l'arrivée des premières versions de la distribution Gentoo, on voit de plus en plus de personnes annoncer haut et fort que “Debian, ouais c'est bien, mais c'est pas optimisé comme [distribution sur laquelle on passe son temps à lancer make]”. Or il n'en est rien, libre à vous de compiler les logiciels que vous voulez utiliser sur votre Debian, tout en utilisant le système APT. En effet, récupérer un tarball, le décompresser, lancer les scripts de configure, lancer make install, c'est à la portée de tout linuxien digne de ce nom, mais ce n'est pas adapté au système de gestion des packages de Debian. Stow était une rustine qui marchait sans trop d'efforts, mais il n'y avait pas une réelle intégration du programme compilé dans les dépendances d'APT. La solution ultime, c'est d'utiliser le magnifique apt-build pour recompiler un programme déjà packagé pour Debian.

L'essayer, c'est l'adopter

Installation

Pour installer apt-build, on opère comme d'habitude :

# apt-get install apt-build

Une fois installé, le script de “post installation” vous pose plusieurs questions, sur le répertoire de build, les options à passer à gcc, l'architecture de votre processeur. Toutes ces informations sont inscrites dans le fichier /etc/apt/apt-build.conf, si vous avez fait une erreur en répondant vous pourrez donc revenir en arrière. Voici un exemple :

$ cat /etc/apt/apt-build.conf
build-dir = /var/cache/apt-build/build
repository-dir = /var/cache/apt-build/repository
Olevel = -O3
march = -march=pentium2
mcpu = -mcpu=pentium2
options =

Pour les paramètres build-dir et repository-dir, assurez vous de donner un répertoire sur une partition où vous avez de la place. Enfin, avec apt-build, vous aurez besoin d'une ligne supplémentaire dans votre sources.list, si elle n'existe pas déjà :

deb-src ftp://miroir_debian/ [stable|testing|unstable] main contrib

Vous êtes dorénavant prêt à utiliser apt-build !

Et maintenant, on fait quoi ?

Je vais commencer par détailler les commandes principales d'apt-build. En effet, tout comme apt-get, il y a des mots clés, comme update, upgrade, install, source, clean-build.

Tout d'abord, la commande update ; elle met à jour la liste des packages installables, il n'y a rien de plus à dire. Il en va de même pour la commande upgrade, je ne m'attarderai pas dessus. Passons directement à install à travers un exemple :

# apt-build install memstat
-----> Installing build dependencies (for memstat) <-----
Reading Package Lists... Done
Building Dependency Tree... Done
0 packages upgraded, 0 newly installed, 0 to remove and 0  not upgraded.
-----> Downloading memstat source (memstat) <-----
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 22.4kB of source archives.
Get:1 ftp://127.0.0.1 1.0.4/main memstat 0.4-1 (dsc) [482B]
Get:2 ftp://127.0.0.1 1.0.4/main memstat 0.4-1 (tar) [21.9kB]
Fetched 22.4kB in 0s (322kB/s)
dpkg-source: extracting memstat in memstat-0.4
-----> Building memstat <-----
...
...
...
dpkg-genchanges: binary-only upload - not including any source code
dpkg-buildpackage: binary only upload (no source included)
-----> Moving packages to repository <-----
-----> Updating repository <-----
Using: -O3 -mcpu=pentium2 -march=pentium2
...
...
Reading Package Lists... Done
Building Dependency Tree... Done
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  memstat

On remarque qu'apt-build procède en plusieurs étapes : l'installation des packages nécessaires pour la compilation, le téléchargement des sources proprement dites, et enfin la compilation et l'installation du package produit. Quand vous voulez repackagez vous même, dpkg-buildpackage ne va pas chercher les dépendances pour vous contrairement à apt-build, et le repackaging peut devenir pénible et demander des connaissances que l'on a pas forcément quand on est pas mainteneur d'un package. Jusqu'ici, nous avons vu une “simple recompilation”, en vue d'optimiser les programmes, mais si l'on veut trifouiller dans les sources, modifier le fichier rules ou d'autres fichiers du répertoire debian/ d'un package, apt-build peut se révéler pratique, et vous apportera peut être votre premier aperçu de l'intérieur d'un package. Cela dit, pour plus d'informations, je vous encourage à potasser le maintainer guide.

Mais encore ?

Penchons nous donc sur cette commande : source. Elle ne fait rien de sorcier, elle télécharge sur le miroir le package source ainsi que le diff contenant le répertoire debian/ dans lequel se trouve les fichiers nécessaires à la création du package (fichiers rules, control, changelog, etc …), elle les dépose dans le répertoire de build, puis décompacte le package source et enfin applique le diff. Exemple :

# apt-build source ethereal
-----> Downloading ethereal source (ethereal) <-----
Reading Package Lists... Done
Building Dependency Tree... Done
Need to get 6170kB of source archives.
Get:1 ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (dsc) [821B]
Get:2 ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (tar) [6154kB]
Get:3 ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (diff) [14.6kB]
Fetched 6170kB in 1s (3533kB/s)
dpkg-source: extracting ethereal in ethereal-0.10.4

On remarque qu'un troisième fichier est téléchargé, il s'agit de la description du package. Vous avez maintenant les sources du programme, avec le répertoire debian/ et les fichiers de création du package, que vous pouvez modifier à votre guise, afin de rajouter ou d'enlever des options. Une fois les modifications faites, vous pouvez fabriquer et installer le package en utilisant la commande apt-build install package_modifié.

Les options les plus importantes ont été passées en revue, il reste les petits plus qui font toute la différence, comme : clean-build est à apt-build ce que la commande clean est à apt-get, elle nettoie entièrement le répertoire de build, mais pas le repository. Vous pouvez supprimer un package avec la commande remove, obtenir des infos sur les sources avec info.

Pour finir, je vous renvoie à la page de man d'apt-build qui contient quelques options intéressantes selon le cas dans lequel vous vous trouvez. Mais je ne vous laisse pas totalement en plan, j'ai gardé le meilleur pour la fin.

Avec des si, on refait le monde, avec apt-build aussi !

Le diable est parmi nous !

La dernière commande dont je vais parler est world, elle devrait dire quelque chose aux adorateurs du diablotin ou du poisson qui pique. En effet, sur les système BSD, pour recompiler tous les ports, il suffit de se placer dans /usr/ports et de taper make world. Le concept a été repris par l'auteur d'apt-build, voilà ce qui se passe lorsqu'on veut refaire le monde :

# apt-build world
-----> Rebuilding the world ! <-----
You should read README.Debian first

Bref, la lecture de ce fameux README semble s'imposer, on y apprend que l'on doit au préalable créer la liste des packages à recompiler et à installer à la place des packages actuels, liste de laquelle il est préférable de retirer des packages trop sensibles comme gcc, libc6, ou autres packages vitaux. Créons cette liste :

# dpkg --get-selections | awk '{if ($2 == "install") print $1}' > /etc/apt/apt-build.list

Une fois cette liste éditée, il sera possible de faire un apt-build world pour recompiler et optimiser tout notre système ou presque.

Et là, c'est le drame !

Vous avez utilisé apt-build pour construire vos propres packages, et lors d'une mise à jour avec apt-get dist-upgrade un de vos beaux packages est remplacé par un package officiel, quel dommage. Vous auriez pu éviter cela en modifiant le pinning de vos packages construits avec apt-build. Pour mettre une priorité plus importante aux packages construits avec apt-build, il vous faudra modifier le fichier /etc/apt/preferences comme suit :

Package: *
Pin: release o=apt-build
Pin-Priority: 990 

Ainsi vous ne serez plus inquiété par un dist-upgrade malheureux qui viendrait remplacer vos packages par ceux officiels. Pour vérifier les priorités des « repositories », utilisez la commande apt-cache policy qui vous donnera un résultat semblable à celui ci :

$ apt-cache policy 
Package Files:
 100 /var/lib/dpkg/status
     release a=now
 500 http://ftp2.de.debian.org sid/non-free Packages
     release o=Debian,a=unstable,l=Debian,c=non-free
     origin ftp2.de.debian.org
 500 http://ftp2.de.debian.org sid/contrib Packages
     release o=Debian,a=unstable,l=Debian,c=contrib
     origin ftp2.de.debian.org
 500 http://ftp2.de.debian.org sid/main Packages
     release o=Debian,a=unstable,l=Debian,c=main
     origin ftp2.de.debian.org
 990 file: apt-build/main Packages
     release o=apt-build,a=apt-build,l=apt-build,c=main
Pinned Packages:

Cette solution de faire du package pinning est propre, cependant, attention à bien suivre les mises à jours. En effet, si on décide de repackager une lib dont dépendent plusieurs programmes et qu'on ne la met pas à jour, on peut bloquer l'upgrade des packages qui en dépendent. Donc prudence, gardez un oeil sur les mises à jour des packages dont vous vous occupez.

Conclusion

Il est temps de se quitter, j'espère vous avoir donné envie d'utiliser apt-build, c'est un outil très intéressant ET utile. Je tiens aussi à vous mettre en garde, l'auteur prend des précautions en vous invitant à ne pas recompiler certains programmes comme gcc ou d'autres. Ni lui ni moi ne sommes responsables ou coupables des bêtises que vous ferez. Alors si vous flinguez votre Debian, ne m'écrivez pas (sauf pour me faire rire). Notez bien aussi qu'apt-build n'invente pas de package, si le logiciel que vous voulez installer n'existe pas en package Debian, apt-build ne pourra pas récupérer les sources sur un miroir Debian et les compiler (là il vous faudra faire une demande et attendre qu'elle soit acceptée).

 
paquets/apt-build-optimisez-les-paquets-debian-pour-votre-systeme.txt · Dernière modification: 11/12/2010 15:24 par orgrim