Skip to main content
Seb's blog

Créer des paquets Debian, l'empaquetage manuelle.

Je vais vous parler d'empaquetage manuelle aujourd'hui, c'est juste pour mettre en pratique ce que j'ai appris récemment et vous montrer la force des fameux paquets Debian. Je ne suis pas sûr de pouvoir faire de même avec les paquets RPM.

Pour commencer tout est faisable sur n'importe quelle distribution, que ce soit Deb, RPM ou autres, puisque l'on va utiliser des programmes de bas niveau comme ar.

Je parle d'un cas école, j'avais besoin de Discord, sur le site il nous ait proposé soit le tar soit le .deb, j'ai pris ce dernier. Ça ne marche pas, ça ne s'installe pas sur une Debian 11 à cause des dépendances notamment linindicator1 qui n'est plus disponible.

J'aurai pu m’arrêter là, aller prendre le tar et l'utiliser, même installer le snap ou le flatpak, ça aurait été plus simple mais alors qu'elle est l’intérêt d'apprendre, de comprendre et de se perfectionner. C'est vrai qu'avec l'arrivée des flatpak et snap, on se fiche de plus en plus du format de paquets de notre distribution. On va tous pouvoir aller sur une NuTyX et la blindé de ces immondes paquets universels.

Si on ouvre le fameux paquet Discord avec ark par exemple, nous donne 3 fichiers, deux archives tar ayant pour nom control et data et un fichier debian-binary. Le fichier debian-binary indique le numéro de version du format de paquet utilisé. Il ne contient qu'un nombre:

2.0

Le control.tar.gz contient deux fichiers, le control donne les informations liées au paquet (nom, version, description, dépendances, etc ...), voila son contenu:

Package: discord Version: 0.0.16 Depends: libc6, libasound2, libatomic1, libgconf-2-4, libnotify4, libnspr4, libnss3, libstdc++6, libxss1, libxtst6, libappindicator1, libc++1 Section: net Priority: optional Homepage: https://discord.com Architecture: amd64 Installed-Size: 184052 Maintainer: Discord Maintainer Team native-team@discord.com Description: Chat for Communities and Friends Discord is the easiest way to communicate over voice, video, and text. Chat, hang out, and stay close with your friends and communities.

et le fichier postinst, donne les actions que dpkg va devoir exécuter aprés l'installation:

#!/bin/sh

# os.tmpdir from node.js for OS_TMPDIR in "$TMPDIR" "$TMP" "$TEMP" /tmp do test -n "$OS_TMPDIR" && break done

# kill any currently running Discord if pgrep Discord ; then pkill Discord sleep 1 pkill -9 Discord fi

# This is probably just paranoia, but some people claim that clearing out # cache and/or the sock file fixes bugs for them, so here we go for DIR in /home/* ; do rm -rf "$DIR/.config/discordstable/Cache" rm -rf "$DIR/.config/discordstable/GPUCache" done rm -f "$OS_TMPDIR/discordstable.sock"

Enfin le data.tar.gz contient les fichiers installés par le paquet sur le système de fichier racine.

/Téléchargements/paquet$ tar tzvf data.tar.gz
drwxr-xr-x root/root 0 2021-09-22 03:20 ./ drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/ drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/bin/ drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/share/ drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/share/applications/ drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/share/discord/ -rwxr-xr-x root/root 138952064 2021-09-22 03:20 ./usr/share/discord/Discord -rwsr-xr-x root/root 15184 2021-09-22 03:20 ./usr/share/discord/chrome-sandbox -rw-r--r-- root/root 141930 2021-09-14 02:37 ./usr/share/discord/chrome_100_percent.pak -rw-r--r-- root/root 208519 2021-09-14 02:37 ./usr/share/discord/chrome_200_percent.pak -rw-r--r-- root/root 309 2021-09-22 03:20 ./usr/share/discord/discord.desktop -rw-r--r-- root/root 7009 2021-09-21 17:51 ./usr/share/discord/discord.png -rw-r--r-- root/root 10413488 2021-09-14 02:37 ./usr/share/discord/icudtl.dat -rw-r--r-- root/root 224832 2021-09-22 03:20 ./usr/share/discord/libEGL.so -rw-r--r-- root/root 7062040 2021-09-22 03:20 ./usr/share/discord/libGLESv2.so -rw-r--r-- root/root 2753360 2021-09-22 03:20 ./usr/share/discord/libffmpeg.so -rw-r--r-- root/root 4162008 2021-09-22 03:20 ./usr/share/discord/libvk_swiftshader.so drwxr-xr-x root/root 0 2021-09-22 03:20 ./usr/share/discord/locales/ -rw-r--r-- root/root 152004 2021-09-14 02:37 ./usr/share/discord/locales/am.pak -rw-r--r-- root/root 154668 2021-09-14 02:37 ./usr/share/discord/locales/ar.pak -rw-r--r-- root/root 167625 2021-09-14 02:37 ./usr/share/discord/locales/bg.pak -rw-r--r-- root/root 218688 2021-09-14 02:37 ./usr/share/discord/locales/bn.pak -rw-r--r-- root/root 106569 2021-09-14 02:37 ./usr/share/discord/locales/ca.pak -rw-r--r-- root/root 108310 2021-09-14 02:37 ./usr/share/discord/locales/cs.pak -rw-r--r-- root/root 99079 2021-09-14 02:37 ./usr/share/discord/locales/da.pak -rw-r--r-- root/root 106439 2021-09-14 02:37 ./usr/share/discord/locales/de.pak -rw-r--r-- root/root 185611 2021-09-14 02:37 ./usr/share/discord/locales/el.pak -rw-r--r-- root/root 87770 2021-09-14 02:37 ./usr/share/discord/locales/en-GB.pak -rw-r--r-- root/root 88489 2021-09-14 02:37 ./usr/share/discord/locales/en-US.pak -rw-r--r-- root/root 104092 2021-09-14 02:37 ./usr/share/discord/locales/es-419.pak -rw-r--r-- root/root 106213 2021-09-14 02:37 ./usr/share/discord/locales/es.pak -rw-r--r-- root/root 95107 2021-09-14 02:37 ./usr/share/discord/locales/et.pak -rw-r--r-- root/root 148803 2021-09-14 02:37 ./usr/share/discord/locales/fa.pak -rw-r--r-- root/root 97625 2021-09-14 02:37 ./usr/share/discord/locales/fi.pak -rw-r--r-- root/root 108331 2021-09-14 02:37 ./usr/share/discord/locales/fil.pak -rw-r--r-- root/root 114600 2021-09-14 02:37 ./usr/share/discord/locales/fr.pak [...][...][...][...][...][...][...] [...][...][...][...][...][...][...]etc ...

