Création de packages Debian

user_icon admin | icon2 Debian | icon4 26/10/2008 16h17| Type doc: article| Type File: xml| icon3 No Comment

Création d'un package Debian


1. Pourquoi ça ?

Il est parfois intéressant de disposer d'une version d'un programme non encore intégré dans une distribution Debian. Et d'ailleurs si j'ai créé cette doc c'était justement pour profiter de la dernière version de lighttp qui comblait des failles de sécurité des versions précédentes ... et un peu pour le fun ;)

lighttpd 1.4.20 - Otherwise the terrorists win ( 1.4.19_fix_ssl_dos.patch, 1.4.x_rewrite_redirect_decode_url.patch, 1.4.x_userdir_lowercase.patch, 1.4.x_request_header_memleak.patch)

2. Création de notre package

Debian nous facilite grandement les choses pour effectuer cette tache, pour cela nous devons installer quelques packages :

apt-get install build-essential autotools-dev lintian dh-make

Première étape, télécharger les sources du programme à packager :

mkdir tmp
cd tmp
wget http://www.lighttpd.net/download/lighttpd-1.4.20.tar.gz
tar xvzf lighttpd-1.4.20.tar.gz
cd lighttpd-1.4.20

dh_make va se charger de générer les fichiers nécessaires à la Debianisation du programme :

dh_make -e dab@free.fr -f ../lighttpd-1.4.20.tar.gz

Type of package: single binary, multiple binary, library, kernel module or cdbs? [s/m/l/k/b] s

Maintainer name : unknown
Email-Address   : dab@free.fr
Date            : Thu, 23 Oct 2008 14:44:37 +0000
Package Name    : lighttpd
Version         : 1.4.20
License         : blank
Type of Package : Single
Hit <enter> to confirm:
Done. Please edit the files in the debian/ subdirectory now. lighttpd
uses a configure script, so you probably don't have to edit the Makefiles.

Le répertoire ' debian ' a été créé, il contient les modèles de fichiers qui seront utilisés lors de la création du package. Notez que les fichiers avec une extension 'ex' sont des exemples.

find debian/
debian/
debian/dirs
debian/control
debian/manpage.sgml.ex
debian/prerm.ex
debian/compat
debian/cron.d.ex
debian/menu.ex
debian/rules
debian/changelog
debian/init.d.ex
debian/emacsen-remove.ex
debian/postrm.ex
debian/manpage.1.ex
debian/preinst.ex
debian/lighttpd.doc-base.EX
debian/emacsen-startup.ex
debian/watch.ex
debian/docs
debian/copyright
debian/emacsen-install.ex
debian/lighttpd-default.ex
debian/postinst.ex
debian/manpage.xml.ex
debian/README.Debian

Détaillons les plus importants de ceux-ci.

debian/control : Ce fichier contient les métadonnées relatives au paquet que nous allons construire. On remarque que dh_make a déjà renseigné les champs qu'il a pu déduire.

Source: lighttpd
Section: unknown
Priority: extra
Maintainer: unknown <dab@free.fr>
Build-Depends: debhelper (>= 5), autotools-dev
Standards-Version: 3.7.2

Package: lighttpd
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
 <insert long description, indented with spaces>

Section : Debian est divisé en trois catégories : main / contrib / non-free , chaque catégorie est elle même divisée en section base / devel / doc / web ... Dans le cas de notre serveur http se sera donc main/web or main est implicite, ce sera donc ' web '.

Priority : La Charte Debian décrit ce champ, pour notre paquet personnalisé nous utiliserons 'optionnal' et dans ce cas il est considéré comme n'entrant en conflit avec aucun autre paquet. Dans le cas contraire il existe les priorités suivantes : required, important, standard, extra http://www.debian.org/doc/debian-policy/ch-archive.html#s-sections

Build-Depends : Il s'agit des dépendances nécessaire à la construction du paquet. Pour rechercher ces dépendances nous pouvons utiliser le script suivant :

       strace -f -o /tmp/log ./configure
       # ou make à la place de ./configure, si votre paquet n'utilise pas autoconf
       for x in `dpkg -S $(grep open /tmp/log|\
                           perl -pe 's!.* open\(\"([^\"]*).*!$1!' |\
                           grep "^/"| sort | uniq|\
                           grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|\
                           cut -f1 -d":"| sort | uniq`; \
             do \
               echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; \
             done

qui nous retourne :

