Paketverwaltung mit RPM unter Linux

Red Hat Enterprise LinuxBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die Grundlagen der Verwaltung von Softwarepaketen auf RPM-basierten Linux-Distributionen mithilfe des leistungsstarken Kommandozeilenwerkzeugs rpm. Sie sammeln praktische Erfahrungen bei essenziellen Aufgaben der Paketverwaltung, darunter das Abfragen detaillierter Paketinformationen, das Überprüfen der Integrität installierter Pakete und das Untersuchen der Inhalte von RPM-Dateien.

Im Laufe der Schritte werden Sie spezifische rpm-Befehle verwenden, um herauszufinden, zu welchem Paket eine bestimmte Datei gehört, Paketabhängigkeiten und Konfigurationsdateien aufzulisten sowie nach inversen Abhängigkeiten zu suchen. Sie lernen außerdem, wie Sie eine Paketdeinstallation sicher simulieren, um deren Auswirkungen zu verstehen, und wie Sie den Inhalt eines RPM-Pakets vor der eigentlichen Installation mit Werkzeugen wie rpm2cpio und cpio unter die Lupe nehmen.

Basis-Paketinformationen mit rpm -qi und rpm -qf abfragen

In diesem Schritt lernen Sie, wie Sie Informationen über installierte Pakete mit dem Red Hat Package Manager (rpm) abfragen. rpm ist ein mächtiges Werkzeug zur Verwaltung von Software auf RPM-basierten Linux-Distributionen wie CentOS, Fedora und RHEL. Wir konzentrieren uns auf zwei grundlegende Abfrageoptionen: -qi für detaillierte Paketinformationen und -qf, um herauszufinden, zu welchem Paket eine bestimmte Datei gehört.

Zuerst untersuchen wir die Details eines Pakets, das bereits auf Ihrem System installiert ist. Die bash-Shell ist eine Kernkomponente des Systems und eignet sich daher perfekt als Beispiel. Das Flag -q steht für „query“ (Abfrage) und das Flag i für „information“.

Führen Sie den folgenden Befehl in Ihrem Terminal aus, um Informationen über das bash-Paket abzurufen:

rpm -qi bash

Sie sehen eine detaillierte Ausgabe mit verschiedenen Attributen des Pakets. Die Ausgabe wird in etwa so aussehen (Versionsnummern und Daten können variieren):

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.

Diese Ausgabe liefert eine Fülle von Informationen, einschließlich der Paketversion, einer Zusammenfassung des Verwendungszwecks und einer detaillierteren Beschreibung.

Stellen Sie sich nun vor, Sie finden eine Datei auf Ihrem System, wie zum Beispiel die ausführbare Datei von bash unter /usr/bin/bash, und möchten wissen, welches Paket diese installiert hat. Dies ist eine häufige Aufgabe bei der Systemprüfung oder Fehlerbehebung. Hierfür verwenden Sie die Flags -qf, wobei f für „file“ (Datei) steht.

Führen Sie den folgenden Befehl aus, um den Besitzer der Datei /usr/bin/bash zu ermitteln:

rpm -qf /usr/bin/bash

Der Befehl gibt den vollständigen Namen des Pakets zurück, das diese Datei bereitstellt:

bash-5.1.8-9.el9.x86_64

Wie Sie sehen, erkennt das System korrekt, dass /usr/bin/bash aus dem bash-Paket stammt, was mit unseren vorherigen Informationen übereinstimmt. Sie können diese Flags sogar kombinieren, um direkt Informationen über das Paket zu erhalten, dem eine Datei gehört, indem Sie rpm -qif /usr/bin/bash ausführen.

Paketabhängigkeiten und Konfigurationsdateien mit rpm -qR und rpm -qc auflisten

In diesem Schritt vertiefen Sie Ihre Kenntnisse über rpm, indem Sie lernen, wie Sie die Abhängigkeiten eines Pakets und die zugehörigen Konfigurationsdateien auflisten. Das Verständnis von Abhängigkeiten ist entscheidend, da die meiste Software auf andere Pakete angewiesen ist, um korrekt zu funktionieren. Zu wissen, wo sich Konfigurationsdateien befinden, ist für die Systemadministration und individuelle Anpassungen unerlässlich.

