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
.rpmlocal 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 :
| Dossier | Rôle |
|---|---|
SOURCES | Archives de sources et correctifs (patches) |
SPECS | Fichiers spec |
BUILD | Dossier où la compilation a lieu |
RPMS | Paquets binaires terminés |
SRPMS | Paquets 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. %descriptionest le texte plus long que voient les utilisateurs avecrpm -qi.%prepdécompresse les sources (%autosetupextrait l'archive et applique les correctifs).%buildcompile le logiciel. Pour un projet en C, on utilise généralement%configureet%make_build.%installcopie les fichiers dans une fausse racine appelée%{buildroot}, et non sur votre vrai système.%filesliste chaque fichier appartenant au paquet. Si un fichier est installé mais n'est pas listé ici, la construction échoue.%changelogconserve 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
- Construire en tant que root, ce qui peut endommager votre système si un script se comporte mal.
- Oublier des fichiers dans
%files, ce qui provoque des erreurs « installed but unpackaged file ». - Écrire les chemins en dur au lieu d'utiliser des macros.
- Négliger le changelog, pourtant obligatoire et utile pour suivre les changements.
- Ne pas incrémenter
Releaselorsqu'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.