Login Logout

Howto Debian packages

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

https://manpages.debian.org/stable/apt/apt_preferences.5.fr.html

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.