Paquet Debian

Créer un paquet Deb

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Créer un paquet Deb en tant que contributeur Debian, c’est compliqué. Mais en dehors de la contribution, lorsque l’on fixe soi-même les règles, cela peut être très simple. Malheureusement la plupart des tutoriels parlent du premier cas d’usage.

Nous allons voir comment créer des paquets Deb dans un cadre personnel, ou professionnel. Cette procédure sera valable pour toute distribution Linux basée sur Debian (Debian, Raspbian, Ubuntu, etc).

On trouve généralement 3 fonctions particulièrement intéressantes dans un paquet Deb :

  • Définir des dépendances entre paquets
  • Installer des fichiers
  • Exécuter des scripts

Ces fonctions peuvent êtres employées ensemble ou séparément. L’exemple que je vais prendre ici installera des dépendances et exécutera des scripts, mais n’installera aucun nouveau fichier. Il s’agira d’un script de configuration du système comme j’en déploie sur toute nouvelle machine virtuelle ou physique. Deux fichiers texte me suffiront pour faire cela.

Par convention, on nomme un paquet de la façon suivante : [nom du paquet]_[version]-[révision] :

  • Nom du paquet correspond au nom du logiciel que l’on package ou décrit ce que fait le paquet.
  • Version est la version du logiciel contenu dans le paquet, le cas échéant.
  • Révision est la version du packaging. Lorsque l’on refait le packaging (mise à jour des scripts par exemple), on incrémente la révision.

Préparation

Je crée ici un paquet qui appliquera la personnalisation de base de tout nouveau système que je prépare. Je décide de l’appeler dme-sys-base_1.0-1.

Tout paquet Deb contient des méta-données. Elles sont situées dans un dossier DEBIAN (peu importe la distribution), qui contiendra les fichiers suivants :

  • control (obligatoire) : Méta données du paquet (nom, version, responsable, description, etc). Son format est documenté dans la page man deb-control (5).
  • conffiles : Liste des fichiers du paquet qui doivent être considérés comme des fichiers de configuration. Ces fichiers, par exemple, demanderont confirmation avant d’être écrasés.
  • preinst : Script à exécuter avant l’installation du paquet. Doit être exécutable lorsqu’il existe. Permet par exemple de sauvegarder des éléments avant que le paquet ne les écrase.
  • postinst : Script à exécuter après l’installation du paquet. Doit être exécutable lorsqu’il existe. Permet par exemple de corriger le propriétaire des fichiers installés.
  • prerm : Script à exécuter avant suppression du paquet. Doit être exécutable lorsqu’il existe.
  • postrm : Script à exécuter après suppression du paquet. Doit être exécutable lorsqu’il existe.

Dans mon exemple, je vais définir les fichiers control et postinst :

Mon fichier DEBIAN/control va définir les paquets que je souhaite avoir sur mes machines grâce à la directive Depends :

Les directives Section et Priority sont déclarées optionnelles dans deb-control (5). Cependant, si on compte, comme c’est mon cas, mettre en place un serveur apt pour héberger les paquets, elles deviennent obligatoires.

Mon fichier postinst va modifier la configuration du système pour y appliquer mes préférences. Je préfère utiliser sed pour faire du find/replace dans des fichiers de configuration que d’écraser ces fichiers. Si j’applique ces commandes sur un système qui n’est pas configuré de la façon habituelle, je ne risque pas de tout planter.

Dans un paquet Deb, les fichiers à la racine du paquet seront installées à la racine du système de fichier. Par exemple, si je crée un fichier etc/hosts dans dme-sys-base_1.0-1, il sera installé dans /etc/hosts sur la machine où je déploie le paquet. Mais comme je l’ai écris plus haut, mon paquet d’exemple n’installera aucun fichier.

État des lieux :

Compilation

Avant de compiler, nous allons faire quelques vérifications :

  • Dans notre paquet, nous avons bien un dossier DEBIAN, contenant des fichiers qui font partie de la liste déjà vue précédemment (control, conffiles, preinst, postinst, prerm, postrm).
  • Si notre paquet contient l’un des scripts preinst, postinst, prerm, postrm, ceux-ci sont bien exécutables.
  • Tout le contenu de notre paquet appartient à root. Root est un compte particulier. Il existe sur toutes les machines Linux, et a comme uid zéro (comme son groupe). C’est une constante. Si je crée le paquet avec mon uid, disons 1000; rien ne me dit que le uid de mon compte sur une autre machine sera le même (est-ce que mon compte existe seulement ?). Et dans une archive, les propriétaires sont stockés par leurs uid et gid, pas par les noms des comptes utilisateurs ou des groupes. Si je veux que des fichiers appartiennent à dmeziere sur la machine de destination, je place des chown dans un script de post-installation; le fameux DEBIAN/postinst. Puisque ces scripts sont lancés sur la machine cible, ils retrouveront les bons uid qui correspondent au compte dmeziere, s’il existe.

Je corrige donc ce point :

Mon paquet est prêt à être compilé.

La compilation d’un paquet Deb se fait avec dpkg-deb, documenté par la page man dpkg-deb (1). Voici la syntaxe dans mon cas :

Installation

L’installation d’un paquet Deb est on ne peut plus simple :

Sauf que si votre paquet a des dépendances, dpkg n’est pas conçu pour les résoudre. Et donc il vous insultera.

Vous pourrez alors faire appel à son ami apt-get, qui lui, a été conçu pour :

Dans un prochain article, nous allons voir comment créer un dépôt Apt afin d’installer nos paquets et de résoudre leurs dépendances en une seule commande.

Facebooktwittergoogle_plusredditpinterestlinkedinmail

2 commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *