Qu'est-ce qu'un paquet

paquetLe besoin se résume ainsi:

Disposer d'un moyen simple et efficace pour installer un logiciel sur un système Unix/Linux.

L'installation d'un logiciel peut en réalité se résumer à un déploiement de fichiers (un script, un binaire, des bibliothèques, etc) qui devront être placés aux bons endroits. De ce fait, une simple archive compressée (ou pas) à longtemps servit (et sert encore) de paquet. Il s'agit du bon vieux fichier .tar, qui a comme unique mérite d'être extrêmement simple.

Mais un paquet peut (ou même doit) être plus évolué afin de répondre à des besoins d'exploitation élementaires. Il s'agit en fait de s'assurer que le logiciel ainsi fournit fonctionnera correctement et/ou ne mettra pas en péril le fonctionnement du système. Un paquet évolué doit donc:

  • définir clairement les pré-requis nécessaires à son fonctionnement (les dépendances)
  • préciser ce qu'il fournit (pour répondre aux dépendances des autres paquets)
  • préciser son nom, sa version, un descriptif éventuel
  • si besoin, pouvoir exécuter des scripts
  • fournir la liste des fichiers contenus dans le paquet
  • maintenir à jour une base de données des paquets installés sur le système.

Les paquets des Unix et distributions GNU/Linux répondent aujourd'hui à tous ces critères. Ce billet abordera plus particulièrement les paquets RPM (RedHat Package Manager).

Les paquets RPMs

Les paquets RPMs ont servis de base à la distribution GNU/Linux RedHat mais servent maintenant dans bien d'autres distributions Linux (Fedora, Novell SUSE, Mandriva, etc) et même certains Unix (AIX?).

Un paquet RPM est en fait un fichier, constitué de deux parties:

  1. une entête qui contient toutes les informations qui répondent aux besoins cités plus haut
  2. une partie compressée (format cpio) contenant les fichiers qui seront deployés

Les paquets RPMs ayant été conçus pour les distributions GNU/Linux, ils répondent aussi au besoin de fournir avec tout logiciel les sources de celui-ci. Un paquet RPM est donc pour celà issu d'un paquet Source-RPM (SRPM). Ce paquet SRPM contient les sources du logiciel si c'est possible, et/ou les éléments permettant en tout cas de reconstruire simplement le ou les paquets RPMs. Nous verrons surement plus en détails la construction de paquet RPM dans un autre billet.

La commande "rpm"

terminalCette commande permet d'interagir non seulement avec les paquets RPM mais aussi avec la base de données (rpmdb) centralisant les paquets installés sur le système. On utilisera donc cette commande pour installer, mettre à jour ou supprimer un paquet, mais aussi pour connaitre les paquets installés, leurs informations etc.

La commande rpm va donc lire l'entête d'un fichier RPM, comparer ces informations avec celles dans la base de données centrale afin de s'assurer que l'ajout ou le retrait du paquet ne posera pas de problème. A la moindre erreur, la commande rpm refuse de continuer. En effet, ce n'est pas son rôle de tenter de résoudre les éventuels problèmes de dépendances etc. Il existe pour cela des gestionnaires de paquets tel que urpmi, up2date, yum, etc.

En dehors des vérifications au niveau des pre-requis, la commande rpm trouve dans l'entête du paquet d'éventuels scripts à exécuter. Ceci est très utile pour les cas où déposer simplement des fichiers ne suffit pas. On ajoute un utilisateur, on active/desactive des services, bref cela apporte énormement de souplesse. De plus les scripts à executer peuvent être differenciés en fonction du type d'action que le paquet RPM subit, c'est à dire s'il s'agit d'une installation, d'une mise à jour ou d'une suppression.

Voici un exemple de scripts sur un paquet RPM pour un service de licence (FlexLM):

preinstall scriptlet (using /bin/sh):
useradd flexnet 2>/dev/null || :
echo "N'oubliez pas de copier le fichier license.dat dans /etc/flex"
postinstall scriptlet (using /bin/sh):
/sbin/chkconfig --add flexlm
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ] ; then
        /sbin/service flexlm stop >/dev/null 2>&1
        chkconfig --del flexlm 
fi
postuninstall scriptlet (using /bin/sh):
if [ $1 -ge 1 ]; then
  /sbin/service flexlm condrestart >/dev/null 2>&1
fi

Pour terminer voici les commandes RPM les plus utiles, pour les autres elles sont toutes présentées dans les manpages concernant RPM.

Interrogation de la base

Afficher tous les RPMs installés:

rpm -qa

Connaitre la version d'un RPM installé:

rpm -q <nom du paquet>

Afficher les informations d'un RPM installé:

rpm -qi <nom du paquet>

Afficher les dépendances d'un RPM installé:

rpm -qR <nom du paquet>

Interrogation d'un RPM

On retrouve les mêmes options, avec l'ajout du "-p" pour indiquer le fichier .rpm à interroger.

Afficher les informations du RPM:

rpm -qpi <fichier.rpm>

Afficher les dépendances du RPM:

rpm -qpR <fichier.rpm>

Afficher les scripts à executer lors de la manipulation du RPM:

rpm -qpi <fichier.rpm> --scripts

Afficher le journal des modifications (changelog) du RPM:

rpm -qp <fichier.rpm> --changelog

Interaction sur les RPMs

Installer un RPM:

rpm -ivh <fichier.rpm>

Mettre à jour un RPM:

rpm -Uvh <fichier.rpm>

Supprimer un paquet, comme celui-ci est installé et donc renseigné dans la base centrale on passe par son nom et non pas par le fichier:

rpm -e <nom du paquet>