Gestion des paquets avec RPM sous Linux

Red Hat Enterprise LinuxBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez les fondamentaux de la gestion des paquets logiciels sur les distributions Linux basées sur RPM en utilisant le puissant utilitaire en ligne de commande rpm. Vous acquerrez une expérience pratique des tâches essentielles de gestion de paquets, notamment l'interrogation d'informations détaillées sur les paquets, la vérification de l'intégrité des paquets installés et l'inspection du contenu des fichiers RPM.

Tout au long des étapes, vous utiliserez des commandes rpm spécifiques pour déterminer à quel paquet appartient un fichier, lister les dépendances et les fichiers de configuration d'un paquet, et vérifier les dépendances inverses. Vous apprendrez également à simuler en toute sécurité la suppression d'un paquet pour en comprendre l'impact, ainsi qu'à examiner le contenu d'un fichier de paquet RPM avant son installation à l'aide d'outils comme rpm2cpio et cpio.

Interroger les informations de base d'un paquet avec rpm -qi et rpm -qf

Dans cette étape, vous apprendrez à interroger des informations sur les paquets installés à l'aide du gestionnaire de paquets Red Hat (rpm). rpm est un utilitaire en ligne de commande puissant pour gérer les logiciels sur les distributions Linux basées sur RPM telles que CentOS, Fedora et RHEL. Nous nous concentrerons sur deux options de requête fondamentales : -qi pour obtenir des informations détaillées sur un paquet et -qf pour déterminer à quel paquet appartient un fichier spécifique.

Tout d'abord, inspectons les détails d'un paquet déjà installé sur votre système. Le shell bash est un composant central du système, ce qui en fait un exemple parfait. L'option -q signifie « query » (requête) et l'option i signifie « information ».

Commencez par vous placer dans l'espace de travail du laboratoire afin que les fichiers de sortie des commandes que vous créez restent regroupés :

cd /home/labex/project

Exécutez la commande suivante dans votre terminal pour interroger les informations sur le paquet bash et enregistrer la sortie dans bash-package-info.txt :

rpm -qi bash | tee bash-package-info.txt

Vous verrez une sortie détaillée listant divers attributs du paquet. La sortie ressemblera à ceci (les numéros de version et les dates peuvent varier) :

Name        : bash
Version     : 4.4.20
Release     : 5.el8
Architecture: x86_64
Install Date: <some_date>
Group       : System Environment/Shells
Size        : 4989189
License     : GPLv3+
Signature   : RSA/SHA256, <some_date_and_time>, Key ID <some_key_id>
Source RPM  : bash-4.4.20-5.el8.src.rpm
Build Date  : <some_date>
Build Host  : <some_build_host>
Relocations : (not relocatable)
Vendor      : CentOS
URL         : http://www.gnu.org/software/bash
Summary     : The GNU Bourne-Again Shell
Description :
The GNU Bourne-Again Shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C
shell (csh).  Most sh scripts can be run by bash without
modification.

Cette sortie fournit une mine d'informations, notamment la version du paquet, un résumé de son objectif et une description plus détaillée.

Maintenant, imaginez que vous ayez un fichier sur votre système, comme l'exécutable bash situé dans /usr/bin/bash, et que vous souhaitiez savoir quel paquet l'a installé. C'est une tâche courante lors de l'audit d'un système ou du dépannage. Pour cela, vous pouvez utiliser les options -qf, où f signifie « file » (fichier).

Exécutez la commande suivante pour découvrir quel paquet possède le fichier /usr/bin/bash et enregistrez le résultat dans bash-owner.txt :

rpm -qf /usr/bin/bash | tee bash-owner.txt

La commande renverra le nom complet du paquet qui fournit ce fichier :

bash-5.1.8-9.el9.x86_64

Comme vous pouvez le constater, le système identifie correctement que /usr/bin/bash provient du paquet bash, ce qui correspond aux informations trouvées précédemment. Vous pouvez même combiner ces options pour obtenir directement des informations sur le paquet qui possède un fichier en exécutant rpm -qif /usr/bin/bash.

