--- categories: debian system title: Howto Debian packages ... * dpkg(1) : * apt-get(1) : * apt-cache(1) : Debian est pourvu du meilleur format de packages : le `.deb` qui se manipule avec l'outil `dpkg`. Debian possède le programme de gestion de packages le plus avancé du monde : APT (Advanced Packaging Tool). ## Format .deb Un package `.deb` est une archive au format **ar** qui contient un fichier `debian-binary` et 2 tarballs : `data.tar` (arborescence de fichiers à installer) et `control.tar` (scripts et meta-informations sur le package). ~~~ $ ar x apt_1.6.4_amd64.deb $ ls -l -rw-r--r-- 1 gcolpart evolix 6896 août 24 23:19 control.tar.xz -rw-r--r-- 1 gcolpart evolix 1305248 août 24 23:19 data.tar.xz -rw-r--r-- 1 gcolpart evolix 4 août 24 23:19 debian-binary $ tar xvf control.tar.xz ./conffiles ./control ./md5sums ./postinst ./postrm ./preinst ./prerm ./shlibs ./triggers $ tar xvf control.tar.xz ./etc/ ./etc/apt/ ./etc/apt/apt.conf.d/ ./etc/apt/apt.conf.d/01autoremove […] ./usr/ ./usr/bin/ ./usr/bin/apt ./usr/bin/apt-cache ./usr/bin/apt-cdrom ./usr/bin/apt-config ./usr/bin/apt-get ./usr/bin/apt-key ./usr/bin/apt-mark […] ~~~ Pour avoir des informations sur un paquet `.deb` : ~~~ $ dpkg-deb -I apt_1.6.4_amd64.deb nouveau paquet Debian, version 2.0. taille 1312336 octets : archive de contrôle=6896 octets. 121 octets, 4 lignes conffiles 1412 octets, 27 lignes control 11573 octets, 166 lignes md5sums 5042 octets, 137 lignes * postinst #!/bin/sh 1370 octets, 45 lignes * postrm #!/bin/sh 254 octets, 6 lignes * preinst #!/bin/sh 485 octets, 11 lignes * prerm #!/bin/sh 23 octets, 1 lignes shlibs 67 octets, 2 lignes triggers Package: apt Version: 1.6.4 Architecture: amd64 […] $ dpkg-deb -c apt_1.6.4_amd64.deb drwxr-xr-x root/root 0 2018-08-20 17:38 ./ drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/ drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/apt/ drwxr-xr-x root/root 0 2018-08-20 17:38 ./etc/apt/apt.conf.d/ -rw-r--r-- root/root 861 2018-08-20 17:38 ./etc/apt/apt.conf.d/01autoremove […] ~~~ ## dpkg `dpkg` est un outil bas niveau pour manipuler des packages Debian : Installer un package ~~~ # dpkg -i foo.deb ~~~ Dépaqueter un package sans le configurer ~~~ # dpkg --unpack foo.deb ~~~ Configurer un package non configuré ~~~ # dpkg --configure foo ~~~ Re-configurer un package déjà configuré ~~~ # dpkg-reconfigure foo ~~~ Re-configurer un package déjà configuré avec un maximum de questions ~~~ # dpkg-reconfigure -plow foo ~~~ Supprimer un package ~~~ # dpkg -r foo ~~~ Purger un package supprimé ~~~ # dpkg -P foo ~~~ `dpkg` permet aussi d'avoir quelques informations de base : Lister les packages installés de façon « conviviale » ~~~ $ dpkg -l ~~~ Lister les packages installés de façon exhaustive ~~~ $ dpkg --get-selections ~~~ Installer une liste de packages générée par "dpkg --get-selections" ~~~ # dpkg --merge-avail < apt-cache-dumpavail.txt # dpkg --set-selections < dpkg-get-selections.txt # apt dselect-upgrade ~~~ Lister les fichiers d'un package installé ~~~ $ dpkg -L foo ~~~ Lister les packages installé qui contiennent un fichier ~~~ $ dpkg -S bin/bar ~~~ Comparer 2 versions de package en utilisant l'algorithme de dpkg ~~~ $ dpkg --compare-versions 2:1-1 gt-nl 2:1-1~0 && echo OK ~~~ Les opérateurs sont : * `lt` : inférieur ("less than") * `le` : inférieur ou égal ("less than or equal") * `eq` : égal ("equal") * `ne` : différent ("not equal") * `ge` : supérieur ou égal ("greater than or equal") * `gt` : supérieur ("greater than") Les variantes `lt-nl`, `le-nl`, `ge-nl`, `gt-nl` considèrent qu'une valeur nulle est supérieure. ## apt Des ensembles de packages `.deb` sont regroupés sur un site HTTP, un CD-ROM, une clé USB, etc. Le programme APT permet de gérer ces ensembles de packages grâce à un algorithme de dépendances. Le plus classique est d'utiliser des dépôts (sites HTTP/HTTPS) qui mettent à disposition des paquets. On les définit via le fichier `/etc/apt/sources.list` ou des fichiers `/etc/apt/sources.list.d/*.list` avec des lignes du type : ~~~ deb http://pub.evolix.net/ stretch/ ~~~ On récupère la liste de ces packagess avec une certain nombre d'informations (versions, description, etc.) via un fichier `Packages.gz` en faisant la commande : ~~~ # apt update ~~~ On peut ensuite manipuler ces listes de packages téléchargées avec la commande `apt-cache` : Donner des informations sur un package ~~~ $ apt-cache show foo ~~~ Rechercher les packages dont le nom ou la description courte contient foo ~~~ $ apt-cache search foo ~~~ Donner les dépendances d'un package ~~~ $ apt-cache depends foo ~~~ Et l'on peut installer/supprimer/etc. des paquets avec la commande `apt` : Installer un package ~~~ # apt install foo ~~~ Installer la dernière version d'un package spécifique, seulement s'il est déjà présent : ~~~ # apt install --only-upgrade foo ~~~ Supprimer un package ~~~ # apt remove foo ~~~ Supprimer et purger un package ~~~ # apt purge foo ~~~ Mettre à jour tous les packages installés (sauf si cela installe/supprime d'autres packages) ~~~ # apt upgrade ~~~ Mettre à jour tous les packages installés (même si cela installe/supprime d'autres packages) ~~~ # apt dist-upgrade ~~~ Nettoyer les packages téléchargés du cache local ~~~ # apt clean ~~~ Lister des packages pouvant être mis au jour (inclus les package en hold) : ~~~ $ apt list --upgradable ~~~ On peut utiliser d'autres commandes comme `apt-get` ou `aptitude` qui offrent des options différentes : Lister des packages pouvant être mis au jour (plus précis que `apt list --upgradable`) ~~~ $ aptitude upgrade -sV ~~~ Installer les dépendances pour recompiler un package ~~~ $ apt-get build-dep foo ~~~ ### hold / unhold ~~~ # apt-mark hold foo foo passé en figé (« hold »). # apt-mark showhold foo # dpkg -l foo hi foo […] # apt-mark unhold foo Annulation de l'état figé pour foo. ~~~ ### preferences Par défaut, les packages situés sur un dépôt ont une priorité de 500. Sauf le dépôt des Backports qui a une priorité de 100. Ces priorités sont utilisées pour gérer plusieurs dépôts. On peut afficher les priorités des dépôts avec la commande : ~~~ $ apt-cache policy 100 /var/lib/dpkg/status release a=now 100 http://mirror.evolix.org/debian stretch-backports/main amd64 Packages release o=Debian Backports,a=stretch-backports,n=stretch-backports,l=Debian Backports,c=main,b=amd64 origin mirror.evolix.org 500 http://pub.evolix.net stretch/ Packages release c= origin pub.evolix.net 500 http://security.debian.org/debian-security stretch/updates/non-free amd64 Packages release v=9,o=Debian,a=stable,n=stretch,l=Debian-Security,c=non-free,b=amd64 origin security.debian.org […] ~~~ On peut réaliser du _pinning APT_ en modifiant la priorité des packages via le fichier `/etc/apt/preferences` ou des fichiers `/etc/apt/preferences.d/*`. Voici quelques informations utiles : * avec la priorité -1 un package n'est jamais installé * de 1 à 99, le package sera installé uniquement si aucune version n'est déjà installée * de 100 à 499, le package sera installé/mis à jour SAUF si il existe une version dans un autre dépôt avec priorité supérieure à 500 * de 500 à 989, le package sera installé (ou mis à jour si version plus récente) => CAS STANDARD * de 990 à 999, le package sera installé (ou mis à jour si version plus récente) même si une version par défaut a été définie (`APT::Default-Release`) * au dessus de 1000, le package sera installé ou mis à jour même si sa version est inférieure à celle installée ## Astuces Lister les packages installés, notamment leur pool pour différencier main/contrib/non-free : ~~~ $ dpkg --get-selections | tr '\t' ' ' | cut -d" " -f1 | cut -d: -f1 | xargs apt-cache show | grep ^Filename ~~~ ### Unattended upgrades / Auto upgrades Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement : ~~~ # apt install unattended-upgrades # dpkg-reconfigure -plow unattended-upgrades ~~~ La configuration se trouve dans le fichier `/etc/apt/apt.conf.d/50unattended-upgrades`. On peut choisir où envoyer le mail de rapport ou encore si on doit redémarrer la machine automatiquement si nécessaire, etc.