Beginnen wir damit, herauszufinden, welche anderen Pakete oder Systemfunktionen das bash-Paket benötigt. Dazu verwenden wir das Flag -qR (oder --requires). Das R steht für „requires“ (erfordert).

Führen Sie den folgenden Befehl aus, um die Abhängigkeiten für bash anzuzeigen:

rpm -qR bash

Die Ausgabe ist eine Liste von Paketen und Systemfunktionen, von denen bash abhängig ist. Diese Liste kann recht lang sein.

/bin/sh
config(bash) = 4.4.20-5.el8
filesystem >= 3
glibc
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)

Diese Ausgabe zeigt, dass bash unter anderem das glibc-Paket (welches die C-Bibliothek libc.so.6 bereitstellt), das filesystem-Paket und andere Komponenten auf Systemebene benötigt.

Als Nächstes suchen wir die Konfigurationsdateien, die als Teil des bash-Pakets installiert wurden. Dies ist nützlich, wenn Sie das Standardverhalten der Shell für neue Benutzer ändern möchten. Hierfür wird das Flag -qc verwendet, wobei c für „configfiles“ steht.

Führen Sie diesen Befehl aus, um die Konfigurationsdateien für bash aufzulisten:

rpm -qc bash

Die Ausgabe zeigt die vollständigen Pfade zu den Konfigurationsdateien:

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

Diese Dateien in /etc/skel sind Vorlagen, die in das Home-Verzeichnis eines neuen Benutzers kopiert werden, wenn dessen Benutzerkonto erstellt wird.

Sie können auch Flags kombinieren, um Konfigurationsdateien zu finden, die mit einem bestimmten Befehl zusammenhängen. Um beispielsweise die vom Befehl passwd verwendeten Konfigurationsdateien zu sehen, können Sie -qcf verwenden. Dies weist rpm an, zuerst das Paket für die Datei zu finden (-f /usr/bin/passwd) und dann dessen Konfigurationsdateien aufzulisten (-c).

rpm -qcf /usr/bin/passwd

Dieser Befehl zeigt die Konfigurationsdateien an, die mit dem Hilfsprogramm passwd verknüpft sind:

/etc/pam.d/passwd

Dies ist ein effizienter Weg, um schnell zu identifizieren, welche Dateien Sie bearbeiten müssen, um das Verhalten eines Befehls zu ändern.

Paketintegrität und Dateiänderungen mit rpm -V verifizieren

In diesem Schritt lernen Sie, wie Sie die Integrität eines installierten Pakets mit rpm -V (oder rpm --verify) überprüfen. Dieser Befehl ist ein wichtiges Werkzeug für die Sicherheit und Fehlerbehebung. Er vergleicht die durch ein Paket installierten Dateien mit den in der RPM-Datenbank gespeicherten Informationen, wie Dateigrößen, Berechtigungen und Prüfsummen. So können Sie unbefugte oder versehentliche Änderungen an Systemdateien erkennen.

Zuerst stellen wir sicher, dass einige Hilfspakete, lsscsi und at, auf dem System installiert sind. Wir werden diese für unsere Verifizierungstests verwenden.

sudo dnf install -y lsscsi at

Nun verifizieren wir das Paket lsscsi. Da wir es gerade erst installiert und keine Änderungen vorgenommen haben, sollte es den Test bestehen. Eine erfolgreiche Verifizierung erzeugt keine Ausgabe.

rpm -V lsscsi

Wie erwartet kehrt die Eingabeaufforderung ohne Meldung zurück, was bedeutet, dass sich alle Dateien des Pakets lsscsi im Originalzustand befinden.

