←Retour aux articles
•5 min read

Le gestionnaire de paquets RPM : présentation et création de votre propre paquet

RPMLinuxFedoraPackaging

Qu'est-ce que RPM ?

RPM (à l'origine Red Hat Package Manager, aujourd'hui officiellement « RPM Package Manager ») est le système de paquets utilisé par Red Hat Enterprise Linux, Fedora, CentOS Stream, Rocky Linux, AlmaLinux, openSUSE et de nombreuses autres distributions. Il gère l'installation, la mise à jour, l'interrogation, la vérification et la suppression des logiciels.

Un fichier .rpm est une archive qui contient :

  • Les fichiers à installer (binaires, configurations, documentation)
  • Des métadonnées : nom, version, licence, description, architecture
  • Les dépendances : ce dont le paquet a besoin et ce qu'il fournit
  • Des scripts exécutés avant ou après l'installation ou la suppression
  • Une signature pour vérifier son origine

RPM vs DNF/YUM

On confond souvent ces outils :

  • RPM est l'outil de bas niveau. Il installe un fichier .rpm local mais ne récupère pas les dépendances à votre place.
  • DNF (et l'ancien YUM) est l'outil de haut niveau. Il dialogue avec les dépôts, télécharge les paquets, résout les dépendances, puis appelle RPM pour l'installation proprement dite.

Commandes courantes :

rpm -qa                  # lister tous les paquets installés
rpm -qi bash             # informations sur un paquet
rpm -ql bash             # fichiers installés par un paquet
rpm -qf /usr/bin/bash    # quel paquet possède ce fichier
rpm -V bash              # vérifier les fichiers d'un paquet
sudo dnf install foo     # installer avec résolution des dépendances

Construire votre premier RPM

1. Installer les outils

Sur Fedora ou les systèmes dérivés de RHEL :

sudo dnf install rpm-build rpmdevtools

Ne construisez jamais de RPM en tant que root. Utilisez un compte utilisateur normal.

2. Créer l'arborescence de construction

rpmdev-setuptree

Cette commande crée ~/rpmbuild/ avec les dossiers suivants :

DossierRôle
SOURCESArchives de sources et correctifs (patches)
SPECSFichiers spec
BUILDDossier où la compilation a lieu
RPMSPaquets binaires terminés
SRPMSPaquets sources terminés

3. Préparer les sources

Dans cet exemple, nous allons empaqueter un petit script. Créez hello.sh :

#!/bin/bash
echo "Hello from my first RPM!"

Placez-le ensuite dans une archive nommée nom-version :

mkdir hello-1.0
mv hello.sh hello-1.0/
tar czf ~/rpmbuild/SOURCES/hello-1.0.tar.gz hello-1.0

4. Écrire le fichier spec

Le fichier spec est la recette qui indique à RPM comment construire le paquet. Générez un modèle avec rpmdev-newspec hello, ou écrivez-le vous-même dans ~/rpmbuild/SPECS/hello.spec :

Name:           hello
Version:        1.0
Release:        1%{?dist}
Summary:        A simple hello world script
License:        MIT
URL:            https://example.com/hello
Source0:        %{name}-%{version}.tar.gz
BuildArch:      noarch

%description
A small example package that installs a hello world script.

%prep
%autosetup

%build
# Nothing to compile

%install
mkdir -p %{buildroot}%{_bindir}
install -m 0755 hello.sh %{buildroot}%{_bindir}/hello

%files
%{_bindir}/hello

%changelog
* Thu Oct 22 2026 Your Name <you@example.com> - 1.0-1
- Initial package

Le rôle de chaque partie :

  • Les champs d'en-tête (Name, Version, Release, etc.) sont les métadonnées du paquet.
  • %description est le texte plus long que voient les utilisateurs avec rpm -qi.
  • %prep décompresse les sources (%autosetup extrait l'archive et applique les correctifs).
  • %build compile le logiciel. Pour un projet en C, on utilise généralement %configure et %make_build.
  • %install copie les fichiers dans une fausse racine appelée %{buildroot}, et non sur votre vrai système.
  • %files liste chaque fichier appartenant au paquet. Si un fichier est installé mais n'est pas listé ici, la construction échoue.
  • %changelog conserve l'historique du paquet.

Utilisez des macros comme %{_bindir} plutôt que d'écrire /usr/bin en dur. Cela rend votre spec portable et respecte les conventions des distributions.

5. Construire le paquet

rpmbuild -ba ~/rpmbuild/SPECS/hello.spec

L'option -ba construit à la fois le RPM binaire et le RPM source. Vous trouverez les résultats ici :

  • ~/rpmbuild/RPMS/noarch/hello-1.0-1.*.noarch.rpm
  • ~/rpmbuild/SRPMS/hello-1.0-1.*.src.rpm

6. Tester

Inspectez le paquet avant de l'installer :

rpm -qip ~/rpmbuild/RPMS/noarch/hello-1.0-1.*.rpm   # métadonnées
rpm -qlp ~/rpmbuild/RPMS/noarch/hello-1.0-1.*.rpm   # liste des fichiers

Puis installez-le et lancez-le :

sudo dnf install ~/rpmbuild/RPMS/noarch/hello-1.0-1.*.rpm
hello

Pour le supprimer : sudo dnf remove hello.

Aller plus loin

Dépendances. Ajoutez BuildRequires: pour les outils nécessaires à la construction, et Requires: pour les paquets nécessaires à l'exécution. RPM détecte automatiquement de nombreuses dépendances de bibliothèques.

Scriptlets. Les sections %pre, %post, %preun et %postun exécutent des commandes pendant l'installation ou la suppression, par exemple pour activer un service systemd. Gardez-les minimales.

Vérifier avec rpmlint. Lancez rpmlint sur votre spec et vos RPM pour repérer les erreurs courantes :

rpmlint ~/rpmbuild/SPECS/hello.spec ~/rpmbuild/RPMS/noarch/*.rpm

Construire dans un environnement propre. Compiler directement sur votre machine peut masquer des BuildRequires manquants. Des outils comme mock construisent dans un chroot propre, ce qui est la méthode utilisée par les distributions pour leurs paquets officiels :

mock -r fedora-rawhide-x86_64 ~/rpmbuild/SRPMS/hello-1.0-1.*.src.rpm

Signer vos paquets. La signature permet aux utilisateurs de vérifier l'authenticité :

rpmsign --addsign ~/rpmbuild/RPMS/noarch/hello-1.0-1.*.rpm

Héberger un dépôt. Placez vos RPM dans un dossier et lancez createrepo_c dessus. Servez ensuite ce dossier en HTTP, et les utilisateurs pourront installer votre logiciel avec dnf.

Erreurs courantes des débutants

  1. Construire en tant que root, ce qui peut endommager votre système si un script se comporte mal.
  2. Oublier des fichiers dans %files, ce qui provoque des erreurs « installed but unpackaged file ».
  3. Écrire les chemins en dur au lieu d'utiliser des macros.
  4. Négliger le changelog, pourtant obligatoire et utile pour suivre les changements.
  5. Ne pas incrémenter Release lorsqu'on reconstruit la même version.

Conclusion

RPM offre un moyen cohérent et vérifiable de distribuer des logiciels sur les systèmes de la famille Red Hat. Une fois que vous comprenez le fichier spec et les étapes de construction (%prep, %build, %install, %files), vous pouvez empaqueter n'importe quoi, d'un simple script shell à une grosse application en C. Commencez petit, vérifiez votre travail avec rpmlint et testez dans un environnement propre.