Apparence
Uubu.fr

Les systèmes Linux, l’open source, les réseaux, l’interopérabilité, etc.
« Il vaut mieux viser la perfection et la manquer que viser l’imperfection et l’atteindre. » (Bertrand Arthur William RUSSEL)
09 September 2019

htmlpdflatexmanmd

package manager rpm           gestionnaire de paquets


rpm

rpm

Gestionnaire de paquets pour Red-Hat

   rpm est un gestionnaire de paquet qui peut être utilisé pour construire, installer, requêter, vérifier, mettre à jours des paquets Un paquet consiste en une archive de fichiers et de méta-données utilsés pour installer et effacer les fichiers. Les méta-données incluent des scripts helpers, des attributs de fichier, et d'informations descriptive du paquet.

Options générales

--version Affiche la vension de rpm
--quiet Affiche seulement les messages d'erreur
-v, --verbose AFfiche plus d'informations
-vv mode encore plus verbeux
--rcfile FILELIST Liste des fichiers de configuration à lire, séparés pas des ':'. Défaut: /usr/lib/rpm/rpmrc:/usr/lib/rpm/redhat/rpmrc:/etc/rpmrc:~/.rpmrc
--macro FILELIST Liste des fichiers macro à charger, séparé par des ':'. Défaut: /usr/lib/rpm/macros:/usr/lib/rpm/macros.d/macros.*:/usr/lib/rpm/platform/%{_target}/macros:/usr/lib/rpm/fileattrs/*.attr:/usr/lib/rpm/redhat/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/%{_target}/macros:~/.rpmmacros
--pipe CMD pipe la sortie de RPM avec la commande spécifiée
--dbpath DIR Utilise la base dans le répertoire spécifié. Défaut: /var/lib/rpm
--root DIR Utilise le répertoire spécifié comme racine pour toutes les opérations. Noter que la base utilisé se trouve dans ce répertoire.
-D, --define='MACRO EXPR' Définie la MACRO à la valeur EXPR
--undefine='MACRO' indéfini une macro
-E, --eval='EXPR' Affiche l'expansion de l'expression
--predefine='MACRO EXPR' idem -D, mais avant de charger les fichiers macro
--color [never|auto|always] Utilise les couleurs du terminal
--nocontexts Désactive le plugin SELinux
--noglob N'utilise pas le file globing en installant des fichiers
--nocaps Ne vérifie pas les capabilities des fichiers
--excludeconfigs, --noconfigs N'installe pas les fichiers de configuration
--nohdrchk Ne vérifie pas les en-tête de la base

Options de debuggage

-d, --debug Mode debug
--deploops Affiche les boucles de dépendance en warning
--fsmdebug Affiche des informations de debuggage du code de gestion du payload
--rpmfcdebug Affiche des informations sur les entrées/sortie de fichier
--stats Affiche des statistics temps-réel sur les fonctions utilisées

Options d'installation et de mise à jours

-i, --install Install un nouveau paquet
-U, --upgrade Met à jours ou install un paquet
-F, --freshen Met à jours les package, mais seulement ceux qui ont une version précédente installée

        --reinstall Réinstall un précédent paquet
        --allfiles Install ou met à jours tous les fichiers missingok dans le paquet, sans regarder s'ils existent
        --badreloc avec --relocate, permet la relocation de tous les chemins de fichiers, pas seulement ceux inclus dans OLDPATH
        --excludepath OLDPATH N'install pas les fichier dont le nom commence pas OLDPATH
        --excludedocs N'install pas les fichiers qui sont marqués comme documentation
        --force idem à --replacepkgs --replacefiles et --oldpackage
        -h, --hash Affiche 50 hash quand l'archive est dépaquée. avec -v pour un meilleur affichage
        --ignoresize Ne vérifie pas l'espace disque du système de fichier avant d'installer ce paquet
        --ignorearch install ou met à jour même si l'architecture ne correspond pas
        --ignoreos install ou met à jour même si l'os ne correspond pas
        --includedocs Install les fichiers de documentation (défaut)
        --justdb Met à jour la base de donnée uniquement, pas les fichiers
        --nodigest Ne vérifie pas les digest d'en-tête ou du paquet à sa lecture
        --nomanifest Ne traite pas les fichiers non-package comme manifests
        --nosignature Ne vérifie pas la signature
        --nodeps Ne vérifie pas les dépendances à l'installation/mise à jours
        --nocaps Ne définis pas les capabilities
        --noorder ne réordonne pas les paquets pour une installation. La liste des paquets est normalement réordonnée pour satisfaire les dépendances
        --noplugins Ne charge pas les plugins
        --noscripts, --notriggerin, --notriggerun, --notriggerprein, --notriggerpostun Désactive l'exécution des scriptlets correspondants
        --oldpackage Autorise une mise à jour pour remplacer un paquet avec une version plus ancienne
        --percent Affiche un pourcentage à mesure que les fichiers sont dépaqués
        --prefix NEWPATH Pour les paquets relogeable, traduit tous les chemins de fichier qui commencent avec le préfixe d'installation avec NEWPATH
        --relocate OLDPATH=NEWPATH Pour les paquets relogeable, traduit tous les chemins de fichier qui commencent par OLDPATH avec NEWPATH
        --replacefiles Install les paquets même s'ils remplacent des fichiers d'autres paquets déjà installés
        --replacepkgs Install les paquets même si certains d'entre eux sont déjà installés dans le système
        --test N'install pas le paquet, effectue simplement une vérification et reporte les conflits potentiels

Options d'effacement

-e, --erase Supprime un paquet

        --allmatches Supprime toutes les versions de paquet correspondant au nom donné. Normalement une erreur est donnée si le nom correspond à plusieurs paquets
        --justdb Met à jour la base de données uniquement
        --nodeps Ne vérifie pas les dépendance avant de désinstaller les paquets
        --noscripts, --nopreun, --nopostun N'execute pas les scriptlets correspondant
        --notriggers, --notriggerun, --notriggerpostun N'exécute pas les scriptlets correspondant
        --test N'effectue qu'un test, utile avec -vv

Option de recherche

-q, --query Recherche des paquets
--qf, --queryformat QUERYFMT les formats de recherche sont des versions modifiées du formattage printf(3). Le format est fait de chaînes statiques et de formatteurs type printf(3). Les formats alternatifs avec un tag suivant:

                :armor Ajoute une clé publique en ASCII
                :arraysize Nombre d'élément dans les tags
                :base64 Encode en base64
                :date utilise strftime(3) "%c"
                :day utilise strftime(3) "%a %b %d %Y"
                :depflags Formatte l'opérateur de comparaison de dépendance
                :deptype Formatte de type de dépendance
                :expand Expansion de macro
                :fflags Formatte les flags de fichier
                :fstate Formatte l'état des fichiers
                :fstatus Formatte de status de vérification de fichier
                :hex Formatte en hexa
                :octal Formatte en octal
                :humaniec Nombre human readable en IEC 80000
                :humansi Nombre human readable en SI
                :perms Formatte les permissions de fichier
                :pgpsig Affiche la signature et la date
                :shescape Échappe les guillemets simple
                :triggertype Affiche le suffix trigger
                :vflags Flags de vérification de fichier
                :xml Imbrique dans un balisage XML

Options de sélection de paquet

        PACKAGE_NAME Requête le paquet installé spécifié. Pour spécifier un paquet plus précisemment le paquet peut être suivi pas la version ou version et release, séparés par un ':', ou une architecture séparé par un '.'

        -a, --all [SELECTOR] Requête tous les paquets installés
        --dupes Liste les paquets dupliqués
        -f, --files FILE Recherche les paquets possedant le fichier spécifié
        --filecaps liste les noms de fichier avec las capabilities POSIX1.e
        --fileclass Liste les noms de fichier avec leur classes
        --filecolor Liste les fichier avec leur couleurs (0 noarch, 1 32bits, 2 64bits)
        --fileprovide Liste les noms de fichiers et ce qu'ils fournissent
        --filerequire Liste les noms de fichiers et leur requis
        -g, --group GROUP Recherche les paquets avec les groupe spécifié
        --hdrid SHA1 Recherche des paquets contenant un identifiant d'en-tête donné.
        -p, --package PACKAGE_FILE Recherche un paquet désinstallé
        --pkgid MD5 Recherche un paquet qui contient l'identifiant donné
        --querybynumber HDRNUM Recherche le numéro d'entrée dans la base directement
        --specfile SPECFILE Recherche SPECFILE comme si c'était un paquet. Permet d'extraire des informations sur les spécificité d'un fichier sans avoir à écrire un parser spécifique
        --tid TID Requête les paquets qui ont l'identifiant de transaction spécifié. Un horodatage unix est actuellement utilisé Tous les paquets installé ou effacés dans une seule transaction ont le même identifiant
        --triggeredby PACKAGE_NAME Recherche les paquet qui ont été déclenchés par le paquet spécifié
        --whatobsoletes CAPABILITY Recherche les paquets qui obsolètent la capabilitie pour fonctionner correctement
        --whatprovides CAPABILITY Recherche les paquets qui fournissent la capabilitie
        --whatrequires CAPABILITY Recherche tous les paquet qui nécessitent la capabilitie
        --whatconflicts CAPABILITY Recherche tous les paquets qui sont en conflit avec la capabilitie
        --whatrecommends CAPABILITY Recherche tous les paquets qui recommandent la capabilitie
        --whatsuggests CAPABILITY Recherche tous les paquets qui suggèrent la capabilitie
        --whatsupplements CAPABILITY Recherche tous les paquets qui impléments la capabilitie
        --whatenhances CAPABILITY Recherche tous les paquets qui améliorent la capabilitie

Options de recherche de paquet

        -d, --artifactfiles Liste seulement les artefacts (implique -l)
        --changelog Affiche des informations sur un paquet
        --changes Affiche des informations sur un paquet avec horodatages complets
        -c, --configfiles Liste seulement les fichiers de configuration (implique -l)
        --conflicts Liste les capabilitie qui sont en conflit avec ce paquet
        -d, --docfiles Liste seulement les fichiers de documentation (implique -l)
        --dump Dump les informations de fichier: path size mtime digest mode owner group isconfig isdoc rdev symlink
        --enhances Liste les capabilitie améliorés par ce paquet
        --filesbypkg Liste tous les fichiers dans chaque paquet sélectionné
        --filetriggers Liste tous les scriptlets filetrigger des paquets
        -i, --info Affiche des informations sur le paquet
        --last Ordonne les paquets par date d'installation, du plus récent au plus ancien
        -L, --licensefiles Liste seulement les fichiers de license (implique -l)
        -l, --list Liste les fichiers dans le paquet
        --obsoletes Liste les paquets qui obsolètent ce paquet
        --provides Liste les capabilities que ce paquet fournis
        --recommends Liste les capabilities recommandées par ce paquet
        -R, --requires Liste les capabilities dont ce paquet dépend
        --suggests Liste les capabilities suggérées par ce paquet
        --supplements Liste les capabilitie supplémenté par ce paquet
        --scripts Liste les scriptlets spécifique au paquet qui sont utilisés durant l'installation/désinstallation
        -s, --state Affiche l'état des fichiers dans le paquet (implique -l): normal, not installed, ou replaced
        --triggers, --triggerscripts Affiche les scripts triggers contenus dans le paquet
        --noartifact N'affiche pas les fichier artefacts
        --noghost N'affiche pas les fichiers fantôme.
        --noconfig N'affiche pas les fichiers de configuration
        --xml Formatte les en-têtes en XML

Options de vérification

-V, --verify Vérifie un paquet

        --nodepts Ne vérifie pas les dépendances
        --nodigest Ne vérifie pas le hash des en-tête
        --nofiles Ne vérifie pas les attributs des fichiers
        --noghost Ne vérifie pas le fichiers fantôme
        --noconfig Ne vérifie pas les fichiers de configuration
        --noscripts N'exécute pas le scriptlet %verifyscript.
        --nosignature Ne vérifie pas le paquet ou les signatures d'en-tête
        --nolinkto
        --nofiledigest
        --nosize
        --nouser
        --nogroup
        --nomtime
        --nomode
        --nordev Ne vérifie pas ces attributs de fichier
        --nocaps Ne vérifie pas les capabilitie des fichiers

           Le format de sortie est une chaîne de 9 caractères, un marqueur possible parmis:

                c %config Fichier de configuration
                d %doc Fichier documentation
                g %ghost Fichier dont le contenu n'est pas inclus dans le payload du paquet
                l %license Fichier de license
                r %readme Fichier readme

           Depuis l'en-tête du paquet, suivi par le nom du fichier. Chacun des 9 caractères dénote le résultat d'une comparaison des attributs du fichier à la valeur des attributs enregistrés dans la base. Un '.' signifie que le test est passé, '?' indique que le test ne peut pas être effectué. Sinon, un B denote un echecdans le test correspondant:

                S La taille du fichier diffère
                M Les permissions diffèrent
                5 Le hash md5 diffère
                D Le numéro majeur/mineur diffère
                L Le chemin du lien diffère
                U Le propriétaire diffère
                G Le groupe propriétaire diffère
                T le mTime diffère
                P Les capabilities diffèrent

Options diverses

--showrc Affiche les valeurs que prm utilise pour toutes les options, définies dans les fichiers rpmrc et macro
--setperms, --setugids, --setcaps, --restore Définis le éléments spécifiés des fichiers dans le paquet donné. Préférer --restore, qui restaure tout. mutuellement exclusifs

Options FTP/HTTP

   rpm peut agir comme client ftp ou http. Les url sont sous la forme:

  ftp://USER:PASSWORD@HOST:PORT/path/to/package.rpm

  Si :PASSWORD est omis, il est demandé. Si l'utilisateur et le mot de passe sont omis, utilise ftp anonyme est utilisé. Dans tous les cas, un transfert FTP passif est effectué.

        --ftpproxy HOST Spécifie le proxy ftp à utiliser
        --ftpport PORT Spécifie le port TCP à utiliser
        --httpproxy HOST Spécifie le proxy http à utiliser
        --httpport PORT Spécifie le port http à utiliser

Fichiers

/usr/lib/rpm/rpmrc
/usr/lib/rpm/redhat/rpmrc
/etc/rpmrc
~/.rpmrc Configuration rpmrc
/usr/lib/rpm/macros
/usr/lib/rpm/redhat/macros
/etc/rpm/macros
~/.rpmmacros configuration macro
/var/lib/rpm/Basenames
/var/lib/rpm/Conflictname
/var/lib/rpm/Dirnames
/var/lib/rpm/Group
/var/lib/rpm/Installtid
/var/lib/rpm/Name
/var/lib/rpm/Obsoletename
/var/lib/rpm/Packages
/var/lib/rpm/Providename
/var/lib/rpm/Requirename
/var/lib/rpm/Sha1header
/var/lib/rpm/Sigmd5
/var/lib/rpm/Triggername Base de données
/var/tmp/rpm* Temporaire

Format de requêtes

   rpm permet de spécifie quelles informations afficher et commment les formater. Toutes les informations d'un paquet, hormis les signatures et les fichiers sont des headers. Chaque élément dans le header a un tag associé. La liste des tags peut être obtenue avec rpm --querytags. Un tag consiste d'un élément ou un tableau d'éléments. Chaque élément peut être une chaîne ou un nombre.

  une format de requête est passé après --queryformat similaire à printf(2), mais sans spécifier le type de données à afficher.

        Pour afficher les noms et taille des paquets installés dans le système:
        rpm -qa --queryformat "%{NAME} %{SIZE}\n"
        Pour utiliser les formateurs printf, max 30 caractères du nom et aligner la taille à droite:
        rpm -qa --queryformat "%-30{NAME} %10{SIZE}\n"
        RPM utilise de nombreux tableaux en interne. Par exemple la taille des fichiers et leur nom sont conservés dans des tableaux. Pour itérer dans un jeu de tableaux, utiliser le format:
        rpm -q --queryformat "[%-50{FILENAMES} %10{FILESIZES}\n]" less
        Pour affiche les noms des paquets installés suivis par le nom des fichiers qu'ils contiennt, un par ligne:
        rpm -qa --queryformat "[%{NAME}\n[ %-60{FILENAMES} %10{FILESIZES}\n]]"
        Pour lister les fichiers d'un paquet, avec pour chaque ligne, le nom du paquet suivi du fichier, utiliser le '=' avant NAME afin d'utiliser toujours le premier item de NAME:
        rpm -qa --queryformat "[%{=NAME} %{FILENAMES}\n]" less
        Une des faiblesses avec les formats de recherche est qu'il ne sait pas afficher le tag INSTALLTIME (entre autre) au format date au lieu d'un nombre. Il est possible de spécifier un autre format:
        rpm -q --queryformat "%{NAME} %{INSTALLTIME:date}\n" less
        rpm -q --queryformat "[%{FILEMODES:perms} %{FILENAMES}\n]" less
        rpm -q --queryformat "[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]" less
        Une simple condition peut être évaluée via les expression, délimités par %[...]. pour afficher present si un tag est présent, missing sinon:
        %|SOMETAG?{present}:{missing}|

Récupération de la base

   Si une commande rpm bloque ou ne se comporte pas correctement, la première chose à vérifier est l'état des fichiers de lock:

  cd /var/lib/rpm && /usr/lib/rpm/rpmdb_stat -CA

  Sous les sections Locks grouped by lockers et Locks grouped by object, il ne devrait pas y avoir d'entrée.

  Le format de la base permet à de nombreux processus d'être en concurrence sur la db, donc il n'y a pas de manière sûr pour une commande RPM d'identifier et de supprimer les locks de manière sûre. Les locks sont maintenus par des fichiers nommés avec 2 '_' initiaux. La meilleurs manière de supprimer les locks est en mode single. Si ce n'est pas possible, utiliser:

  lsof | grep /var/lib/rpm

  pour trouver les programmes qui utilisent la base de données avant de supprimer les locks

Récupérer une base de données corrompue

Si la base de données semble corrompue, le fichier qui doit être reconstruit est le fichier /var/lib/rpm/Packages, puis les index doivent être regénérés. Avant d'effectuer une action potentiellement destructrice, toujours backuper la db:
cd /var/lib && tar zcvf /var/preserve/rpmdb-`date +"%d%m%Y"`.tar.gz rpm
Puis vérifier l'intégrité du fichier Packages:
cd /var/lib/rpm && rm -f __db* && /usr/lib/rpm/rpmdb_verify Packages
Si une erreur est reportée, un dump est requis. Une fois le dump effectué, vérifier l'intégrité du nouveau fichier Package:
mv Packages Packages.orig && /usr/lib/rpm/rpmdb_dump Packages.orig | /usr/lib/rpm/rpmdb_load Packages && /usr/lib/rpm/rpmdb_verify Packages
Si le fichier Packages a passé les vérifications, une vérification supplémentaire vérifie les en-tête dans la db, et recherche tout message envoyés sur stderr:
rpm -qa 1› /dev/null
Si la requête passe sans afficher de message, il est temps de reconstruire les index:
rpm -v --rebuilddb
à ce point, la base devrait être fonctionnelle. Dans le cas contraire, un bug doit être reporté

Macros

   RPM supporte les fichiers de macro. Les macro font de la substitution de texte. Les macro paramétrisés incluent un champ options et effectuent un traitement argc/argv. Durant l'expansion de macro, les flags et arguments sont disponibles comme macro et sont supprimés à la fin de l'expansion. Les macros peuvent être utilisé n'importe où dans un fichier spec, et en particulier dans les listes de fichiers inclus (ceux lus en utilisant %files -f ‹file›. De plus les macros peuvent être imbriqués.

Définir une macro

   Pour définir une macro:

  %define ‹name›[(opts)] ‹body›

  Les noms peuvent être composés de caractères alphanumériques et du caractère '_', 3 caractères minimum. Une macro sans options est simple: une simple expansion récursive est effectuée. Une macro paramétrisée contient le champ options et est passé exactement à getopt(3) pour traiter argc/argv au début de l'appel de la macro. "-" peut être utilisé pour séparer les options des arguments. Durant l'expansion, les macros suivantes sont disponibles:

        %0 Le nom de la macro invoqué
        %* Tous les arguments sans les flags traités
        %** Tous les arguments et flags traités
        %# Le nombre d'arguments
        %{-f} Si présent à l'invocation, le flag f lui-même
        %{-f*} Si présent à l'invocation, l'argument du flag f
        %1, %2 Les arguments eux-même

   À la fin de l'invocation d'une macro paramétrisée, ces macros sont supprimées

Écrire une macro

   Dans le corps d'une macro, il y'a de nombreuses constructions qui permettent de tester la présence de paramètres optionnels. La construction la plus simple, ${-f} s'étend à -f si -f a été mentionnée quand la macro a été invoquée. Il y a également un provisioning pour inclure du texte si le flag est présent %{-f:X}. Cette macro étend à X si le flag est présent. La forme négative est: %{!-f:X}

  En plus de la forme %{...}, l'expansion shell peut être effectuée avec %(shell command) en utilisant /bin/sh. Par exemple: %(date +%%y%%m%%d) étend la date.

Macros intégrées

   Il existe des macro intégrées:

        %trace Affiche des informations de debuggage avant/après l'expansion
        %dump Affiche la table macro active
        %getncpus Nombre de cpu disponibles pour le traitement
        %verbose Si rpm est en mode verbeux
        %dnl ignore la ligne suivante, sans l'étendre
        %{echo:...} Affiche ... sur stdout
        %{warn:...} Affiche ... sur stderr
        %{error:...} Affiche ... sur stderr et génère une erreur
        %define Définis une macro
        %undefine Supprime une macro
        %global Définie une macro dont le corp est disponible dans le contexte global
        %{load:...} Charge un fichier macro
        %{expand:...} Comme eval, étend ... à ‹body› et re-étend ‹body›
        %{shrink:...} Supprime tous les espaces blanc et réduit tous les espaces blanc intermédiaire à un seul espace
        %{quote:...} Met entre guillemets un argument de macro paramétrique
        %{lua:....} Étend avec l'interpréteur lua embarqué
        %{uncompress:...} Étend ... au fichier et test pour voir si le fichier compressé. L'expansion est

                cat ‹file› si non compressé
                gzip -dc Si gzipé
                bzip2 -dc Si bzipé

        %{basename:...} similaire à basename(1)
        %{dirname:...} similaire à dirname(1)
        %{suffix:...} Étend la partie suffixe d'un nom de fichier
        %{url2path:...} Convertit une url à un chemin local
        %{getenv:...} Étend le répertoire home rpm (défaut: /usr/lib/rpm)
        %{S:...} Étend ... au nom de fichier source
        %{P:...} Étend ... au nom de fichier patch
        %{F:...} Étend ... au nom de fichier file

   Noter que %define diffère de %global, pas seulement dans le scope: le corp de %define est étendu plus simplement, mais le corp de %global est étendu au moment de la définition. Il est possible d'utiliser %%- pour forcer l'expansion de %global plus simplement.

  Les macros peuvent être automatiquement étendus s'ils sont dans /usr/lib/rpm/macros.

Interpreteur LUA

rpm embarque un interpréteur LUA et peut être utilisé comme interpréter des scriplets (%pre, %post, etc)
%pre -p ‹lua›
print('Hello from lua")
Les scriptlets sont traités dans le contexte du processus rpm au lieu de forker un nouveau processus. Celà a un avantage sur un scriptlet /bin/sh: plus rapide, pas de dépendances requise, et il peut créer de nouvelles macros par exemple.
À l'initialisation, rpm exécute le script /usr/lib/rpm/init.lua.

Exemples

Installer un paquet
rpm -i less
mettre à jour un paquet
rpm -U less
Lister tous les paquets installés
rpm -qa
Savoir si un paquet est installé
rpm -q vsftpd
Lister les dépendances d'un paquet
rpm -qR audit
Afficher des informations sur un paquet installé
rpm -qi audit
Afficher les fichiers installés et leur état
rpm -qls audit
Pour revenir à une ancienne version d'un paquet:
rpm -Uvh --oldpackage less
Importer une clé GPG afin de valider les paquets téléchargés
rpm --import /mnt/cdrom/RPM_GPGKEY
Voir les clé installées:
rpm -qa gpg-pubkey*
Vérifier un paquet:
rpm -K /tmp/audit-2.7.8-1.fc26.x86_64.rpm