Als Nächstes werden wir absichtlich eine Konfigurationsdatei ändern und sehen, wie rpm -V diese Änderung meldet. Wir fügen eine Zeile zur Datei /etc/at.deny hinzu, die zum Paket at gehört. Diese Datei steuert, welchen Benutzern die Verwendung des at-Befehls untersagt ist.

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

Nachdem wir die Datei geändert haben, verifizieren wir das Paket at erneut.

sudo rpm -V at

Diesmal erzeugt der Befehl eine Ausgabe, die darauf hinweist, dass eine Änderung erkannt wurde:

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

Lassen Sie uns diese Ausgabe aufschlüsseln:

  • S: Die Dateigröße (Size) hat sich geändert.
  • 5: Die MD5-Prüfsumme hat sich geändert.
  • T: Die Änderungszeit (Time) hat sich geändert.
  • c: Dies kennzeichnet eine Konfigurationsdatei (configuration file).
  • /etc/at.deny: Der Pfad zur geänderten Datei.

Jede Zeichenposition in der 8-stelligen Zeichenfolge S.5....T. steht für einen anderen Test. Ein . bedeutet, dass der Test bestanden wurde. Diese Ausgabe zeigt deutlich, dass die Konfigurationsdatei /etc/at.deny seit ihrer Installation verändert wurde.

Sie können das Paket, dem eine bestimmte Datei gehört, auch direkt mit den Flags -qVf verifizieren.

sudo rpm -qVf /etc/at.deny

Dieser Befehl liefert das gleiche Ergebnis, da er zuerst das Paket ermittelt, dem /etc/at.deny gehört (at), und dieses dann verifiziert.

Inverse Abhängigkeiten prüfen und Paketdeinstallation mit rpm -e --test simulieren

In diesem Schritt lernen Sie, wie Sie inverse Abhängigkeiten prüfen und die Deinstallation eines Pakets sicher simulieren. Während der Befehl rpm -qR zeigt, was ein Paket benötigt (Abhängigkeiten), zeigt rpm -q --whatrequires, welche anderen Pakete dieses Paket benötigen (inverse Abhängigkeiten). Dies ist extrem wichtig zu wissen, bevor Sie ein Paket entfernen, da Sie sonst andere Teile des Systems beschädigen könnten.

Um die Folgen einer Paketentfernung sicher zu prüfen, können Sie den Befehl rpm -e --test verwenden. Das Flag -e steht für „erase“ (löschen) und das Flag --test weist RPM an, einen Testlauf durchzuführen, ohne tatsächlich Dateien zu löschen.

Beginnen wir mit der Untersuchung eines Kernpakets des Systems, von dem viele andere Pakete abhängen. Das Paket glibc stellt die GNU C-Bibliothek bereit, die für fast alle Programme auf einem Linux-System grundlegend ist. Prüfen wir, welche Pakete glibc benötigen.

rpm -q --whatrequires glibc

Die Ausgabe zeigt mehrere Pakete, die von glibc abhängig sind:

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

Wie Sie sehen, hängen viele kritische Systempakete von glibc ab. Schauen wir nun, was passiert, wenn wir versuchen, glibc zu entfernen. Wir verwenden das Flag --test, um sicherzustellen, dass wir es nicht wirklich löschen, was das gesamte System unbrauchbar machen würde.

sudo rpm -e --test glibc

Da so viele Pakete glibc benötigen, wird RPM Abhängigkeitsfehler melden und die Deinstallation verhindern. Die Ausgabe zeigt eine lange Liste fehlgeschlagener Abhängigkeiten:

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
 ... (weitere Abhängigkeitsfehler)

Betrachten wir nun ein Paket mit weniger Abhängigkeiten. Das zuvor installierte Paket lsscsi ist ein Hilfsprogramm mit weniger inversen Abhängigkeiten. Prüfen wir, was dieses benötigt:

rpm -q --whatrequires lsscsi

Sie sollten eine Ausgabe sehen, die besagt, dass keine Pakete lsscsi benötigen:

no package requires lsscsi

Da keine Pakete von lsscsi abhängen, können wir dessen Entfernung sicher simulieren:

sudo rpm -e --test lsscsi

