Skip to main content
Seb's blog
logo PassionGNU/Linux

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.