Chapitre 7. Les bases du système de gestion des paquets Debian

# Chapitre 7. Les bases du système de gestion des paquets Debian

Ce chapitre touche aux mécanismes internes de bas niveau du système de gestion de paquets Debian. Si vous êtes avant tout intéressé par l'utilisation des outils appropriés, passez aux chapitres Chapitre 8, Outils de gestion des paquets Debian et Chapitre 9, Garder son système Debian à jour.

## 7.1. Qu'est ce qu'un paquet Debian ?

Les paquets contiennent généralement tous les fichiers nécessaires pour implémenter un ensemble de commandes ou de fonctionnalités. Il y a deux sortes de paquets Debian :

- Les paquets binaires contenant les exécutables, les fichiers de configuration, les pages de manuel ou d'info, les informations de copyright et d'autres documentations. Ces paquets sont distribués sous un format d'archive spécifique à Debian (voir Section 7.2, « Quel est le format d'un paquet binaire Debian ? ») ; ils sont habituellement reconnaissables par l'extension « .deb ». Ils peuvent être dépaquetés en utilisant l'utilitaire `dpkg` de Debian (éventuellement avec une interface comme apt) ; vous trouverez plus de détails dans leurs pages de manuel.

- Les paquets sources sont constitués d'un fichier `.dsc` décrivant le paquet source (incluant le nom des fichiers suivants), un fichier `.orig.tar.gz` contenant les sources originels non modifiés au format tar compressé avec gzip et habituellement, un fichier `.debian.tar.xz` contenant les modifications spécifiques à Debian par rapport aux sources d'origine. L'outil `dpkg-source` permet l'archivage et le désarchivage des sources Debian ; vous trouverez plus de détails dans les pages de manuel. (Le programme apt-get peut être utilisé comme une interface pour `dpkg-source`.)

L'installation de logiciels par le système de paquets utilise les « dependencies » qui sont définies avec attention par le responsable du paquet. Ces dépendances sont documentées dans le fichier `control` associé à chaque paquet. Par exemple, le paquet du compilateur GNU C (`gcc`) « depends » du paquet `binutils` qui contient l'éditeur de liens et l'assembleur. Si un utilisateur essaie d'installer `gcc` sans avoir préalablement installé `binutils`, le système de gestion de paquets (dpkg) renverra un message d'erreur disant qu'il a aussi besoin de `binutils` et arrêtera l'installation de `gcc`. (Cependant ceci peut être forcé par un utilisateur insistant, voir dpkg(8)). Pour plus d'informations, voir Section 7.9, « Que signifie qu'un paquet dépend (Depends), recommande (Recommends), suggère (Suggests), est en conflit (Conflicts), remplace (Replaces), casse (Breaks) ou fournit (Provides) un autre paquet ? » ci-dessous.

Les outils de gestion de paquets Debian peuvent être utilisés pour :

- manipuler ou administrer les paquets ou une partie des paquets,

- administrer les modifications locales (« overrides ») des fichiers d'un paquet,

- aider les développeurs dans la construction de paquets et

- aid users in the installation of packages which reside on a remote archive site.

## 7.2. Quel est le format d'un paquet binaire Debian ?

A Debian "package", or a Debian archive file, contains the executable files, libraries, and documentation associated with a particular program or set of related programs. Normally, a Debian archive file has a filename that ends in `.deb`.

Les mécanismes internes du format des paquets binaires Debian sont décrits dans la page de manuel de deb(5). Ce format interne est susceptible de changer (entre chaque version principale de Debian GNU/Linux), donc utilisez toujours dpkg-deb(1) si vous avez besoin d'effectuer des opérations de bas niveau sur des fichiers `.deb`.

## 7.3. Pourquoi les noms des paquets Debian sont-ils si longs ?

The Debian binary package file names conform to the following convention: <DebianPackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb

Checking the package name associated with a particular Debian archive file (.deb file) can be done in one of these ways:

- inspect the "Packages" file in the directory where it was stored at a Debian archive site. This file contains a stanza describing each package; the first field in each stanza is the formal package name.

- use the command `dpkg --info PPP_VVV-RRR_AAA.deb` (where PPP, VVV, RRR and AAA are the package name, version, revision and architecture of the package in question, respectively). This displays, among other things, the package name corresponding to the archive file being unpacked.

Le composant `VVV` est le numéro de version fourni par le développeur amont. Il n'y a pas de standard ici, donc le numéro de version peut avoir différents formats comme « 19990513 » ou « 1.3.8pre1 ».

The `RRR` component is the Debian revision number, and is specified by the Debian developer (or a user who chooses to rebuild the package locally). This number corresponds to the revision level of the Debian package, thus, a new revision level usually signifies changes in the Debian Makefile (`debian/rules`), the Debian control file (`debian/control`), the installation or removal scripts (`debian/p*`), or in the configuration files used with the package.

The `AAA` component identifies the processor for which the package was built. This is commonly `amd64`, which refers to AMD64, Intel 64 or VIA Nano chips. For other possibilities review Debian's archive directory structure at Section 6.7, « What are all those directories at the Debian archives? ». For details, see the description of "Debian architecture" in the manual page dpkg-architecture(1).

## 7.4. Qu'est ce qu'un fichier de contrôle ?

Des détails concernant le contenu du fichier `control` Debian sont fournis dans la charte Debian, au chapitre cinq, voir Section 12.1, « Quelles autres documentations existent sur le système Debian ? ».

Brièvement, un fichier `control` est montré ci-dessous pour le paquet Debian hello :

    Package: hello
    Version: 2.9-2+deb8u1
    Architecture: amd64
    Maintainer: Santiago Vila <sanvila@debian.org>
    Installed-Size: 145
    Depends: libc6 (>= 2.14)
    Conflicts: hello-traditional
    Breaks: hello-debhelper (<< 2.9)
    Replaces: hello-debhelper (<< 2.9), hello-traditional
    Section: devel
    Priority: optional
    Homepage: https://www.gnu.org/software/hello/
    Description: example package based on GNU hello
     The GNU hello program produces a familiar, friendly greeting.  It
     allows non-programmers to use a classic computer science tool which
     would otherwise be unavailable to them.
     .
     Seriously, though: this is an example of how to do a Debian package.
     It is the Debian version of the GNU Project's "hello world" program
     (which is itself an example for the GNU Project).

Le champ « Package » contient le nom du paquet. C'est le nom par lequel les outils de gestion de paquets peuvent le manipuler. Il est habituellement similaire mais pas nécessairement le même que la première chaîne composant le nom de l'archive Debian.

Le champ de « Version » donne le numéro de version du développeur amont et (dans le dernier composant) le niveau de révision du paquet de Debian de ce programme comme expliqué dans Section 7.3, « Pourquoi les noms des paquets Debian sont-ils si longs ? ».

Le champ « Architecture » indique pour quel processeur ce binaire particulier a été compilé.

Le champ « Depends » donne une liste des paquets qui doivent être installés afin d'installer ce paquet avec succès.

Le champ « Installed-Size » indique l'espace disque utilisé par le paquet une fois installé. Ceci est prévu pour être employé par les programmes d'installation pour vérifier s'il y a suffisamment d'espace disque disponible pour installer le programme.

The Section line gives the "section" where this Debian package is stored at the Debian archive sites.

Le champ « Priority » indique l'importance de l'installation d'un paquet, de sorte que des logiciels semi-intelligents comme apt ou aptitude peuvent trier les paquets dans une catégorie, par exemple les paquets installés facultativement. Voir Section 7.7, « Qu'est ce qu'un paquet Essential, Required, Important, Standard, Optional ou Extra ? ».

Le champ « Maintainer » contient l'adresse électronique de la personne actuellement responsable de la maintenance du paquet.

Le champ « Description » fournit un bref résumé des fonctionnalités du paquet.

Pour plus d'informations sur les champs disponibles dans un paquet, reportez-vous au chapitre 5 de la charte Debian, « Fichiers control et leurs champs », consultez Section 12.1, « Quelles autres documentations existent sur le système Debian ? ».

## 7.5. Qu'est ce qu'un Debian conffile ?

Conffiles est une liste de fichiers de configuration (habituellement placés dans `/etc`) que le système de gestion de paquets n'écrasera pas lors de la mise à jour du paquet. Ceci s'assure que les valeurs locales pour ces fichiers seront préservées et c'est un dispositif critique permettant la mise à niveau des paquets sur un système en fonctionnement.

Pour déterminer exactement quels fichiers sont préservés pendant la mise à jour, lancez :

    dpkg --status package

et regardez la section « Conffiles: ».

## 7.6. Qu'est-ce qu'un script Debian preinst, postinst, prerm et postrm ?

Ces fichiers sont des scripts exécutables qui sont lancés automatiquement avant ou après l'installation d'un paquet. Avec le fichier appelé `control`, tous ces fichiers font partie de la section « control » d'une archive Debian.

Les fichiers individuels sont :

preinst

  Ce script est exécuté avant le dépaquetage depuis le fichier Debian (« .deb ») du paquet auquel il appartient. Beaucoup de scripts « preinst » arrêtent les services des paquets qui sont mis à niveau jusqu'à ce que leurs installations ou leurs mises à niveau soient terminées (suivant le succès de l'exécution du script « postinst »).

