--- categories: debian system title: Howto Debian packages ... * dpkg(1) : * apt-get(1) : * apt-cache(1) : Debian possède le 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 ~~~ ## 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 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.