Dieser Befehl sollte ohne Fehler abgeschlossen werden, was darauf hindeutet, dass das Entfernen von lsscsi keine anderen Pakete auf dem System beeinträchtigen würde.

Dies zeigt, wie Sie die Auswirkungen einer Paketdeinstallation vorhersagen und Systemschäden vermeiden können, indem Sie zuerst die inversen Abhängigkeiten prüfen.

RPM-Paketinhalte mit rpm2cpio und cpio untersuchen

In diesem Schritt lernen Sie eine leistungsstarke Technik kennen, um den Inhalt einer RPM-Paketdatei zu inspizieren, ohne sie zu installieren. Dies ist nützlich, um vor der Installation zu prüfen, welche Dateien ein Paket enthält, oder um eine einzelne Datei aus einem Paket zu extrahieren, um eine beschädigte oder gelöschte Datei wiederherzustellen. Dieser Prozess umfasst zwei Befehle: rpm2cpio, der eine RPM-Datei in ein cpio-Archiv umwandelt, und cpio, der dann Dateien aus diesem Archiv auflisten oder extrahieren kann.

Zuerst benötigen Sie eine tatsächliche .rpm-Datei zum Untersuchen. Laden wir die Paketdatei für bash mit dem Paketmanager dnf in Ihr aktuelles Verzeichnis (~/project) herunter. Der Unterbefehl download lädt die Paketdatei herunter, ohne sie zu installieren.

sudo dnf download bash

Sie sehen eine Ausgabe, die den erfolgreichen Download bestätigt. Der Dateiname enthält die Version und die Architektur.

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

Verwenden Sie nun den Befehl ls, um sicherzustellen, dass sich die .rpm-Datei in Ihrem Verzeichnis ~/project befindet:

ls bash-*.rpm

Sobald die RPM-Datei bereitsteht, können Sie die Befehle rpm2cpio und cpio zusammen verwenden, um deren Inhalt aufzulisten. Der Befehl rpm2cpio liest die RPM-Datei und gibt ein cpio-Archiv an die Standardausgabe aus. Wir leiten (|) diese Ausgabe an den Befehl cpio weiter, der das Archiv von seiner Standardeingabe liest. Das Flag -t bei cpio weist es an, das Inhaltsverzeichnis aufzulisten.

rpm2cpio bash-*.rpm | cpio -t

Dies erzeugt eine lange Liste aller Dateien und Verzeichnisse, die im bash-Paket enthalten sind. Die Ausgabe wird in etwa so aussehen:

.
./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
...

Diese Technik gibt Ihnen einen vollständigen Überblick über die Nutzlast eines Pakets und ermöglicht es Ihnen, genau zu sehen, was auf Ihrem System installiert würde.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Softwarepakete mit dem RPM-Werkzeug in einer Linux-Umgebung verwalten und abfragen. Sie haben damit begonnen, detaillierte Informationen über installierte Pakete mit rpm -qi abzurufen und mit rpm -qf zu identifizieren, zu welchem Paket eine bestimmte Datei gehört. Sie haben außerdem geübt, die Abhängigkeiten eines Pakets mit rpm -qR aufzulisten und dessen Konfigurationsdateien mit rpm -qc zu lokalisieren, was einen umfassenden Einblick in die Integration eines Pakets in das System ermöglicht.

Aufbauend auf diesen Abfragefähigkeiten haben Sie gelernt, die Integrität der Dateien eines installierten Pakets mit rpm -V auf Modifikationen zu überprüfen. Sie haben zudem untersucht, wie man inverse Abhängigkeiten sicher prüft und eine Paketdeinstallation mit rpm -e --test simuliert, um potenzielle Auswirkungen zu verstehen, ohne Änderungen am System vorzunehmen. Schließlich haben Sie die Fähigkeit erworben, den Inhalt einer RPM-Paketdatei vor der Installation zu inspizieren, indem Sie rpm2cpio und cpio zum Extrahieren und Auflisten der Inhalte verwendet haben.