postinst

  This script typically completes any required configuration of the package `foo` once `foo` has been unpacked from its Debian archive (".deb") file. Many 'postinst' scripts execute any commands necessary to start or restart a service once a new package has been installed or upgraded.

prerm

  Ce script arrête généralement tous les démons qui sont associés au paquet. Il est exécuté avant la suppression des fichiers associés au paquet.

postrm

  Ce script modifie généralement les liens ou les autres fichiers associés à `foo` et/ou supprime les fichiers créés par le paquet (Voir aussi Section 7.8, « Qu'est-ce qu'un paquet virtuel ? ».)

Actuellement tous les fichiers de contrôle se trouvent dans le répertoire `/var/lib/dpkg/info`. Les fichiers concernant le paquet `foo` commencent par le nom « foo » et sont suivis par les extensions « preinst », « postinst », etc. Le fichier `foo.list` de ce répertoire liste tous les fichiers installés par le paquet `foo`. (Notez que l'emplacement de ces fichiers est interne à dpkg ; vous ne devriez pas compter sur eux).

## 7.7. Qu'est ce qu'un paquet Essential, Required, Important, Standard, Optional ou Extra ?

À chaque paquet Debian est assignée une priorité par les développeurs de la distribution, c'est une aide pour le système de gestion de paquets. Les priorités sont :

- Nécessaire (Required) : paquets nécessaires pour le fonctionnement correct du système.

  Ceci inclut tous les outils nécessaires pour la réparation d'un système défectueux. Vous ne devez pas supprimer ces paquets ou votre système risque de devenir complètement instable et vous ne pourrez probablement pas utiliser dpkg pour corriger cela. Avec seulement les paquets nécessaires, le système sera probablement inutilisable mais il aura suffisamment de fonctionnalités pour permettre de démarrer et d'installer plus de logiciels.

- Important : paquets devant être présents sur tous systèmes de type Unix

  Les autres paquets sans lesquels le système ne fonctionnera pas correctement ou ne sera pas utilisable ont cette priorité. Ceci n'inclut PAS Emacs, X, TeX ou aucune autre grosse application. Ces paquets constituent seulement l'infrastructure de base.

- Standard packages are standard on any Linux system, including a reasonably small but not too limited character-mode system. Tools are included to be able to send e-mail (with mutt) and download files from archive servers.

  C'est ce qui sera installé par défaut si les utilisateurs ne sélectionnent rien. Cela n'inclut pas les grosses applications, mais intègre l'interpréteur Python et certains serveurs comme OpenSSH (pour l'administration à distance) et Exim (pour la livraison des courriels, même s'il peut être configuré en mode local uniquement). Sont également intégrées certaines documentations générales considérées utiles par la plupart des utilisateurs.

- Les paquets optionnel (Optional) incluent tout ce que vous pourriez raisonnablement vouloir installer si vous ne savez pas ce que c'est ou n'avez pas de besoins spécialisés.

  Ceci inclut X, une distribution TeX complète et beaucoup d'applications.

- Extra : paquets qui entrent en conflit avec d'autres ayant des priorités plus élevées ou ayant des conditions particulières qui les rendent peu convenables pour être optionnels. Ils sont utiles seulement si vous savez déjà ce qu'ils font.

Si vous faites une installation Debian par défaut, tous les paquets ayant une priorité standard ou supérieure seront installés sur votre système. Si vous choisissez des tâches prédéfinies, vous obtiendrez aussi les paquets de priorité plus faible.

De plus, certains paquets sont marqués comme essentiels (Essential) puisqu'ils sont absolument nécessaires pour un fonctionnement correct du système. Les outils de gestion de paquets refuseront de les supprimer.

## 7.8. Qu'est-ce qu'un paquet virtuel ?

Un paquet virtuel est un nom générique qui s'applique à n'importe quel groupe de paquets fournissant une fonctionnalité de base semblable. Par exemple, les programmes `konqueror` et `firefox-esr` sont des navigateurs Internet, et ils devraient donc satisfaire les programmes ayant besoin d'un navigateur Web sur le système pour être utiles ou opérationnels. Ils fournissent donc tous deux le « paquet virtuel » `www-browser`.

De la même façon, `exim4` et `sendmail` fournissent tous les deux les fonctionnalités d'un agent de transport de courrier électronique. Les deux sont donc capables de fournir le paquet virtuel « mail-transport-agent ». Si l'un ou l'autre est installé, alors n'importe quel programme exigeant l'installation d'un agent de transport de courrier électronique sera satisfait par l'existence de ce paquet virtuel.

Debian fournit un mécanisme qui fait que, si plus d'un paquet fournissant le même paquet virtuel est installé sur le système, alors, les administrateurs peuvent choisir leur paquet préféré. La commande appropriée est `update-alternatives` ; elle est décrite plus loin dans Section 11.11, « Certains utilisateurs apprécient mawk, d'autres gawk ; certains utilisent vim, d'autres elvis ; certains préfèrent trn, d'autres tin ; comment Debian gère-t-elle la diversité ? ».

## 7.9. Que signifie qu'un paquet dépend (Depends), recommande (Recommends), suggère (Suggests), est en conflit (Conflicts), remplace (Replaces), casse (Breaks) ou fournit (Provides) un autre paquet ?

Le système de paquet Debian a une gamme de « dépendances » sur les paquets qui permet d'indiquer (avec un simple drapeau) à quel niveau un programme A peut fonctionner indépendamment de l'existence du programme B sur un système donné :

- Le paquet A dépend du paquet B si B doit absolument être installé pour pouvoir exécuter A. Dans certains cas, A dépend non seulement de B mais d'une version de B. Dans ce cas, la dépendance de version est une limite basse, dans le sens que A dépend de toutes versions plus récentes que celle spécifiée.

- Le paquet A recommande le paquet B si le responsable du paquet pense que la plupart des utilisateurs ne voudraient pas A sans avoir également la fonctionnalité fournie par B.

- Le paquet A suggère le paquet B si B contient des fichiers qui sont liés aux (et augmentent habituellement) fonctionnalités de A.

- Le paquet A est en conflit avec le paquet B quand A ne peut pas fonctionner si B est installé sur le système. Le plus souvent les conflits sont des cas où A contient des fichiers qui sont une amélioration de ceux de B. Le conflit est souvent combiné avec le remplacement.

- Le paquet A remplace le paquet B quand les fichiers installés par B sont supprimés et (dans certains cas) écrasés par les fichiers de A.

- Le paquet A casse le paquet B quand les deux paquets ne peuvent pas être simultanément configurés. Le système de gestion des paquets refusera d'installer l'un des paquets si l'autre est déjà installé et configuré dans le système.

- Le paquet A fournit le paquet B quand tous les fichiers et toutes les fonctionnalités de B sont incorporés dans A. Ce mécanisme fournit aux utilisateurs ayant une contrainte d'espace disque un moyen d'obtenir seulement la partie du paquet dont ils ont vraiment besoin.

Vous pouvez trouver des informations plus détaillées sur l'utilisation de chacun de ces termes dans la charte Debian, chapitre 7.2 « Dépendances binaires », voir Section 12.1, « Quelles autres documentations existent sur le système Debian ? ».

## 7.10. Quel est le sens de « Pre-Depends » ?

« Pre-Depends » est une dépendance particulière. Dans le cas de la plupart des paquets, `dpkg` dépaquètera les fichiers d’archive (c'est-à-dire les fichiers `.deb`) indépendamment de l'existence sur le système des fichiers dont il dépend. De manière simpliste, le dépaquetage signifie que `dpkg` extraira à partir du fichier d’archive les fichiers qui sont censés être installés sur votre système de fichiers et les mettra à leur place. Si ces paquets dépendent de l'existence d'autres paquets sur votre système, `dpkg` refusera d'achever l'installation (par l'exécution de l'action de « paramétrage ») jusqu'à ce que les autres paquets soient installés.

Cependant, pour certains paquets, `dpkg` refusera de les désarchiver jusqu'à ce que certaines dépendances soient résolues. De tels paquets sont dits « Pré-dépendants » de la présence de quelques autres paquets. Le projet Debian fournissait ce mécanisme pour gérer la mise à jour de systèmes utilisant le format `a.out` vers le format `ELF`, où l'ordre de désarchivage était critique. Il y a d'autres situations de mise à jour où cette méthode est utile, par exemple pour les paquets ayant une priorité « required » et des dépendances sur la libc.

Comme ci-dessus, une information plus détaillée sur l'utilisation de ce terme peut être trouvée dans la charte Debian.

## 7.11. Quelle est la signification de unknown, install, remove, purge et hold dans le statut du paquet ?

Ces drapeaux « want » indiquent ce que l'utilisateur a voulu faire d'un paquet (ce qu'il a indiqué en lançant `dpkg`, `apt` ou`aptitude`).

Leurs significations sont :

- unknown - L'utilisateur n'a jamais indiqué s'il souhaitait le paquet.

- install - L'utilisateur souhaite installer ou mettre à jour le paquet.

- remove - L'utilisateur souhaite supprimer le paquet, mais ne désire pas effacer les fichiers de configuration existants.

- purge - L'utilisateur souhaite supprimer le paquet complètement, incluant ses fichiers de configuration.

- hold - L'utilisateur ne souhaite pas traiter le paquet, c'est-à-dire qu'il veut conserver la version courante avec l'état actuel de celui-ci.

## 7.12. Comment est-ce que je mets un paquet en « hold » ?

Il y a trois moyens de bloquer un paquet, avec dpkg, apt ou aptitude.

Avec dpkg, vous devez exporter la liste de sélection des paquets, avec la commande :

    dpkg --get-selections \* > selections.txt

puis éditer le fichier `selections.txt`, changer la ligne contenant le paquet que vous souhaitez conserver, par exemple pour `libc6`, de ceci :

    libc6                                           install

à ceci :

    libc6                                           hold

sauvegarder le fichier et le recharger dans la base de données de dpkg avec :

    dpkg --set-selections < selections.txt

Avec apt, vous pouvez conserver un paquet en faisant

    apt-mark hold nom_paquet

et enlever le drapeau « hold » avec

    apt-mark unhold nom_paquet

Avec aptitude, vous pouvez conserver un paquet en faisant

    aptitude hold package_name

et enlever le drapeau « hold » avec

    aptitude unhold package_name

## 7.13. Comment est-ce que j'installe un paquet source ?

Les paquets sources Debian ne peuvent pas être véritablement installés, ils sont seulement dépaquetés dans n'importe quel répertoire où vous voulez en construire les paquets binaires.

Les paquets sources sont distribués sur la plupart des serveurs où vous pouvez obtenir les paquets binaires. Si vous configurez votre fichier sources.list(5) pour APT en ajoutant les lignes « deb-src » appropriées, vous pourrez facilement télécharger toutes les sources des paquets en lançant la commande

    apt-get source foo

Pour vous aider à la construction finale du paquet source, les paquets source de Debian fournissent un mécanisme qu'on appelle les dépendances de construction (build-dependencies). Cela signifie que le responsable du paquet tient une liste des autres paquets nécessaires à la construction du paquet. Pour voir comment cela fonctionne, exécutez

    apt-get build-dep foo

avant de construire les sources.

## 7.14. Comment est-ce que je peux construire les paquets binaires depuis les paquets sources ?

La méthode recommandée est d'utiliser les différents outils de haut-niveau (« wrappers »). Voici comment faire en utilisant les outils `devscripts`. Installez le paquet si cela n'est pas déjà fait.

Maintenant, commencez par récupérer le paquet source :

    apt-get source foo

puis entrez dans l'arborescence source :

    cd foo-*

Puis installez les dépendances de construction nécessaires (s'il y en a) :

    sudo apt-get build-dep foo

Puis créez une version particulière de votre propre construction (afin de ne pas les confondre plus tard lorsque Debian publiera sa propre nouvelle version) :

    dch -l local 'Blah blah blah'

Et enfin construisez votre paquet :

    debuild -us -uc

Si tout a correctement fonctionné, vous devriez pouvoir installer votre paquet avec la commande :

    sudo dpkg -i ../*.deb

Si vous préférez effectuer les opérations vous-même et ne voulez pas utiliser `devscripts`, suivez cette procédure :

Vous aurez besoin de tous les fichiers foo_*.dsc, foo_*.tar.gz et foo_*.debian.tar.xz pour compiler les sources (remarquez que pour certains paquets il n'y a pas de fichier .debian.tar.xz, ce sont les paquets natifs à Debian).

Une fois que vous les avez récupérés (voir Section 7.13, « Comment est-ce que j'installe un paquet source ? »), si vous avez le paquet `dpkg-dev` installé, la commande suivante :

    dpkg-source -x foo_version-revision.dsc

désarchivera le paquet dans un répertoire nommé `foo-version`.

Si vous souhaitez juste compiler le paquet, vous devez vous placer dans le répertoire `foo-version` et lancer la commande

    dpkg-buildpackage -rfakeroot -b

pour construire le paquet (notez que le paquet `fakeroot` est aussi nécessaire) et faites

    dpkg -i ../foo_version-revision_arch.deb

pour installer le nouveau paquet.

## 7.15. Comment est-ce que je crée un paquet Debian ?

Pour une description plus détaillée, lisez le « guide des nouveaux responsables Debian », disponible dans le paquet `maint-guide` ou le guide pour les responsables Debian à l'adresse https://www.debian.org/doc/devel-manualsdebmake-doc.

Chapitre 6. The Debian archives |  | Chapitre 8. Outils de gestion des paquets Debian