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
.
1 |
$ mkdir dme-sys-base_1.0-1 && cd 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
:
1 2 3 4 5 |
$ mkdir DEBIAN $ touch DEBIAN/{control,postinst} $ chmod +x DEBIAN/postinst |
Mon fichier DEBIAN/control
va définir les paquets que je souhaite avoir sur mes machines grâce à la directive Depends :
1 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#!/bin/bash # # History # # 2016-02-13: Created the package # # Activate colors in Bash for future users sed -i \ "s/#force_color_prompt=yes/force_color_prompt=yes/m" \ /etc/skel/.bashrc # Activate colors in Vim default configuration sed -i \ "s/\"syntax on/syntax on/m" \ /etc/vim/vimrc # Ensures SSH allows pubkey authentication sed -i \ "s/PubkeyAuthentication no/PubkeyAuthentication yes/m" /etc/ssh/sshd_config # Ensures SSH allows RSA authentication sed -i \ "s/RSAAuthentication no/RSAAuthentication yes/m" /etc/ssh/sshd_config |
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 :
1 |
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 deschown
dans un script de post-installation; le fameuxDEBIAN/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 :
1 |
$ sudo chown --recursive root: dme-sys-base_1.0-1 |
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 :
1 |
Installation
L’installation d’un paquet Deb est on ne peut plus simple :
1 |
$ sudo dpkg -i dme-sys-base_1.0-1.deb |
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 :
1 |
$ sudo apt-get -f install |
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.
2 commentaires