Package Debian


 ericc    jeu. 13 oct. : 10:38
 Aucun    Tutoriels

Introduction à la création de package pour Debian et Ubuntu

Introduction à la création de package pour Debian et Ubuntu

1° Introduction

Le système de package est la base de toute distribution.
Celui-ci permet à un utilisateur (généralement "root") d'installer proprement un logiciel sur sa machine, en respectant les conventions de sa distribution (positionnement des fichiers) et surtout de le désinstaller tout aussi proprement.
Il permet aussi la gestion des versions et de mettre à jour l'ensemble des logiciels installés.
Important: le gestionnaire de package gère (dans la majorité des cas) les dépendances. A savoir, si vous désirez installer le programme "A" mais que celui-ci à besoin de "B" pour fonctionner, alors "B" sera automatiquement installé.
Dans le même ordre d'idée, il gère aussi les conflits (connu !!)

Debian et toutes les distributions dérivées (Ubuntu, Linux Mint) utilisent "dpkg" et le format de fichier .deb. (vient de Debra, qui était le prénom de la petite amie du créateur de Debian)


D'autres gestionnaires de packages connus :
emerge utilisé par Gentoo
rpm utilisé par Red Hat et beaucoup d'autres
pacman utilisé par Arch Linux


En règle générale, un package contient des binaires, le logiciel déjà compilé pour votre type de machine.
Exception notoire: emerge fournis le source code des logiciels avec les instructions pour la compilation et l'installation des différents fichiers, associé à des paramètres qui sont propre à votre machine (par exemple: type de CPU, nombre de CPU/core, ...)
Avantage: chaque logiciel est compilé spécifiquement pour votre machine.
Inconvénient : chaque mise à jour demande une recompilation et c'est parfois très long. :rzzzz:


2° Package Debian

Quelques précisions, clarifications sur le système de package de Debian:
Le gestionnaire de packages est "dpkg" et toutes les commandes associés (dpkg-*).
Apt, Dselect, Aptitude et Synaptic ne sont que des "front-end" qui apporte des fonctionnalités additionelles à dpkg comme la connexion réseau (la possibilité de downloader un package à partir d'un repository) ou une interface graphique. Mais dans tout les cas c'est dpkg qui fait le travail en arrière plan.

Quand j'ai voulu faire un package pour mon usage personnel, j'ai, bien sur, fait une recherche sur Google .... j'ai trouvé des dizaines de tutoriaux qui tous expliquaient une méthode différente, avec l'utilisation d'outils différents. wall
Au final, c'est assez confus pour un débutant !!
En fait, après réflexion, j'en ai déduit que finalement c'est assez logique.
Tout le monde n'a pas les même besoins quand il s'agit de créer un package.
A un bout, on a celui qui souhaite distribuer des fichiers simples comme des wallpapers ou des icônes, et/ou qui ne font qu' 1 ou 2 packages dans l'année.
Et à l'autre bout, on a des équipes de développeurs qui génèrent des dizaines de packages par semaines (ou par jour) comme LibreOffice ou Gnome par exemple et qui ont besoin d'un système plus ou moins automatique et robuste.

Il faut aussi considérer l'usage qu'il en sera fait !
Si vous faites un package pour votre usage personnel, il évident qu'il n'est pas nécessaire de suivre à la lettre toutes les exigence d'un package destiné à être uploader sur un repo officiel Debian et utilisé par des milliers de personnes.


3° Info techniques

Un package Debian (*.deb) n'est en fait qu'une archive compilée avec "ar" (un ancêtre de "tar", c'est pour dire comment c'est vieux smile )
Prenons un exemple:
Tout d'abord nous allons downloader le package "Hello" qui est destiné justement à ce genre de chose (montrer comment est constitué un package).
Commencons par le downloader (mais pas l'installer !) dans un répertoire temporaire
~/Temp$ aptitude download hello
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Reading extended state information
Initializing package states... Done
Get:1 http: //be.archive.ubuntu.com/ubuntu/ lucid/main hello 2.4-3 [34.3kB]
Fetched 34.3kB in 0s (707kB/s)
(cette commande fonctionne avec aptitude mais pas apt-get !!)
après moins d'1 seconde vous devriez avoir recu le package
~/Temp$ ls -l
total 36    
-rw-r--r-- 1 34266 2009-11-05 12:06 hello_2.4-3_amd64.deb

Visualisons les info de ce package :
~/Temp$ dpkg -I hello_2.4-3_amd64.deb 
 new debian package, version 2.0.
 size 34266 bytes: control archive= 585 bytes.
     713 bytes,    17 lines      control              
 Package: hello
 Version: 2.4-3
 Architecture: amd64
 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
 Original-Maintainer: Santiago Vila <sanvila@debian.org>
 Installed-Size: 648
 Depends: libc6 (>= 2.3.4), dpkg (>= 1.15.4) | install-info
 Section: devel
 Priority: optional
 Description: The classic greeting, and a good example
  The GNU hello program produces a familiar, friendly greeting.  It
  allows non-programmers to use a classic computer science tool which
  would otherwise be unavailable to them.
  .
  Seriously, though: this is an example of how to do a Debian package.
  It is the Debian version of the GNU Project's `hello world' program
  (which is itself an example for the GNU Project).

Voyons les fichiers contenu par ce package:
~/Temp$ dpkg -c hello_2.4-3_amd64.deb 
drwxr-xr-x root/root         0 2009-11-05 09:17 ./
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/doc/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/doc/hello/
-rw-r--r-- root/root      2645 2008-12-09 19:48 ./usr/share/doc/hello/NEWS
-rw-r--r-- root/root      2246 2009-11-05 09:16 ./usr/share/doc/hello/copyright
-rw-r--r-- root/root      6420 2008-12-09 19:49 ./usr/share/doc/hello/changelog.gz
-rw-r--r-- root/root      3472 2009-11-05 09:16 ./usr/share/doc/hello/changelog.Debian.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/info/
-rw-r--r-- root/root     11421 2009-11-05 09:17 ./usr/share/info/hello.info.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/man/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/man/man1/
-rw-r--r-- root/root       687 2009-11-05 09:17 ./usr/share/man/man1/hello.1.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/bin/
-rwxr-xr-x root/root     18728 2009-11-05 09:17 ./usr/bin/hello

Maintenant regardons ce que contient réellement l'archive
~/Temp$ ar -tv hello_2.4-3_amd64.deb 
rw-r--r-- 0/0      4 Nov  5 09:17 2009 debian-binary
rw-r--r-- 0/0    585 Nov  5 09:17 2009 control.tar.gz
rw-r--r-- 0/0  33488 Nov  5 09:17 2009 data.tar.gz
En fait, tout les packages Debian (binary) contiennent la même chose, ces 3 fichiers !
On peux décompresser l'archive pour voir plus précisément son contenu :
~/Temp$ ar x hello_2.4-3_amd64.deb 
~/Temp$ ls -l 
total 80    
-rw-r--r-- 1 585 2011-10-12 14:18 control.tar.gz
-rw-r--r-- 1 33488 2011-10-12 14:18 data.tar.gz
-rw-r--r-- 1 4 2011-10-12 14:18 debian-binary

le fichier "debian-binary" ne contient que "2.0", qui indique la version du packaging (pas du logiciel !!)
Cela correspond à la première ligne donnée par "dpkg -I"
~/Temp$ more debian-binary 
2.0


l'archive (tar) "control.tar.gz" contient le ou les fichiers utilisés par le gestionnaire de package pour installer les fichiers. On les appelle aussi "metadata" du package
~/Temp$ tar tvzf control.tar.gz 
drwxr-xr-x root/root         0 2009-11-05 09:17 ./
-rw-r--r-- root/root       713 2009-11-05 09:17 ./control
dans ce package, il n'y a que le fichier "control" mais il peux y avoir beaucoup d'autres fichiers comme "preinst", "postinst", prerm", "postrm" qui sont des scripts bash qui seront exécutés respectivement :
  • avant l'installation (preinst)
  • après l'installation (postinst)
  • avant la désinstallation (prerm)
  • après la désinstallation (postrm)

et qui permettent par exemple, de créer des utilisateurs ou des groupes, ou mettre un fichier dans le démarrage système, ou changer le owner (chown) de certain fichier ...etc.

l'archive (tar) "data.tar.gz" contient les fichiers qui seront installés. On parle aussi de "payload"! C'est généralement le plus gros fichier.
~/Temp$ tar tvzf data.tar.gz 
drwxr-xr-x root/root         0 2009-11-05 09:17 ./
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/doc/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/doc/hello/
-rw-r--r-- root/root      2645 2008-12-09 19:48 ./usr/share/doc/hello/NEWS
-rw-r--r-- root/root      2246 2009-11-05 09:16 ./usr/share/doc/hello/copyright
-rw-r--r-- root/root      6420 2008-12-09 19:49 ./usr/share/doc/hello/changelog.gz
-rw-r--r-- root/root      3472 2009-11-05 09:16 ./usr/share/doc/hello/changelog.Debian.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/info/
-rw-r--r-- root/root     11421 2009-11-05 09:17 ./usr/share/info/hello.info.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/man/
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/share/man/man1/
-rw-r--r-- root/root       687 2009-11-05 09:17 ./usr/share/man/man1/hello.1.gz
drwxr-xr-x root/root         0 2009-11-05 09:17 ./usr/bin/
-rwxr-xr-x root/root     18728 2009-11-05 09:17 ./usr/bin/hello
On constate que c'est exactement la liste donnée par la commande "dpkg -c"

Si vous utilisez une distro basé sur Debian, vous avez peut être remarqué que le nom des packages respectent certaines règles :
< nom du logiciel >_< version >-< DebianRevisionNumber >_< architecture >.deb
les underscores (_) et tirets (-) sont importants
le nom du logiciel peux contenir un ou plusieurs chiffres mais ils doivent être collé au nom (Gnome2)
le nom du logiciel ne peux pas commencé par un un chiffre et doit toujours être en minuscules
l'architecture indique sur pour quel type de machine le package à été concu et suivent une liste pré-établie (x86, amd64, i386, all pour applicable pour toutes les architectures)


4° Methode simple

Bien il est temps maintenant de faire notre propre package pour comprendre comment cela fonctionne.
Autant le dire tout de suite, la méthode qui suit est valide pour faire des packages simples pour vous (et vos amis) mais ne peux pas être envoyer vers un repo officiel, mais elle a l'avantage d'être simple, rapide et applicable par tout le monde


Question importante :
Pourquoi faire un package ?
Les raisons peuvent être multiple !
Vous avez trouvé un logiciel qui vous est très utile et vous voudriez en faire profiter vos amis.
Vous avez une collection de wallpaper que vous aimeriez installer entre plusieurs machines
On peux imaginer aussi de faire des packages avec les mp3 d'un album

Dans mon cas, c'est principalement pour installer la dernière version de Firefox qui est rarement disponible dans les dépôts officiels. De l'autre coté, j'ai une machine type amd64 (64bits) et je ne suis pas sur que le site officiel de Mozilla vous fournisse cette version (mais plutôt la x86 comme c'était le cas avec les versions 3.1x ) alors que la version 64bits existe depuis pas mal de temps (mais pas officiellement). Et en dernier ressort, je souhaitais pouvoir désinstaller rapidement et simplement les anciennes versions

La version officielle de Firefox, quand j'écris ces lignes, est la 7.0.1

Commençons donc par downloader l'archive.
Rendez vous à l'adresse suivante :
http://ftp.mozilla.org/pub/mozilla.org/mozilla.org/firefox/releases/
sur ce serveur, vous avez TOUTES les versions de firefox.
Celle avec un "b" dans le n° de version, sont des "beta" donc, sauf si vous êtes casse-cou, on évite !
On prend la version avec le n° le plus élevé mais sans "b", c'est à dire la 7.0.1
ensuite le type d'architecture ... linux-x86_64 pour moi
Et enfin la langue. "en-GB" en ce qui me concerne mais rien ne vous empêche de prendre "fr" wink

http://ftp.mozilla.org/pub/mozilla.org/mozilla.org/firefox/releases/7.0.1/linux-x86_64/en-GB/
dans ce répertoire, vous avez 2 fichiers:
firefox-7.0.1.tar.bz2 qui est l'archive qui nous intéresse
firefox-7.0.1.tar.bz2.asc qui est un fichier texte qui contient la signature GnuPG de la fondation Mozilla et vous permet de vérifier que l'archive est originale

on download "firefox-7.0.1.tar.bz2"

Maintenant on crée un répertoire qui va contenir nos fichiers utiliser pour construire le package:
~/Temp$ mkdir firefox7-7.0.1
Le nom du répertoire est important car cela sera aussi le nom de notre package !
J'ai utilisé "firefox7" comme nom de logiciel pour évité les conflits avec un possible package officiel qui lui s'appelle "firefox" (sous Ubuntu)
Cela me permet aussi de conserver plusieurs versions de firefox sur ma machine (firefox4, firefox5, firefox6, ...) tout en conservant la possibilité de mettre à jour une même version majeure ...
Il est important d'éviter au maximum d'utiliser un nom de package qui existe déjà dans le repo officiel, sauf si bien sur, vous êtes packager officiel pour ce package !!!
Pour éviter tout problème, vous pouvez faire un "aptitude search



0 Commentaires