---
categories: debian system
title: Howto Debian packages
...

* dpkg(1) : <https://manpages.debian.org/stable/dpkg/dpkg.1.en.html>
* apt-get(1) : <https://manpages.debian.org/stable/apt/apt-get.8.en.html>
* apt-cache(1) : <https://manpages.debian.org/stable/apt/apt-cache.8.en.html>

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.