Comme dit au début de ce billet:

Un fichier binaire peut être manipuler sur n'importe quel unix. le fichier .deb est simplement une archive BSD ar. Elle peut donc être vu par la commande ar.

(source: http://debsousdeb.canalblog.com/archives/2006/12/08/3323926.html)

Vous pourriez créer vos fichiers.deb à la main http://tldp.org/HOWTO/html_single/Debian-Binary-Package-Building-HOWTO/ et malgré l'excellence documentation, je vais m'atteler à vous monter comment le faire ici avec ce petit tuto et notre paquet Discord.

Revenons à notre paquet Discord qui ne veut pas s'installer à cause d'une dépendances qui n'est plus dans la bonne version. Comme on a vu, on a besoin de libappindicator1 sauf que celui-ci sous Debian 11 est passé en libappindicator3. Que cela ne tienne, on va juste changer ça!

Avec l’outil que l'on veut, on va juste décompresser le paquet deb puis le control.tar.

Package: discord Version: 0.0.16 Depends: libc6, libasound2, libatomic1, libgconf-2-4, libnotify4, libnspr4, libnss3, libstdc++6, libxss1, libxtst6, libappindicator3, libc++1 Section: net Priority: optional Homepage: https://discord.com Architecture: amd64 Installed-Size: 184052 Maintainer: Discord Maintainer Team native-team@discord.com Description: Chat for Communities and Friends Discord is the easiest way to communicate over voice, video, and text. Chat, hang out, and stay close with your friends and communities.

On va modifier ce qui bloque notre installation, le fameux "libappindicator1" en "libappindicator3" puis recompresser en tar.

Enfin nous allons créer le paquet deb:

ar rcu discord_0.0.16+schav1.deb debian-binary control.tar.gz data.tar.gz

il nous reste plus qu'a vérifier rapidement si les outils dpkg reconnaissent le paquet:

$ dpkg-deb --info discord_0.0.16+schav1.deb new Debian package, version 2.0. size 77079950 bytes: control archive=741 bytes. 509 octets, 12 lignes control
530 octets, 22 lignes * postinst #!/bin/sh Package: discord Version: 0.0.16 Depends: libc6, libasound2, libatomic1, libgconf-2-4, libnotify4, libnspr4, libnss3, libstdc++6, libxss1, libxtst6, libappindicator3, libc++1 Section: net Priority: optional Homepage: https://discord.com Architecture: amd64 Installed-Size: 184052 Maintainer: Discord Maintainer Team native-team@discord.com Description: Chat for Communities and Friends Discord is the easiest way to communicate over voice, video, and text. Chat, hang out, and stay close with your friends and communities.

Il est maintenant possible d'installer le paquet comme n'importe quel autre paquet de Debian pouvu d'avoir les droits ROOT de la machine:

Installer avec dpkg -i conduira à une erreur car dpkg ne sait pas gèrer les dépendances, il faudra les installer un par un avant de le tenter.

# dpkg -i discord_0.0.16+schav1.deb Sélection du paquet discord précédemment désélectionné. (Lecture de la base de données... 293571 fichiers et répertoires déjà installés.) Préparation du dépaquetage de .../result/discord-0.0.16.deb ... Dépaquetage de discord (0.0.16) ... dpkg: des problèmes de dépendances empêchent la configuration de discord : discord dépend de libgconf-2-4 ; cependant : Le paquet libgconf-2-4 n'est pas installé. discord dépend de libc++1 ; cependant : Le paquet libc++1 n'est pas installé.

dpkg: erreur de traitement du paquet discord (--install) : problèmes de dépendances - laissé non configuré Traitement des actions différées (« triggers ») pour mailcap (3.69) ... Des erreurs ont été rencontrées pendant l'exécution : discord

On le fera avec apt install, qui lui gère les dépendances:

# apt install discord_0.0.16+schav1.deb

Commencer la discussion: Venez écrire un commentaire dans le forum