Einführung
In diesem Lab lernen Sie die Grundlagen der Verwaltung von Softwarepaketen auf RPM-basierten Linux-Distributionen mithilfe des leistungsstarken rpm-Befehlszeilen-Dienstprogramms kennen. Sie sammeln praktische Erfahrungen mit wesentlichen Aufgaben der Paketverwaltung, einschließlich der Abfrage detaillierter Paketinformationen, der Überprüfung der Integrität installierter Pakete und der Untersuchung des Inhalts von RPM-Dateien.
Im Laufe der Schritte verwenden Sie spezifische rpm-Befehle, um herauszufinden, zu welchem Paket eine Datei gehört, Abhängigkeiten und Konfigurationsdateien eines Pakets aufzulisten und nach Rückwärtsabhängigkeiten zu suchen. Sie lernen außerdem, wie Sie eine Paketdeinstallation sicher simulieren, um deren Auswirkungen zu verstehen, und wie Sie den Inhalt einer RPM-Paketdatei vor der Installation mit Tools wie rpm2cpio und cpio untersuchen.
Abfragen grundlegender Paketinformationen mit rpm -qi und rpm -qf
In diesem Schritt lernen Sie, wie Sie Informationen über installierte Pakete mithilfe des Red Hat Package Managers (rpm) abfragen. rpm ist ein leistungsstarkes Befehlszeilen-Tool zur Verwaltung von Software auf RPM-basierten Linux-Distributionen wie CentOS, Fedora und RHEL. Wir konzentrieren uns auf zwei grundlegende Abfrageoptionen: -qi, um detaillierte Paketinformationen zu erhalten, und -qf, um herauszufinden, zu welchem Paket eine bestimmte Datei gehört.
Untersuchen wir zunächst die Details eines Pakets, das bereits auf Ihrem System installiert ist. Die bash-Shell ist eine Kernkomponente des Systems und daher ein perfektes Beispiel. Das Flag -q steht für „query“ (Abfrage) und das Flag i für „information“ (Informationen).
Wechseln Sie zunächst in das Lab-Arbeitsverzeichnis, damit die von Ihnen erstellten Befehlsausgabedateien an einem Ort bleiben:
cd /home/labex/project
Führen Sie den folgenden Befehl in Ihrem Terminal aus, um Informationen über das bash-Paket abzufragen und die Ausgabe in bash-package-info.txt zu speichern:
rpm -qi bash | tee bash-package-info.txt
Sie sehen eine detaillierte Ausgabe mit verschiedenen Attributen des Pakets. Die Ausgabe sieht in etwa so aus (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 bietet eine Fülle von Informationen, einschließlich der Version des Pakets, einer Zusammenfassung seines Zwecks und einer detaillierteren Beschreibung.
Stellen Sie sich nun vor, Sie haben eine Datei auf Ihrem System, wie die bash-Executable unter /usr/bin/bash, und möchten wissen, welches Paket sie installiert hat. Dies ist eine häufige Aufgabe bei der Systemprüfung oder Fehlerbehebung. Hierfür können Sie die Flags -qf verwenden, wobei f für „file“ (Datei) steht.
Führen Sie den folgenden Befehl aus, um herauszufinden, welches Paket die Datei /usr/bin/bash besitzt, und speichern Sie das Ergebnis in bash-owner.txt:
rpm -qf /usr/bin/bash | tee bash-owner.txt
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 den zuvor gefundenen Informationen übereinstimmt. Sie können diese Flags sogar kombinieren, um direkt Informationen über das Paket zu erhalten, das eine Datei besitzt, indem Sie rpm -qif /usr/bin/bash ausführen.
Auflisten von Paketabhängigkeiten und Konfigurationsdateien mit rpm -qR und rpm -qc
In diesem Schritt setzen Sie die Erkundung von rpm fort, 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 meisten Softwareprogramme auf andere Pakete angewiesen sind, um korrekt zu funktionieren. Zu wissen, wo sich Konfigurationsdateien befinden, ist für die Systemadministration und Anpassung unerlässlich.
Arbeiten Sie weiter in /home/labex/project. Beginnen wir damit, herauszufinden, welche anderen Pakete oder Funktionen das bash-Paket benötigt. Wir verwenden hierfür 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 und die Ausgabe in bash-requires.txt zu speichern:
rpm -qR bash | tee bash-requires.txt
Die Ausgabe ist eine Liste von Paketen und Systemfunktionen, von denen bash abhängt. Diese Liste kann recht lang sein.
/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)
Diese Ausgabe zeigt, dass bash von grundlegenden Systemfunktionen wie libc.so.6, dem filesystem-Paket und anderen Laufzeitkomponenten abhängt.
Lassen Sie uns als Nächstes die Konfigurationsdateien finden, die als Teil des bash-Pakets installiert wurden. Dies ist nützlich, wenn Sie das Standardverhalten der Shell für neue Benutzer ändern müssen. Hierfür wird das Flag -qc verwendet, wobei c für „configfiles“ (Konfigurationsdateien) steht.
Führen Sie diesen Befehl aus, um die Konfigurationsdateien für bash aufzulisten und die Ausgabe in bash-config-files.txt zu speichern:
rpm -qc bash | tee bash-config-files.txt
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 Vorlagendateien, die in das Home-Verzeichnis eines neuen Benutzers kopiert werden, wenn das Benutzerkonto erstellt wird.
Sie können auch Flags kombinieren, um die Konfigurationsdateien zu finden, die sich auf einen bestimmten Befehl beziehen. Um beispielsweise die vom passwd-Befehl verwendeten Konfigurationsdateien anzuzeigen, 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 | tee passwd-config-files.txt
Dieser Befehl zeigt die mit dem passwd-Dienstprogramm verknüpften Konfigurationsdateien:
/etc/pam.d/passwd
Dies ist eine leistungsstarke Methode, um schnell zu identifizieren, welche Dateien Sie möglicherweise bearbeiten müssen, um das Verhalten eines Befehls zu ändern.
Überprüfen der Paketintegrität und Dateiänderungen mit rpm -V
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 Sicherheit und Fehlerbehebung. Er vergleicht die von einem Paket installierten Dateien mit den in der RPM-Datenbank gespeicherten Informationen, wie Dateigrößen, Berechtigungen und Prüfsummen. Auf diese Weise können Sie unbefugte oder versehentliche Änderungen an Systemdateien erkennen.
Stellen Sie zunächst sicher, dass einige Dienstprogramm-Pakete, lsscsi und at, auf dem System installiert sind. Wir werden sie für unsere Überprüfungstests verwenden.
sudo dnf install -y lsscsi at
Arbeiten Sie weiter in /home/labex/project. Überprüfen wir nun das lsscsi-Paket. Da wir es gerade installiert haben und keine Änderungen vorgenommen haben, sollte es den Überprüfungstest bestehen. Eine erfolgreiche Überprüfung erzeugt keine Ausgabe.
rpm -V lsscsi | tee lsscsi-verify.txt
Wie erwartet kehrt die Eingabeaufforderung ohne Meldung zurück, was darauf hinweist, dass sich alle Dateien im lsscsi-Paket in ihrem ursprünglichen Zustand befinden.
Ändern wir nun absichtlich eine Konfigurationsdatei und sehen wir, wie rpm -V die Änderung meldet. Wir fügen eine Zeile zur Datei /etc/at.deny hinzu, die zum at-Paket gehört. Diese Datei steuert, welche Benutzer den at-Befehl nicht verwenden dürfen.
echo "labex" | sudo tee -a /etc/at.deny
Nachdem wir nun eine Datei geändert haben, überprüfen wir das at-Paket erneut.
sudo rpm -V at | tee at-verify.txt
Diesmal erzeugt der Befehl eine Ausgabe, die darauf hinweist, dass eine Änderung erkannt wurde:
S.5....T. c /etc/at.deny
Schlüsseln wir diese Ausgabe auf:
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 Configurationsdatei./etc/at.deny: Der Pfad zur geänderten Datei.
Jede Zeichenposition in der 8-stelligen Zeichenfolge S.5....T. stellt einen anderen Test dar. Ein . bedeutet, dass der Test bestanden wurde. Diese Ausgabe zeigt deutlich, dass die Konfigurationsdatei /etc/at.deny seit ihrer Installation geändert wurde.
Sie können das Paket, das eine bestimmte Datei besitzt, auch direkt mit den Flags -qVf überprüfen.
sudo rpm -qVf /etc/at.deny | tee at-file-verify.txt
Dieser Befehl erzeugt dieselbe Ausgabe, da er zuerst das Paket findet, das /etc/at.deny besitzt (at), und es dann überprüft.
Überprüfen von Rückwärtsabhängigkeiten und Simulieren der Paketdeinstallation mit rpm -e --test
In diesem Schritt lernen Sie, wie Sie nach Rückwärtsabhängigkeiten suchen und die Deinstallation eines Pakets sicher simulieren. Während der Befehl rpm -qR zeigt, was ein Paket benötigt (seine Abhängigkeiten), zeigt rpm -q --whatrequires, was andere Pakete benötigen (seine Rückwärtsabhängigkeiten). Dies ist extrem wichtig zu wissen, bevor Sie ein Paket entfernen, da Sie sonst andere Teile des Systems beschädigen könnten.
Arbeiten Sie weiter in /home/labex/project. Um die Konsequenzen der Entfernung eines Pakets 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 Probelauf durchzuführen, ohne tatsächlich Dateien zu löschen.
Beginnen wir mit der Untersuchung eines Kernsystempakets, von dem viele andere Pakete abhängen. Das glibc-Paket stellt die GNU C Library 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 | tee glibc-whatrequires.txt
Die Ausgabe zeigt mehrere Pakete, die von glibc abhängen:
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. Sehen wir uns nun an, was passiert, wenn wir versuchen, glibc zu entfernen. Wir verwenden das Flag --test, um sicherzustellen, dass wir es nicht tatsächlich entfernen, was das gesamte System beschädigen würde.
sudo rpm -e --test glibc 2>&1 | tee glibc-remove-test.txt
Da so viele Pakete glibc benötigen, meldet RPM Abhängigkeitsfehler und verhindert die Deinstallation. 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
... (additional dependency errors)
Betrachten wir nun ein Paket mit weniger Abhängigkeiten. Das lsscsi-Paket, das wir zuvor installiert haben, ist ein Dienstprogramm-Paket mit weniger Rückwärtsabhängigkeiten. Prüfen wir, was es benötigt:
rpm -q --whatrequires lsscsi | tee lsscsi-whatrequires.txt
Sie sollten eine Ausgabe sehen, die darauf hinweist, dass keine Pakete lsscsi benötigen:
no package requires lsscsi
Da keine Pakete von lsscsi abhängen, können wir die Deinstallation sicher simulieren:
sudo rpm -e --test lsscsi 2>&1 | tee lsscsi-remove-test.txt
Dieser Befehl sollte ohne Fehler abgeschlossen werden, was darauf hinweist, dass das Entfernen von lsscsi keine anderen Pakete auf dem System beschädigen würde.
Dies zeigt, wie Sie die Auswirkungen der Entfernung eines Pakets vorhersagen und vermeiden können, Ihr System zu beschädigen, indem Sie zuerst die Rückwärtsabhängigkeiten überprüfen.
Untersuchen von RPM-Paketinhalten mit rpm2cpio und cpio
In diesem Schritt lernen Sie eine leistungsstarke Technik kennen, um den Inhalt einer RPM-Paketdatei zu untersuchen, ohne sie zu installieren. Dies ist nützlich, um die Dateien eines Pakets vor der Installation zu überprüfen 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, das eine RPM-Datei in ein cpio-Archiv konvertiert, und cpio, das dann Dateien aus diesem Archiv auflisten oder extrahieren kann.
Arbeiten Sie weiter in /home/labex/project. Zuerst benötigen Sie eine tatsächliche .rpm-Datei zur Untersuchung. Laden wir die Paketdatei für bash mit dem Paketmanager dnf in Ihr aktuelles Verzeichnis (/home/labex/project) herunter. Der Unterbefehl download ruft die Paketdatei ab, ohne sie zu installieren.
sudo dnf download bash
Sie sehen eine Ausgabe, die darauf hinweist, dass die Datei erfolgreich heruntergeladen wurde. Der Dateiname enthält die Version und die Architektur.
Last metadata expiration check: ...
bash-<version>.<arch>.rpm
Verwenden Sie nun den Befehl ls, um zu bestätigen, dass sich die .rpm-Datei in Ihrem Verzeichnis /home/labex/project befindet:
ls bash-*.rpm
Mit der bereitstehenden RPM-Datei können Sie nun 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 dann an den cpio-Befehl weiter, der das Archiv von seiner Standardeingabe liest. Das Flag -t für cpio weist es an, das Inhaltsverzeichnis aufzulisten.
rpm2cpio bash-*.rpm | cpio -t | tee bash-rpm-contents.txt
Dies erzeugt eine lange Liste aller Dateien und Verzeichnisse, die im bash-Paket enthalten sind. Die Ausgabe sieht in etwa so aus:
.
./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 bietet Ihnen einen vollständigen Überblick über die Nutzlast eines Pakets und ermöglicht es Ihnen, genau zu sehen, was auf Ihrem System platziert wird, wenn Sie es installieren würden.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie Softwarepakete mithilfe des RPM-Dienstprogramms in einer Linux-Umgebung verwalten und abfragen. Sie haben damit begonnen, detaillierte Informationen über installierte Pakete mit rpm -qi abzurufen und mithilfe von 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 Überblick darüber gibt, wie ein Paket in das System integriert ist.
Aufbauend auf diesen Abfragefähigkeiten haben Sie gelernt, die Integrität der Dateien eines installierten Pakets mit rpm -V zu überprüfen, um nach Änderungen zu suchen. Sie haben außerdem untersucht, wie Sie sicher nach Rückwärtsabhängigkeiten suchen und die Deinstallation eines Pakets mit rpm -e --test simulieren können, um die potenziellen Auswirkungen zu verstehen, ohne Änderungen vorzunehmen. Schließlich haben Sie die Fähigkeit erworben, den Inhalt einer RPM-Paketdatei vor der Installation zu untersuchen, indem Sie rpm2cpio und cpio verwenden, um deren Inhalt zu extrahieren und aufzulisten.