Lister les dépendances et les fichiers de configuration d'un paquet avec rpm -qR et rpm -qc

Dans cette étape, vous continuerez à explorer rpm en apprenant à lister les dépendances d'un paquet et ses fichiers de configuration associés. Comprendre les dépendances est crucial car la plupart des logiciels s'appuient sur d'autres paquets pour fonctionner correctement. Savoir où se trouvent les fichiers de configuration est essentiel pour l'administration système et la personnalisation.

Continuez à travailler dans /home/labex/project. Commençons par découvrir quels autres paquets ou fonctionnalités le paquet bash nécessite. Nous utilisons l'option -qR (ou --requires) pour cela. Le R signifie « requires » (nécessite).

Exécutez la commande suivante pour voir les dépendances de bash et enregistrer la sortie dans bash-requires.txt :

rpm -qR bash | tee bash-requires.txt

La sortie sera une liste de paquets et de fonctionnalités système dont bash dépend. Cette liste peut être assez longue.

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
libc.so.6()(64bit)
info
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.28)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
...
rtld(GNU_HASH)

Cette sortie montre que bash dépend de fonctionnalités système de base telles que libc.so.6, le paquet filesystem et d'autres composants d'exécution.

Ensuite, trouvons les fichiers de configuration qui ont été installés dans le cadre du paquet bash. C'est utile lorsque vous devez modifier le comportement par défaut du shell pour les nouveaux utilisateurs. L'option -qc est utilisée pour cela, où c signifie « configfiles » (fichiers de configuration).

Exécutez cette commande pour lister les fichiers de configuration de bash et enregistrer la sortie dans bash-config-files.txt :

rpm -qc bash | tee bash-config-files.txt

La sortie affichera les chemins complets vers les fichiers de configuration :

/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc

Ces fichiers dans /etc/skel sont des modèles qui sont copiés dans le répertoire personnel d'un nouvel utilisateur lors de la création de son compte.

Vous pouvez également combiner des options pour trouver les fichiers de configuration liés à une commande spécifique. Par exemple, pour voir les fichiers de configuration utilisés par la commande passwd, vous pouvez utiliser -qcf. Cela indique à rpm de d'abord trouver le paquet pour le fichier (-f /usr/bin/passwd), puis de lister ses fichiers de configuration (-c).

rpm -qcf /usr/bin/passwd | tee passwd-config-files.txt

Cette commande révèle les fichiers de configuration associés à l'utilitaire passwd :

/etc/pam.d/passwd

C'est un moyen puissant d'identifier rapidement quels fichiers vous pourriez avoir besoin de modifier pour changer le comportement d'une commande.

Vérifier l'intégrité des paquets et les modifications de fichiers avec rpm -V

Dans cette étape, vous apprendrez à vérifier l'intégrité d'un paquet installé à l'aide de rpm -V (ou rpm --verify). Cette commande est un outil crucial de sécurité et de dépannage. Elle compare les fichiers installés par un paquet avec les informations stockées dans la base de données RPM, telles que la taille des fichiers, les permissions et les sommes de contrôle (checksums). Cela vous permet de détecter toute modification non autorisée ou accidentelle des fichiers système.

Tout d'abord, assurons-nous que quelques paquets utilitaires, lsscsi et at, sont installés sur le système. Nous les utiliserons pour nos tests de vérification.

sudo dnf install -y lsscsi at

Continuez à travailler dans /home/labex/project. Maintenant, vérifions le paquet lsscsi. Comme nous venons de l'installer et que nous n'avons effectué aucune modification, il devrait réussir le test de vérification. Une vérification réussie ne produit aucune sortie.

rpm -V lsscsi | tee lsscsi-verify.txt

Comme prévu, l'invite de commande revient sans aucun message, indiquant que tous les fichiers du paquet lsscsi sont dans leur état d'origine.

