DNF, RPM & Modules
DNF : Le Gestionnaire de Paquets RHEL 8+
DNF (Dandified YUM) remplace YUM depuis RHEL 8. Il apporte les modules AppStream, un meilleur résolveur de dépendances et l'historique transactionnel avec rollback.
Cycle de Vie DNF
# Mise à jour de la base de données des dépôts
dnf check-update
# Lister les mises à jour disponibles
dnf list updates
# Mettre à jour TOUT le système
dnf upgrade -y
# ou : dnf update -y (alias)
# Mettre à jour un paquet spécifique
dnf upgrade nginx -y
# Mettre à jour seulement les paquets de sécurité
dnf upgrade --security -y
Installation & Suppression
# Installer un paquet
dnf install nginx -y
# Installer plusieurs paquets
dnf install vim git curl wget -y
# Installer un groupe de paquets
dnf groupinstall "Development Tools" -y
# Réinstaller un paquet (si corrompu)
dnf reinstall nginx -y
# Supprimer un paquet
dnf remove nginx -y
# Supprimer + dépendances orphelines
dnf autoremove -y
Recherche de Paquets
# Chercher un paquet par nom
dnf search nginx
# Chercher avec des métadonnées étendues
dnf search all "web server"
# Lister tous les paquets disponibles
dnf list available
# Lister les paquets installés
dnf list installed
# Voir les infos d'un paquet
dnf info nginx
# Trouver quel paquet fournit un fichier
dnf provides /usr/sbin/nginx
# nginx-1:1.20.1-1.el9.x86_64 : High performance web server
dnf provides */semanage
# policycoreutils-python-utils-3.3-6.el9.noarch
Gestion des Dépôts
# Lister les dépôts activés
dnf repolist
# Lister TOUS les dépôts (y compris désactivés)
dnf repolist --all
# Activer un dépôt
dnf config-manager --set-enabled epel
# Désactiver un dépôt
dnf config-manager --set-disabled epel
# Ajouter un dépôt tiers
dnf config-manager --add-repo https://example.com/repo.repo
# Installer depuis un dépôt spécifique
dnf install --enablerepo=epel htop
Nettoyage
# Nettoyer le cache
dnf clean all
# Supprimer les paquets orphelins
dnf autoremove -y
# Lister les paquets orphelins (leaf packages)
dnf list extras
# Supprimer les vieux kernels (garder les 3 derniers)
dnf remove --oldinstallonly --setopt installonly_limit=3 kernel
AppStream & Modules : La Killer Feature
AppStream permet d'avoir plusieurs versions d'un logiciel (ex: Python 3.9, 3.11, 3.12) installables en parallèle via des modules.
Concepts Clés
- Module : Un ensemble de paquets (ex:
nodejs) - Stream : Une version majeure (ex:
18,20) - Profile : Un jeu de paquets pré-sélectionnés (ex:
default,development)
# Lister tous les modules disponibles
dnf module list
# Chercher un module spécifique
dnf module list nodejs
# Name Stream Profiles Summary
# nodejs 18 default, development JavaScript runtime
# nodejs 20 [d] default, development JavaScript runtime (default)
Installer un Module
# Installer le stream par défaut
dnf module install nodejs -y
# Vérifier la version installée
node --version
# v20.x.x
# Installer un stream spécifique
dnf module install nodejs:18 -y
# Installer avec un profile spécifique
dnf module install nodejs:18/development -y
Changer de Stream (Reset)
# Situation : NodeJS 18 installé, besoin de passer à NodeJS 20
# 1. Voir le stream actuel
dnf module list nodejs
# nodejs 18 [e] default [i] # [e] = enabled, [i] = installed
# 2. Désactiver le stream actuel
dnf module reset nodejs -y
# 3. Activer le nouveau stream
dnf module enable nodejs:20 -y
# 4. Mettre à jour (ou installer si absent)
dnf distro-sync -y
# Vérifier
node --version
# v20.x.x
Exemple Pratique : Python 3.9 → 3.11
# Voir les streams Python disponibles
dnf module list python3
# python39 3.9 common [d]
# python311 3.11 common
# Installer Python 3.11
dnf module install python311 -y
# Vérifier
python3.11 --version
# Python 3.11.x
# Créer un venv avec Python 3.11
python3.11 -m venv /opt/myapp/venv
Désactiver un Module
# Supprimer les paquets du module
dnf module remove nodejs -y
# Réinitialiser (permet de changer de stream)
dnf module reset nodejs -y
# Désactiver complètement (empêche l'install)
dnf module disable nodejs -y
Historique & Rollback : La Vraie Killer Feature
DNF enregistre chaque transaction et permet de revenir en arrière en cas de problème.
Consulter l'Historique
# Lister les dernières transactions
dnf history
# ID | Command line | Date and time | Action(s) | Altered
# ----|--------------------------|------------------|-----------|--------
# 15 | install nginx | 2025-01-15 10:30 | Install | 3
# 14 | upgrade | 2025-01-14 09:00 | Upgrade | 45
# 13 | remove httpd | 2025-01-13 14:20 | Removed | 1
# Voir les détails d'une transaction
dnf history info 15
# Transaction ID : 15
# Begin time : Wed 15 Jan 2025 10:30:00 AM CET
# Command line : install nginx
# Packages Altered:
# Install nginx-1:1.20.1-1.el9.x86_64
# Install nginx-filesystem-1:1.20.1-1.el9.noarch
# Dep-Install openssl-1:3.0.1-1.el9.x86_64
# Lister les paquets modifiés dans une transaction
dnf history list nginx
Rollback : Annuler une Transaction
# Annuler la dernière transaction
dnf history undo last -y
# Annuler une transaction spécifique
dnf history undo 15 -y
# Refaire une transaction (redo)
dnf history redo 15 -y
# Revenir à un état précis (rollback)
dnf history rollback 10 -y
# ⚠️ Annule TOUTES les transactions depuis la 10 jusqu'à maintenant
Rollback de Kernel
Le rollback de kernel est dangereux. Préférez redémarrer avec un vieux kernel via GRUB :
Exemple : Sauver une Mise à Jour Cassée
# Scénario : dnf upgrade a cassé un service
dnf upgrade -y
systemctl status myapp
# Failed to start myapp.service
# Consulter l'historique
dnf history
# ID | Command line | Action(s) | Altered
# 42 | upgrade | Upgrade | 67 packages
# Annuler la mise à jour
dnf history undo 42 -y
# Vérifier
systemctl status myapp
# Active (running)
# Investiguer quel paquet a causé le problème
dnf history info 42 | grep myapp-dependency
RPM : Gestion Bas Niveau
RPM est le format de paquet bas niveau (comme .deb sur Debian). DNF gère RPM, mais RPM peut être utilisé directement pour des tâches avancées.
Queries RPM
# Lister tous les paquets installés
rpm -qa
# nginx-1.20.1-1.el9.x86_64
# vim-enhanced-8.2.2637-16.el9.x86_64
# Chercher un paquet spécifique
rpm -qa | grep nginx
# Voir les infos d'un paquet
rpm -qi nginx
# Lister les fichiers d'un paquet
rpm -ql nginx
# /usr/sbin/nginx
# /etc/nginx/nginx.conf
# /usr/share/nginx/html/index.html
# Trouver quel paquet fournit un fichier
rpm -qf /usr/sbin/nginx
# nginx-1.20.1-1.el9.x86_64
# Lister les fichiers de configuration d'un paquet
rpm -qc nginx
# /etc/nginx/nginx.conf
# /etc/nginx/mime.types
# Lister les scripts pré/post-installation
rpm -q --scripts nginx
Vérifier l'Intégrité des Paquets
# Vérifier TOUS les paquets (lent)
rpm -Va
# S.5....T. c /etc/passwd # Modifié (normal)
# .M....... /usr/bin/vim # Permissions modifiées
# Vérifier un paquet spécifique
rpm -V nginx
# (Pas de sortie = OK)
# Légende :
# S : Size differs
# M : Mode differs (permissions)
# 5 : MD5 checksum differs
# D : Device differs
# L : Symlink differs
# U : User ownership differs
# G : Group ownership differs
# T : Modification time differs
Installer/Supprimer un RPM Local
# Installer un .rpm téléchargé (avec dépendances)
dnf install ./paquet.rpm
# Ou avec rpm brut (SANS dépendances - déconseillé)
rpm -ivh paquet.rpm
# i : install, v : verbose, h : hash progress
# Mettre à jour
rpm -Uvh paquet-nouveau.rpm
# U : upgrade
# Supprimer
rpm -e paquet
Extraire un RPM sans Installer
# Créer un répertoire de travail
mkdir /tmp/rpm-extract
cd /tmp/rpm-extract
# Extraire
rpm2cpio /path/to/paquet.rpm | cpio -idmv
# Les fichiers sont extraits dans ./
ls
# usr/
# etc/
Createrepo : Dépôt Local
Utile pour les environnements déconnectés (air-gapped) ou pour distribuer des paquets custom.
Créer un Dépôt Local
# Installer createrepo
dnf install createrepo_c -y
# Créer un répertoire pour le dépôt
mkdir -p /var/www/html/myrepo
# Copier les RPM
cp *.rpm /var/www/html/myrepo/
# Générer les métadonnées
createrepo /var/www/html/myrepo
# Spawning worker 0 with 5 pkgs
# Workers Finished
# Saving Primary metadata
# Saving file lists metadata
# Saving other metadata
# Servir via HTTP (Apache ou Python)
cd /var/www/html/myrepo
python3 -m http.server 8080
Configurer un Client pour Utiliser le Dépôt
# Créer un fichier .repo
cat > /etc/yum.repos.d/myrepo.repo <<EOF
[myrepo]
name=My Local Repository
baseurl=http://192.168.1.100:8080
enabled=1
gpgcheck=0
EOF
# Vérifier
dnf repolist
# myrepo My Local Repository 5
# Installer depuis le dépôt
dnf install mon-paquet-custom -y
Mettre à Jour le Dépôt
# Ajouter de nouveaux RPM
cp nouveau.rpm /var/www/html/myrepo/
# Mettre à jour les métadonnées
createrepo --update /var/www/html/myrepo
# Les clients verront les nouveaux paquets
dnf clean all
dnf repolist
Dépannage
Réparer une Base RPM Corrompue
Résoudre les Conflits de Dépendances
# Simuler une installation (dry-run)
dnf install paquet --assumeno
# Forcer l'installation (dangereux)
rpm -ivh --nodeps paquet.rpm # ⚠️ Casse les dépendances
# Downgrade d'un paquet
dnf downgrade nginx -y
Vérifier la Signature GPG
# Importer une clé GPG
rpm --import https://repo.example.com/RPM-GPG-KEY
# Vérifier la signature d'un RPM
rpm --checksig paquet.rpm
# paquet.rpm: rsa sha1 (md5) pgp md5 OK
# Installer avec vérification stricte
dnf install paquet.rpm --setopt=gpgcheck=1
Checklist Production
# 1. Mises à jour de sécurité automatiques
systemctl is-active dnf-automatic.timer # active
# 2. Pas de paquets cassés
rpm -Va | grep "^missing" # Vide
# 3. Dépôts configurés correctement
dnf repolist
# baseos, appstream, epel
# 4. Historique DNF propre (pas de rollback récent suspect)
dnf history | head -n 5
# 5. Vieux kernels nettoyés (garder 2-3 max)
rpm -qa kernel | wc -l # <= 3
# 6. Espace disque suffisant (/var/cache/dnf)
df -h /var
# Use% <= 80%
Aide-Mémoire DNF
| Tâche | Commande |
|---|---|
| Chercher un paquet | dnf search nginx |
| Installer | dnf install nginx -y |
| Supprimer | dnf remove nginx -y |
| Mettre à jour tout | dnf upgrade -y |
| Mettre à jour un paquet | dnf upgrade nginx -y |
| Lister les updates | dnf check-update |
| Historique | dnf history |
| Annuler dernière transaction | dnf history undo last -y |
| Lister les modules | dnf module list |
| Installer un module | dnf module install nodejs:20 -y |
| Reset un module | dnf module reset nodejs -y |
| Quel paquet fournit ce fichier ? | dnf provides /usr/sbin/nginx |
| Nettoyer le cache | dnf clean all |
| Supprimer les orphelins | dnf autoremove -y |