4.3. RPM – Le gestionnaire de paquetages

Sous SUSE LINUX,le gestionnaire de paquetages RPM (RPM Package Manager) est chargé d'assurer la gestion des paquetages logiciels et s'appuie principalement sur les programmes rpm et rpmbuild. Ainsi, les utilisateurs et les administrateurs, sans oublier les créateurs de paquetages ont accès à toute la puissance de la base de données RPM, qu'ils peuvent interroger sans limites afin d'obtenir toutes les informations utiles sur les logiciels installés.

La commande rpm fonctionne essentiellement selon cinq modes : l'installation, la désinstallation ou la mise à jour de paquetages logiciels ; la régénération de la base de données RPM ; l'interrogation de la base de données RPM ou d'archives RPM données ; le contrôle d'intégrité des paquetages ; enfin la signature des paquetages. La commande rpmbuild est quant-à-elle chargée de générer les paquetages pouvant être installés à partir des sources originelles (pristine sources).

Les archives RPM pouvant être installées sont empaquetées dans un format binaire particulier ; elles comprennent les fichiers de programmes à installer ainsi que différentes méta-informations utilisées lors de l'installation par la commande rpm afin de configurer le paquetage logiciel concerné. Ces méta-informations sont également enregistrées dans la bases de données RPM dans une optique documentaire. Les archives RPM utilisent l'extension de fichier .rpm.

La commande rpm permet de gérer des paquetages conformes au standard LSB. Pour plus de précisions sur LSB, consultez Section A.4, « Standards et spécifications ».

[Tip]Astuce