binutils (>= 2.17-3 ), coreutils (>= 5.97-5.3 ), gcc-4.1 (>= 4.1.1-21 ), libacl1 (>= 2.2.41-1 ), libattr1 (>= 2.4.32-1 ), libbz2-dev (>= 1.0.3-6 ), libc6 (>= 2.3.6.ds1-13etch7 ), libc6-dev (>= 2.3.6.ds1-13etch7 ), libc6-i686 (>= 2.3.6.ds1-13etch7 ), libfcgi-dev (>= 2.4.0-6 ), libncurses5 (>= 5.5-5 ), libpcre3-dev (>= 6.7+7.4-4 ), libselinux1 (>= 1.32-3 ), libsepol1 (>= 1.14-2 ), libstdc++6-4.1-dev (>= 4.1.1-21 ), linux-kernel-headers (>= 2.6.18-7 ), locales (>= 2.3.6.ds1-13etch7 ), uuid-dev (>= 1.2-1.39+1.40-WIP-2006.11.14+dfsg-2etch1 ), zlib1g-dev (>= 1

Et puisque qu'il s'agit des dépendances de construction nous utiliserons uniquement les paquets *-dev c'est à dire: libbz2-dev, libc6-dev, libfcgi-dev, libpcre3-dev, libstdc++6-4.1-dev, uuid-dev, zlib1g-dev

On passe ensuite à la Description du paquet, la première ligne est une description courte du paquet, la seconde et les suivantes sont une description détaillée.

Description:  A fast webserver with minimal memory footprint
 lighttpd is a small webserver and fast webserver developed with
 security in mind and a lot of features.
 It has support for
   * CGI, FastCGI and SSI
   * virtual hosts
   * URL rewriting
   * authentication (plain files, htpasswd, ldap)
   * transparent content compression
   * conditional configuration
 and configuration is straight-forward and easy.
 .
  Homepage: http://www.lighttpd.net

debian/rules : Il s'agit d'un Makefile utilisé lors de la création du paquet (.configure, build, install). Nous pouvons personnaliser les options de compilation après avoir pris connaissance de ces dernières en exécutant un simple ./configure --help. Dans le cas de lighttpd le 'configure' devient:

./configure --prefix=/usr --with-openssl --with-pcre --with-bz2

debian/README.Debian : Spécifier ce qui est éventuellement relatif à Debian, sinon le supprimer.

debian/changelog : Je conserve les valeurs par défaut

debian/copyright : comme son nom l'indique.

debian/docs : la liste des fichiers de documentation. Ils seront installés dans /usr/share/doc/lighttpd.

debian/manpage.1.ex => Il s'agit d'un exemple de manpage. Copier un éventuel manpage en debian/manpage .

debian/dirs : Liste des répertoires qui doivent être présent sur le système. (sans le premier '/')

debian/init.d.ex : Dans le cas d'un daemon à recopier en debian/init.d et l'adapter mais le plus simple est d'utiliser le debian/init.d des sources du package 'lighttpd' comme modèle.

Et enfin je supprime tout le reste : rm debian/*.ex debian/*.EX

Premier test de compilation:

dpkg-buildpackage -rfakeroot

Le configure et make sont exécutés, les binaires sont installés dans debian/lighttpd et enfin une série de script dh_* assure la création du package.

On peut vérifier la présence du binaire lighttpd dans debian/lighttpd/usr/sbin/, malheureusement aucun fichier de configuration n'est présent dans l'archive :(

On peut aussi noté que la commande dpkg-buildpackage nous alerte sur le fait que le paquet ne sera pas signé car le script dpkg-deb n'a pas trouvé de clé de cryptage relative au Maintener:

dpkg-deb : 1 avertissements sur les fichiers « control » ignorés
 signfile lighttpd_1.4.20-1.dsc
gpg: skipped "dab <dab@free.fr>": secret key not available
gpg: [stdin]: clearsign failed: secret key not available

Le paquet est tout de même présent dans le répertoire parent.

ls ../lighttpd_1.4.20*
../lighttpd_1.4.20-1.diff.gz       ../lighttpd_1.4.20-1_i386.deb
../lighttpd_1.4.20-1.dsc           ../lighttpd_1.4.20.orig.tar.gz
../lighttpd_1.4.20-1_i386.changes

Revenons un instant sur l'abscence des fichiers de configuration, qui devraient en toute logique être installés dans /etc/lighttpd . dpkg-buildpackage n'a pas pu deviner par lui-même quels sont les fichiers de configuration d'un package, il facilite la création de paquet mais faut pas non plus exagéré il n'est pas devin. Le plus simple est d'utiliser les scripts déjà construits des sources du paquet stable de lighttpd. Pour cela il suffit d'éxécuter :

mkdir source_stable && cd $!
apt-get source lighttpd

On copie ensuite tous les fichiers présent dans lighttpd-1.4.19/debian qui ne le sont pas dans notre répertoire debian , éventuellement de les adapter et de relancer le dpkg-buildpackage . Ou encore plus simple d'utiliser les sources d'un paquet de la distribution 'testing' ou 'unstable', d'adapter les dépendances ( Build-Depends,Depends Maintener ... ) et de reconstruire le paquet. Et voilà un paquet backporté :)

Et voilà le résultat : http://www.catapulse.org/static/files/articles/debian/backports/lighttpd_1.4.20-1_i386.deb

Bon voilà pour les grandes lignes ... Il nous est maintenant possible de créer un package spécifique de lighttpd qui par exemple pourrait être lancé chrooté, intégrant pourquoi pas une configuration très spécifique ou encore des fichiers php ou perl d'un blog ou ...

Pour approfondir nos connaissances sur la création de package Debian voir les indispensables ' Guide du nouveau responsable Debian ' et ' Référence du développeur Debian '.


Add a comment

Validator_logo
Catapulse v0.06
( 0.123396 s)