Ensuite, modifions intentionnellement un fichier de configuration et voyons comment rpm -V signale le changement. Nous allons ajouter une ligne au fichier /etc/at.deny, qui appartient au paquet at. Ce fichier contrôle quels utilisateurs ne sont pas autorisés à utiliser la commande at.

echo "labex" | sudo tee -a /etc/at.deny

Maintenant que nous avons modifié un fichier, vérifions à nouveau le paquet at.

sudo rpm -V at | tee at-verify.txt

Cette fois, la commande produit une sortie, indiquant qu'un changement a été détecté :

S.5....T.  c /etc/at.deny

Analysons cette sortie :

  • S : La Size (taille) du fichier a changé.
  • 5 : La somme de contrôle MD5 a changé.
  • T : La modification Time (date/heure) a changé.
  • c : Cela désigne un fichier de configuration.
  • /etc/at.deny : Le chemin vers le fichier modifié.

Chaque position de caractère dans la chaîne de 8 caractères S.5....T. représente un test différent. Un . signifie que le test a réussi. Cette sortie montre clairement que le fichier de configuration /etc/at.deny a été altéré depuis son installation.

Vous pouvez également vérifier le paquet qui possède un fichier spécifique directement en utilisant les options -qVf.

sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt

Cette commande produira la même sortie, car elle trouve d'abord le paquet possédant /etc/at.deny (at), puis le vérifie.

Vérifier les dépendances inverses et simuler la suppression d'un paquet avec rpm -e --test

Dans cette étape, vous apprendrez à vérifier les dépendances inverses et à simuler en toute sécurité la suppression d'un paquet. Alors que la commande rpm -qR montre ce dont un paquet a besoin (ses dépendances), rpm -q --whatrequires montre quels autres paquets ont besoin de lui (ses dépendances inverses). Il est extrêmement important de le savoir avant de supprimer un paquet, car vous pourriez casser d'autres parties du système.

Continuez à travailler dans /home/labex/project. Pour vérifier en toute sécurité les conséquences de la suppression d'un paquet, vous pouvez utiliser la commande rpm -e --test. L'option -e signifie « erase » (effacer) et l'option --test indique à RPM d'effectuer une simulation sans réellement supprimer de fichiers.

Commençons par examiner un paquet système central dont dépendent de nombreux autres paquets. Le paquet glibc fournit la bibliothèque GNU C, qui est fondamentale pour presque tous les programmes sur un système Linux. Vérifions quels paquets nécessitent glibc.

rpm -q --whatrequires glibc | tee glibc-whatrequires.txt

La sortie affichera plusieurs paquets qui dépendent de glibc :

glibc-common-2.34-168.el9_6.19.x86_64
glibc-langpack-en-2.34-168.el9_6.19.x86_64
libstdc++-11.5.0-5.el9_5.x86_64
glibc-headers-2.34-168.el9_6.19.x86_64
pam-1.5.1-23.el9.x86_64
glibc-devel-2.34-168.el9_6.19.x86_64
nscd-2.34-168.el9_6.19.x86_64

Comme vous pouvez le constater, de nombreux paquets système critiques dépendent de glibc. Voyons maintenant ce qui se passe lorsque nous essayons de supprimer glibc. Nous utiliserons l'option --test pour nous assurer de ne pas le supprimer réellement, ce qui casserait tout le système.

sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt

Parce que tant de paquets ont besoin de glibc, RPM signalera des erreurs de dépendance et empêchera la suppression. La sortie affichera une longue liste de dépendances non satisfaites :

error: Failed dependencies:
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-common-2.34-168.el9_6.19.x86_64
 glibc = 2.34-168.el9_6.19 is needed by (installed) glibc-langpack-en-2.34-168.el9_6.19.x86_64
 glibc >= 2.34 is needed by (installed) libstdc++-11.5.0-5.el9_5.x86_64
 ... (additional dependency errors)

Regardons maintenant un paquet avec moins de dépendances. Le paquet lsscsi que nous avons installé précédemment est un paquet utilitaire avec moins de dépendances inverses. Vérifions ce qui le nécessite :

rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt

Vous devriez voir une sortie indiquant qu'aucun paquet ne nécessite lsscsi :

no package requires lsscsi

Comme aucun paquet ne dépend de lsscsi, nous pouvons simuler sa suppression en toute sécurité :

sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt

Cette commande devrait se terminer sans erreur, indiquant que la suppression de lsscsi ne casserait aucun autre paquet sur le système.

Cela démontre comment vous pouvez prédire l'impact de la suppression d'un paquet et éviter de casser votre système en vérifiant d'abord les dépendances inverses.

Inspecter le contenu des paquets RPM avec rpm2cpio et cpio

Dans cette étape, vous apprendrez une technique puissante pour inspecter le contenu d'un fichier de paquet RPM sans l'installer. C'est utile pour vérifier les fichiers qu'un paquet contient avant l'installation ou pour extraire un seul fichier d'un paquet afin de restaurer un fichier corrompu ou supprimé. Ce processus implique deux commandes : rpm2cpio, qui convertit un fichier RPM en une archive cpio, et cpio, qui peut ensuite lister ou extraire des fichiers de cette archive.

Continuez à travailler dans /home/labex/project. Tout d'abord, vous avez besoin d'un fichier .rpm réel à inspecter. Téléchargeons le fichier du paquet bash dans votre répertoire actuel (/home/labex/project) en utilisant le gestionnaire de paquets dnf. La sous-commande download récupère le fichier du paquet sans l'installer.

sudo dnf download bash

Vous verrez une sortie indiquant que le fichier a été téléchargé avec succès. Le nom du fichier inclura la version et l'architecture.

Last metadata expiration check: ...
bash-<version>.<arch>.rpm

Maintenant, utilisez la commande ls pour confirmer que le fichier .rpm se trouve dans votre répertoire /home/labex/project :

ls bash-*.rpm

Avec le fichier RPM prêt, vous pouvez maintenant utiliser les commandes rpm2cpio et cpio ensemble pour lister son contenu. La commande rpm2cpio lit le fichier RPM et envoie une archive cpio vers la sortie standard. Nous redirigeons ensuite (|) cette sortie vers la commande cpio, qui lit l'archive depuis son entrée standard. L'option -t pour cpio lui indique de lister la table des matières.

rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt

Cela produira une longue liste de tous les fichiers et répertoires contenus dans le paquet bash. La sortie ressemblera à ceci :

.
./etc
./etc/skel
./etc/skel/.bash_logout
./etc/skel/.bash_profile
./etc/skel/.bashrc
./usr
./usr/bin
./usr/bin/bash
./usr/bin/sh
./usr/share
./usr/share/doc
...

Cette technique vous donne une vue complète de la charge utile d'un paquet, vous permettant de voir exactement ce qui sera placé sur votre système si vous deviez l'installer.

Résumé

Dans ce laboratoire, vous avez appris à gérer et à interroger des paquets logiciels à l'aide de l'utilitaire RPM dans un environnement Linux. Vous avez commencé par récupérer des informations détaillées sur les paquets installés avec rpm -qi et en identifiant à quel paquet appartient un fichier spécifique à l'aide de rpm -qf. Vous vous êtes également exercé à lister les dépendances d'un paquet avec rpm -qR et à localiser ses fichiers de configuration avec rpm -qc, offrant une vue complète de la manière dont un paquet s'intègre dans le système.

En vous appuyant sur ces compétences de requête, vous avez appris à vérifier l'intégrité des fichiers d'un paquet installé à l'aide de rpm -V pour détecter les modifications. Vous avez également exploré comment vérifier en toute sécurité les dépendances inverses et simuler la suppression d'un paquet avec rpm -e --test pour comprendre l'impact potentiel sans effectuer de changements. Enfin, vous avez acquis la capacité d'inspecter le contenu d'un fichier de paquet RPM avant l'installation en utilisant rpm2cpio et cpio pour extraire et lister son contenu.