Un nombre considérables de paquetages ont besoin de composants (bibliothèques, fichiers d'en-tête à inclure, etc.) indispensables pour le développement logiciel, et constitués en paquetages indépendants. Ces paquetages de développement sont uniquement requis par les utilisateurs désirant compiler eux-mêmes des logiciels, par exemple les nouveaux paquetages GNOME. Ces paquetages se reconnaissent généralement à leur extension -devel, pa exemple : alsa-devel, gimp-devel, et kdelibs-devel.

4.3.1. Vérification de l'authenticité d'un paquetage.

Les paquetages RPM de SUSE LINUX sont signés à l'aide de GnuPG. La clé, fingerprint compris, est :

1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA

La commande rpm --checksig apache-1.3.12.rpm permet de vérifier la signature d'un paquetage RPM, ce qui permet de s'assurer qu'il provient réellement de SUSE ou d'une autre source de confiance. Cette mesure de précaution est recommandée tout particulièrement avec les paquetages de mise à jour obtenus sur Internet. Notre clé de signature de paquetage est déposée par défaut dans /root/.gnupg/. Cette clé est également enregistrée dans le répertoire /usr/lib/rpm/gnupg/, afin de permettre aux utilisateurs normaux de vérifier par eux-même la signature des paquetages RPM.

4.3.2. Gestion des paquetages : installation, mise à jour et désinstallation

En temps normal, l'opération d'installation d'une archive RPM est simple : rpm -i paquetage.rpm. Toutefois, cette commande par défaut installe un paquetage uniquement si les dépendances sont satisfaites et s'il n'y a pas de conflit. La commande rpm affiche, le cas échéant, un message d'erreur indiquant les paquetages requis pour satisfaire les dépendances. De son côté, la base de données s'assure de l'absence de conflit : en règle générale, un fichier ne peut être rattaché qu'à un seul paquetage. Il est possible de contourner cette règle en faisant appel à différentes options pour forcer rpm à ignorer ces paramètres par défaut. Cette faculté doit toutefois être réservée aux utilisateurs avertis, en raison des conséquences qu'il peut y avoir pour les mises à jour ultérieures du système.

Les options -U ou --upgrade et -F ou --freshen sont également intéressantes pour actualiser un paquetage, par exemple : rpm -F paquetage.rpm. Cette opération supprime une éventuelle version antérieure du paquetage et installe la nouvelle version. La différence entre les deux versions est que l'option -U installe également les paquetages qui, jusqu'alors, n'étaient pas disponibles sur le système. Au contraire, l'option -F ne remplace un paquetage que s'il avait déjà été installé dans la version antérieure. Dans le même temps, la commande rpm essaye d'être respectueuse des fichiers de configuration, en utilisant la stratégie suivante :

  • Dans le cas où un fichier de configuration n'a pas été modifié par l'administrateur système, la commande rpm installe la nouvelle version du fichier correspondant. L'administrateur n'a pas à intervenir.

  • Lorsqu'un fichier de configuration a été modifié par l'administrateur, n'importe quand avant la mise à jour, la commande rpm sauvegarde dans ce cas le fichier avec l'extension .rpmorig ou .rpmsave (fichier de sauvegarde) et installe la nouvelle version à partir du paquetage RPM, dans le cas où une modification serait intervenue entre le fichier initial et le fichier provenant du paquetage de la mise à jour. Il est alors probable que vous soyez obligé d'ajuster le fichier qui vient d'être installé à l'aide de la copie de sauvegarde (.rpmorig ou .rpmsave), en fonctions de vos paramètres système. Assurez-vous ensuite d'effacer tous les fichiers .rpmorig et .rpmsave pour éviter des problèmes lors de mises à jour ultérieures.

  • Les fichiers .rpmnew sont créés chaque fois qu'il existe déjà un fichier de configuration et et que l'option noreplace a été définie dans le fichier .spec.

Lorsqu'une mise à jour a été effectuée, tous les fichiers .rpmorig, .rpmsave et .rpmnew doivent être effacés après avoir été comparés, de manière à éviter tout conflit lors des mises à jour ultérieures. L'extension .rpmorig est choisie dans le cas où le fichier était inconnu de la base de données RPM.

Dans le cas contraire, c'est l'extension .rpmsave qui est utilisée. En d'autres termes, l'extension .rpmorig est utilisée pour les mises à jour d'un format tiers vers le format RPM et l'extension .rpmsave pour les mises à jour d'un ancien RPM en un nouveau RPM. Dans le cas de l'extension .rpmnew, il n'est pas possible de déterminer si l'administrateur système a modifié le fichier de configuration ou non. Vous trouverez une liste de ces fichiers dans /var/adm/rpmconfigcheck. Gardez à l'esprit que certains fichiers de configuration (par exemple /etc/httpd/httpd.conf) sont intentionnellement laissés inchangés afin de vous permettre de continuer à travailler avec vos propres paramètres.

L'option -U n'est pas un équivalent de la séquence désinstallation, avec l'option -e et installation avec l'option -i. Chaque fois que cela est possible, il est préférable de privilégier l'option -U.

Pour supprimer un paquetage, saisissez rpm -e paquetage. Toutefois, la commande rpm ne supprime un paquetage que s'il ne subsiste plus de dépendances. Ainsi, il est théoriquement impossible de supprimer Tcl/Tk tant qu'un autre programme en a besoin. C'est d'ailleurs le rôle de la base de données RPM de veiller sur ces dépendances. Dans le cas exceptionnel où une opération de suppression s'avérerait impossible, malgré l'absence de dépendances, il peut être utile de reconstruire la base de données RPM à l'aide de l'option --rebuilddb.

4.3.3. RPM et correctifs

Afin d'assurer la sécurité de fonctionnement d'un système, il est indispensable d'intégrer régulièrement des paquetages de mise à jour dans le système afin de le mettre à jour. Jusqu'à présent, il n'était possible de corriger des bogues présents dans un paquetage qu'en remplaçant ce dernier intégralement. Lorsque l'on a affaire à des paquetages volumineux comportant des bogues dans de petits fichiers, le volume de données en cause peut devenir rapidement considérable. Cependant, SUSE propose une fonctionnalité dans RPM, permettant d'appliquer des correctifs à des paquetages.

L'exemple de pine illustre les considérations les plus intéressantes :

Le RPM correctif convient-il à mon système ?

Pour vous en assurer, vous devez dans un premier temps demander quelle est la version du paquetage. Dans le cas de l'application pine, la commande est la suivante :

rpm -q pine
pine-4.44-188

L'opération suivante consiste à examiner le correctif afin de déterminer s'il correspond précisément à cette version de pine :

rpm -qp --basedon pine-4.44-224.i586.patch.rpm
pine = 4.44-188
pine = 4.44-195
pine = 4.44-207

Ce correctif correspond à trois versions différentes de pine. La version installée dans notre cas s'y trouve également, ce qui permet d'appliquer le correctif.

Quels sont les fichiers remplacés par le correctif ?

Il est facile, à partir du RPM correctif, d'identifier les fichiers affectés par le correctif en question. Le paramètre -P de rpm sert à sélectionner des fonctions propres aux correctifs. Ainsi, la liste des fichiers est obtenue à l'aide la commande suivante :

rpm -qpPl pine-4.44-224.i586.patch.rpm
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine

ou, dans le cas où le correctif est déjà installé, avec

rpm -qPl pine
/etc/pine.conf
/etc/pine.conf.fixed
/usr/bin/pine
Comment installer un correctif RPM dans le système ?

Les correctifs RPM sont utilisés de la même manière que les RPM normaux. La seule différence est que cela implique qu'un RPM approprié ait déjà été installé.

Quels sont les correctifs qui ont déjà été installés dans le système et pour quelles versions de paquetage ?

Il est possible d'afficher une liste de tous les correctifs ayant été installés dans le système en exécutant la commande rpm -qPa. La commande se présente alors comme suit si, comme c'est le cas dans notre exemple, nous avons un système auquel un correctif a déjà été appliqué :

rpm -qPa
pine-4.44-224

Dans le cas où vous souhaiteriez savoir, après quelque temps, quelle version de paquetage a été mise en place dans un premier temps, cette information se trouve également dans la base de données RPM. Ainsi, pour pine, cette information est obtenue à l'aide de la commande :

rpm -q --basedon pine
pine = 4.44-188

Pour de plus amples informations, notamment sur la fonctionnalité des correctifs de RPM, reportez-vous aux pages de manuel de rpm et rpmbuild.

4.3.4. Paquetages RPM delta

Les paquetages « RPM delta » contiennent la différence (c'est à dire le « delta ») entre une ancienne version et une nouvelle version d'un paquetage RPM. Appliquer un RPM delta sur un ancien RPM résulte en un RPM nouveau complet ; il n'est même pas nécessaire d'avoir un copie de l'ancien RPM, un RPM delta peut également fonctionner avec le RPM installé. Les paquetages deltarpm sont même plus petits que les RPM correctifs ce qui peut représenter un avantage si vous souhaitez transférer des paquetages de mise à jour sur Internet. L'inconvénient est qu'une mise à jour où des RPM delta sont impliqués nécessitent considérablement plus de cycles CPU qu'une mise à jour avec des RPM complets ou des correctifs. Pour que YaST utilise des paquetages RPM delta lors des sessions YOU, attribuez, dans /etc/sysconfig/onlineupdate, la valeur « yes » à YOU_USE_DELTAS.

Les binaires prepdeltarpm, writedeltarpm, et applydeltarpm font partie de la suite deltarpm et vous aide lors de la création et de l'application des paquetages RPM delta. Avec les commandes suivantes, vous pouvez créer un RPM delta appelé new.delta.rpm (si old.rpm et new.rpm sont présents ):

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio

xdelta delta -0 old.cpio new.cpio delta

writedeltarpm new.rpm delta info new.delta.rpm
rm old.cpio new.cpio delta

En utilisant applydeltarpm, vous pouvez reconstruire le nouveau RPM, soit à partir du système de fichiers si l'ancien paquetage est déjà installé :

applydeltarpm new.delta.rpm new.rpm

soit en utilisant l'option -r si vous souhaitez le dériver de l'ancien RPM sans accéder au système de fichiers :

applydeltarpm -r old.rpm new.delta.rpm new.rpm

Consultez file:///usr/share/doc/packages/deltarpm/README pour des détails techniques.

4.3.5. Requêtes RPM

L'option -q (query) permet de demander des informations. Ceci vous permet d'examiner vous-même une archive RPM (en ajoutant l'option -p) et également d'interroger la base de données RPM des paquetages installés. Vous pouvez, par ailleurs, définir le type des informations à afficher à l'aide d'options supplémentaires. Voir Tableau 4.8, « Les principales options de requêtes RPM ».

Tableau 4.8. Les principales options de requêtes RPM

-i

Informations relatives à un paquetage

-l

Liste de fichiers du paquetage

-f FICHIER

Demande le paquetage qui posséde le fichier FICHIER (le chemin complet doit être spécifié avec FICHIER)

-s

Affichage de l'état des fichiers (implique -l)

-d

Affiche uniquement les fichiers de documentation (implique -l)

-c

Affiche uniquement les fichiers de configuration (implique -l)

--dump

Affiche toutes les informations (à utiliser avec -l, -c, ou -d)

--provides

Affiche les fonctionnalités du paquetage qui peuvent être demandées par un autre paquetage à l'aide du paramètre --requires

--requires, -R

Affiche les dépendances du paquetage

--scripts

Affiche les scripts d'installation (preinstall, postinstall, uninstall)

Par exemple, la commande rpm -q -i wget affiche l'information vue dans Exemple 4.2, « rpm -q -i wget ».

Exemple 4.2. rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                          License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

L'option -f fonctionne uniquement si le nom complet, incluant le chemin, est connu. Indiquez autant de noms de fichiers que vous le voulez. Par exemple, la commande :

rpm -q -f /bin/rpm /usr/bin/wget

donne le résultat suivant :

rpm-4.1.1-191
wget-1.9.1-50

Dans le cas où une partie seulement du nom du fichier est connue, il faut utiliser un script shell comme dans Exemple 4.3, « Script de recherche de paquetages ». Le nom partiel du fichier cherché doit être transmis en paramètre lors de l'appel du script.

Exemple 4.3. Script de recherche de paquetages

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" is in package:"
    rpm -q -f $i
    echo ""
done

La commande rpm -q --changelog rpm permet d'afficher précisément les informations (de mise à jour, de configuration, de modification, etc.) correspondant à un paquetage donné. Cet exemple montre les informations relatives au paquetage rpm. Toutefois, la base de données RPM n'affiche que les cinq derniers éléments. Toutes les entrées (des deux dernières années) sont contenues dans le paquetage lui-même. Cette requête ne fonctionne que lorsque le CD 1 est monté sous /media/cdrom :

rpm -qp --changelog /media/cdrom/suse/i586/rpm-4*.rpm

La base de données installée permet également de procéder à des vérifications. Ces opérations sont effectuées avec l'option -V, l'option -y ou l'option --verify. Ainsi, la commande rpm affiche tous les fichiers d'un paquetage qui ont été modifiés depuis l'installation. La commande rpm peut être complétée par des paramètres (jusqu'à huit) faisant référence aux modifications suivantes :

Tableau 4.9. Options de vérification RPM

5

Somme de contrôle MD5

S

Taille du fichier

L

Lien symbolique

T

Date/heure de modification

D

Numéros de périphérique (device numbers) majeur et mineur

U

Utilisateur (user)

G

Groupe (group)

M

Mode (droits et le type de fichier)

Un c s'affiche en plus dans le cas des fichiers de configuration. L'exemple suivant illustre des modifications du fichier /etc/wgetrc (de wget) :

rpm -V wget
S.5....T c /etc/wgetrc

Les fichiers de la base de données RPM se trouvent dans /var/lib/rpm. Avec une partition /usr de 1 Go, la base de données peut très bien occuper 30 Mo d'espace disque ; ceci est particulièrement vrai après une mise à jour complète. Dans l'éventualité où la base de données semblerait excessivement volumineuse, la solution la plus efficace consiste à utiliser l'option --rebuilddb pour créer une nouvelle base de données s'appuyant sur la base de données existante. Il est recommandé de réaliser une sauvegarde de la base de données existante avant de la reconstituer. Par ailleurs, le script cron cron.daily crée des copies quotidiennes de la base de données (comprimées avec gzip) dans /var/adm/backup/rpmdb. Leur nombre est fixé par la variable MAX_RPMDB_BACKUPS (option par défaut : 5) dans /etc/sysconfig/backup. La taille de chaque sauvegarde est en moyenne de 3 Mo pour un répertoire /usr de 1 Go.

4.3.6. Installation et compilation de paquetages sources

Tous les paquetages source de SUSE LINUX ont l'extension .src.rpm (source RPM).

[Tip]Astuce

Ces paquetages peuvent être installés avec YaST, de la même manière que pour tout autre paquetage. Cependant, les paquetages source ne sont jamais marqués comme étant installés ([i]) dans le gestionnaire de paquetages, comme c'est le cas pour les autres paquetages. La raison en est que les paquetages source ne sont pas répertoriés dans la base de données RPM. Lorsque vous installez un paquetage source, seul le code source est ajouté au système. Le logiciel lui-même doit être compilé. Seules les applications installées sont répertoriées dans la base de données RPM.

Les répertoires de travail de rpm et rpmbuild dans /usr/src/packages doivent exister (en l'absence de paramétrage personnalisé, tel qu'il peut être réalisé dans /etc/rpmrc) :

SOURCES

pour les sources originales (fichiers .tar.bz2 ou .tar.gz, etc.) ainsi que pour les adaptations propres à la distribution (généralement, fichiers .diff ou .patch).

SPECS

pour les fichiers .spec chargés de contrôler la procédure de build à la manière d'une méta-makefile.

BUILD

répertoire dans lequel les sources sont décompactées, un correctif leur est appliqué et elles sont compilées.

RPMS

répertoire dans lequel les paquetages binaires sont enregistrés

SRPMS

emplacement des RPM source

Lorsque vous installez un paquetage source avec YaST, les composants requis sont installés dans /usr/src/packages : les sources et les modifications qui y sont apportées dans SOURCES et le fichier .spec correspondant dans SPECS.

[Warning]Avertissement

Évitez de faire des expériences avec des composants système importants (glibc, rpm, sysvinit, etc.), au risque de mettre en péril le fonctionnement de votre système.

Examinons à présent le paquetage wget.src.rpm. Après avoir installé le paquetage avec YaST, nous avons les fichiers :

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

La commande rpmbuild -b X /usr/src/packages/SPECS/wget.spec lance la procédure de compilation. X est un joker pour différentes étapes du processus de build (voir l'affichage de l'option --help ou la documentation de RPM pour plus de détails). Nous nous contenterons ici de donner une explication succincte :

-bp

Prépare les sources dans /usr/src/packages/BUILD : décompacte et applique les correctifs

-bc

comme -bp, compilation en plus

-bi

comme -bc, installation en plus. Attention, dans le cas où un paquetage ne prend pas en charge la fonctionnalité BuildRoot, des fichiers de configuration importants risquent d'être écrasés !

-bb

comme -bi, avec, en outre, la création du paquetage binaire. En cas de succès de la compilation, ce fichier se trouve dans /usr/src/packages/RPMS.

-ba

comme -bb, avec, en outre, la création du paquetage source. En cas de succès de la compilation, il est enregistré sous /usr/src/packages/SRPMS.

--short-circuit

saute un certain nombre d'étapes.

Le RPM binaire créé peut finalement être installé à l'aide de la commande rpm -i ou, de préférence, à l'aide de la commande rpm -U . L'installation avec rpm le fait apparaître dans la base de données RPM.

4.3.7. Création de paquetages avec build

De nombreux paquetages présentent le risque de copier involontairement les fichiers dans le système en cours d'exécution. Pour éviter ce problème, vous pouvez utiliser build qui se charge de créer un environnement destiné à la compilation du paquetage. La mise en place de cet environnement où la racine du système est transplantée (chroot) suppose que l'on réserve une arborescence de paquetages complète pour le script build. Cette arborescence peut être créée sur un disque dur, sur un système NFS ou sur DVD. Le script obtient l'emplacement correspondant à l'aide de la commande build --rpms Chemin. Contrairement à la commande rpm, la commande build demande à ce que le fichier SPEC soit dans le même répertoire que les sources. Dans le cas où vous souhaitez recompiler wget, comme dans l'exemple précédent, et que le DVD est monté sur le système sous /media/dvd, exécutez les commandes suivantes en tant que root :

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec .
build --rpms /media/dvd/suse/ wget.spec

Un environnement minimal est ensuite mis en place dans /var/tmp/build-root. Le paquetage est construit dans cet environnement. Les paquetages ainsi créés sont ensuite enregistrés dans /var/tmp/build-root/usr/src/packages/RPMS

Le script build propose un certain nombre d'options supplémentaires. Ainsi, il est possible d'utiliser en priorité vos propres RPM, d'omettre l'initialisation de l'environnement de build ou de restreindre la commande rpm à l'un des niveaux précédemment décrits. La commande build --help et la page de manuel de build permettent d'obtenir de plus amples informations.

4.3.8. Outils pour les archives RPM et pour la base de données RPM

Midnight Commander (mc) peut afficher le contenu d'une archive RPM ou en copier des parties. Il représente ce genre d'archives à la manière d'un système de fichiers virtuel, toutes les commandes des menus de Midnight Commander étant disponibles. Les informations contenues dans les lignes d'en-tête tirées du fichier HEADER peuvent être affichées à l'aide de la touche F3. Les touches de direction et la touche Entrée permettent de naviguer dans l'arborescence de l'archive. Si nécessaire, la touche de fonction F5 permet de copier des composants.

KDE contient l'utilitaire kpackage qui est une interface pour rpm. Un module de YaST offre un gestionnaire de paquetages complet (voir Section 2.2.1, « Installer et supprimer des logiciels »).


SUSE LINUX Guide de l'administrateur 9.2