wiki/HowtoDebian/Packages.md

354 lines
8.7 KiB
Markdown
Raw Normal View History

2018-08-25 00:13:14 +02:00
---
categories: debian system
title: Howto Debian packages
...
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
* 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>
2016-12-29 11:25:39 +01:00
2018-09-21 10:52:12 +02:00
Debian est pourvu du meilleur format de packages : le `.deb` qui se manipule avec l'outil `dpkg`.
2018-08-25 00:13:14 +02:00
Debian possède le programme de gestion de packages le plus avancé du monde : APT (Advanced Packaging Tool).
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
## Format .deb
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
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).
2016-12-29 11:25:39 +01:00
~~~
2018-08-25 00:13:14 +02:00
$ 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
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
$ tar xvf control.tar.xz
./conffiles
./control
./md5sums
./postinst
./postrm
./preinst
./prerm
./shlibs
./triggers
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
$ 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
[…]
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Pour avoir des informations sur un paquet `.deb` :
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
~~~
$ 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
[…]
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
$ 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
[…]
2018-09-21 09:57:29 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
## dpkg
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
`dpkg` est un outil bas niveau pour manipuler des packages Debian :
2018-09-21 09:36:42 +02:00
2018-08-25 00:13:14 +02:00
Installer un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg -i foo.deb
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Dépaqueter un package sans le configurer
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg --unpack foo.deb
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Configurer un package non configuré
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg --configure foo
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Re-configurer un package déjà configuré
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg-reconfigure foo
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Re-configurer un package déjà configuré avec un maximum de questions
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg-reconfigure -plow foo
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Supprimer un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg -r foo
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Purger un package supprimé
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg -P foo
2016-12-29 11:25:39 +01:00
~~~
2018-08-25 00:13:14 +02:00
`dpkg` permet aussi d'avoir quelques informations de base :
2018-09-21 09:36:42 +02:00
2018-08-25 00:13:14 +02:00
Lister les packages installés de façon « conviviale »
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
$ dpkg -l
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Lister les packages installés de façon exhaustive
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
$ dpkg --get-selections
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Installer une liste de packages générée par "dpkg --get-selections"
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
# dpkg --merge-avail < apt-cache-dumpavail.txt
# dpkg --set-selections < dpkg-get-selections.txt
# apt dselect-upgrade
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Lister les fichiers d'un package installé
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
$ dpkg -L foo
2018-09-21 09:36:42 +02:00
~~~
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Lister les packages installé qui contiennent un fichier
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
$ dpkg -S bin/bar
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Comparer 2 versions de package en utilisant l'algorithme de dpkg
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ dpkg --compare-versions 2:1-1 gt-nl 2:1-1~0 && echo OK
2018-08-25 00:13:14 +02:00
~~~
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.
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
## apt
2016-12-29 11:25:39 +01:00
2018-08-26 01:46:43 +02:00
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` :
2017-01-14 00:06:38 +01:00
2018-08-26 01:46:43 +02:00
Donner des informations sur un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ apt-cache show foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Rechercher les packages dont le nom ou la description courte contient foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ apt-cache search foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Donner les dépendances d'un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ apt-cache depends foo
~~~
Et l'on peut installer/supprimer/etc. des paquets avec la commande `apt` :
Installer un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt install foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
2018-09-21 09:57:09 +02:00
Installer la dernière version d'un package spécifique, seulement s'il est déjà présent :
~~~
# apt install --only-upgrade foo
~~~
2018-08-26 01:46:43 +02:00
Supprimer un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt remove foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Supprimer et purger un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt purge foo
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Mettre à jour tous les packages installés (sauf si cela installe/supprime d'autres packages)
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt upgrade
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Mettre à jour tous les packages installés (même si cela installe/supprime d'autres packages)
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt dist-upgrade
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Nettoyer les packages téléchargés du cache local
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
# apt clean
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Lister des packages pouvant être mis au jour (inclus les package en hold) :
2018-09-21 09:36:42 +02:00
~~~
2018-08-25 00:13:14 +02:00
$ apt list --upgradable
2016-12-29 11:25:39 +01:00
~~~
2018-08-26 01:46:43 +02:00
On peut utiliser d'autres commandes comme `apt-get` ou `aptitude` qui offrent des options différentes :
2018-09-21 09:57:29 +02:00
Lister des packages pouvant être mis au jour (plus précis que `apt list --upgradable`)
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ aptitude upgrade -sV
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
Installer les dépendances pour recompiler un package
2018-09-21 09:36:42 +02:00
~~~
2018-08-26 01:46:43 +02:00
$ apt-get build-dep foo
~~~
2018-08-25 00:13:14 +02:00
### hold / unhold
~~~
2018-08-25 00:13:14 +02:00
# apt-mark hold foo
foo passé en figé (« hold »).
2018-08-25 00:13:14 +02:00
# apt-mark showhold
foo
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
# dpkg -l foo
hi foo […]
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
# apt-mark unhold foo
Annulation de l'état figé pour foo.
2016-12-29 11:25:39 +01:00
~~~
2018-08-26 01:46:43 +02:00
### 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
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
## Astuces
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Lister les packages installés, notamment leur pool pour différencier main/contrib/non-free :
2016-12-29 11:25:39 +01:00
~~~
2018-08-25 00:13:14 +02:00
$ dpkg --get-selections | tr '\t' ' ' | cut -d" " -f1 | cut -d: -f1 | xargs apt-cache show | grep ^Filename
2016-12-29 11:25:39 +01:00
~~~
2018-08-25 00:13:14 +02:00
### Unattended upgrades / Auto upgrades
2016-12-29 11:25:39 +01:00
2018-08-25 00:13:14 +02:00
Sur un serveur non critique (backup, dev, …) on peut vouloir faire les mises à jour automatiquement :
2017-03-15 16:29:37 +01:00
~~~
2018-08-25 00:13:14 +02:00
# apt install unattended-upgrades
# dpkg-reconfigure -plow unattended-upgrades
2017-03-15 16:29:37 +01:00
~~~
2018-08-25 00:13:14 +02:00
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.