wiki/HowtoDebian/Packages.md
2018-08-26 01:46:43 +02:00

275 lines
8.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 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
<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.