Ziel
Unser Ziel ist es, uns an die verfügbaren Tools zu gewöhnen, um Informationen über Paketabhängigkeiten auf einem RPM-basierten System herauszufinden.
Betriebssystem- und Softwareversionen
- Betriebssystem: Red Hat Enterprise Linux 7.5
- Software: U/min 4.11, lecker 3.4.3
Anforderungen
Privilegierter Zugriff auf das System.
Schwierigkeit
EINFACH
Konventionen
- # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von
sudo
Befehl - $ – gegebene Linux-Befehle, die als normaler nicht-privilegierter Benutzer ausgeführt werden sollen
Einführung
RPM steht für Red Hat Package Manager und ist ein bekannter und ausgereifter Paketmanager, der von allen Red Hat Flavor-Distributionen sowie von SuSE verwendet wird. Mit RPM kann der Paketierer Beziehungen zwischen Paketen und sogar Versionen von Paketen definieren – zum Beispiel benötigt ein Apache Tomcat-Server die richtige Java-Umgebung, um ausgeführt werden zu können.
Andererseits benötigen Sie zum Installieren einer Java-Umgebung keinen Tomcat-Server – Sie können sich entscheiden, eine andere Java-basierte Anwendung auszuführen, vielleicht eine von Ihnen selbst geschriebene, die bei Bedarf von Hand gestartet wird. Mit anderen Worten, der Tomcat-Server ist abhängig auf Java.
RPM kann das Leben eines Systemadministrators viel einfacher machen, indem es diese Abhängigkeiten präsentiert – und Tools, die auf RPM basieren, wie z. B. rpm
Utility oder yum
kann diese Abhängigkeiten automatisch lösen und alle zusätzlichen Pakete installieren, die für eine ordnungsgemäße Ausführung einer neuen Komponente erforderlich sind.
Informationen sammeln
Um die Liste der Pakete herauszufinden, von denen das Paket foo.bar abhängt, führen Sie einfach Folgendes aus:
# yum deplist foo.bar
Und um die Liste der Pakete zu finden, die das Paket foo.bar benötigen (von diesem abhängen):
rpm -q --whatrequires foo.bar
Ein Beispiel aus dem wirklichen Leben mit einem generischen Paket:bash
. Sehen wir uns an, welche Pakete vom Bash-Paket benötigt werden:
# yum deplist bash
package: bash.x86_64 4.2.46-30.el7
dependency: libc.so.6()(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.11)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.14)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.15)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.3)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.3.4)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.4)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libc.so.6(GLIBC_2.8)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libdl.so.2()(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libdl.so.2(GLIBC_2.2.5)(64bit)
provider: glibc.x86_64 2.17-222.el7
dependency: libtinfo.so.5()(64bit)
provider: ncurses-libs.x86_64 5.9-14.20130511.el7_4
dependency: rtld(GNU_HASH)
provider: glibc.x86_64 2.17-222.el7
provider: glibc.i686 2.17-222.el7
Aus der Paketperspektive bash
ist sehr generisch und hängt, wie oben gesehen, von einigen Kernpaketen ab. Aber wenn wir etwas viel abhängigeres installieren möchten, sagen wir, die konzole
KDE-Terminalemulator auf einem Red Hat Linux mit einem Gnome-Desktop-Manager erhalten wir möglicherweise mehr als eine Seite lange Abhängigkeitsliste. Und mit konzole
, der Fall ist sogar noch komplizierter, da es auf QT- und KDE-Paketen angewiesen ist. Um es also zu installieren, müssen Sie die gesamte KDE-Umgebung neben Gnome installieren (was Sie sicherlich tun können), um alles bereitzustellen konzole
braucht.
Um mehr darüber zu erfahren, welche Pakete installiert werden, sehen Sie sich die von yum bereitgestellte Liste an, bevor Sie mit der Installation beginnen:
# yum install konsole
Resolving Dependencies
--> Running transaction check
---> Package konsole.x86_64 0:4.10.5-4.el7 will be installed
--> Processing Dependency: konsole-part = [...]
Im Falle eines Red-Hat-Systems mit Gnome kann es ziemlich lange dauern, die Abhängigkeiten einer KDE-Anwendung zum ersten Mal aufzulösen, und wenn das erledigt ist, wird yum das einzige Paket präsentieren, nach dem wir gefragt haben, mit einer netten kleinen Größe . Gefolgt von mehr als hundert installierten Paketen für Abhängigkeiten:
[...]
--> Running transaction check
---> Package boost-system.x86_64 0:1.53.0-27.el7 will be installed
---> Package boost-thread.x86_64 0:1.53.0-27.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==============================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================
Installing:
konsole x86_64 4.10.5-4.el7 rhel-7-server-rpms 78 k
Installing for dependencies:
OpenEXR-libs
[...]
Und in der Zusammenfassung können wir sehen, dass die Installation am Ende viel mehr Speicherplatz auf der Festplatte benötigt als die Größe des Pakets, das wir benötigen:
[...]
Transaction Summary
==============================================================================================================================
Install 1 Package (+120 Dependent packages)
Total download size: 108 M
Installed size: 307 M
Das ist viel, aber wir haben nützliche Informationen darüber, wie viel Speicherplatz verwendet wird. Dies ist besonders nützlich, wenn wir viele Pakete in einer Transaktion installieren.
Während in diesem Fall die Transaktion verschwenderisch ist, besteht das Ziel von Abhängigkeiten letztendlich darin, Ressourcen zu sparen:Wenn jemand eine Funktionalität in seinen Code implementiert, die auf dem System aufgerufen werden kann, muss der nächste Entwickler möglicherweise nicht dieselbe Funktionalität implementieren wieder, aber verwenden Sie die bereits vorhandene Implementierung. Für die konzole
Beispiel, wenn Sie akregator
installieren möchten Beim nächsten Mal hat das System bereits viele Abhängigkeiten gelöst, wie kdepim
Paket, das akregator
enthält stützt sich auch auf qt
, kdelibs
, und so weiter.
Wir können rpm
verwenden Dienstprogramm, um die Informationen umgekehrt zu erhalten:Lassen Sie uns die installierten Pakete auflisten, die die bash
erfordern Paket:
# rpm -q --whatrequires bash
dracut-033-535.el7.x86_64
initscripts-9.49.41-1.el7.x86_64
autofs-5.0.7-83.el7.x86_64
lvm2-2.02.177-4.el7.x86_64
rsyslog-8.24.0-16.el7.x86_64
Nicht benötigte Pakete bereinigen
Wenn wir unsere Systeme auf dem neuesten Stand halten und ihre Rollen ändern oder erweitern, werden unweigerlich „Müll“-Pakete angezeigt. Im Sinne von Paketen bedeutet Junk nicht mehr benötigte und/oder veraltete Pakete. Um dem obigen Beispiel zu folgen, brauchen wir akregator
nicht mehr , da wir den „Dienst“ der RSS-Verarbeitung auf einen hypothetischen zentralen RSS-Konzentrator innerhalb unseres Systems verschoben haben. Nachdem wir unsere Feeds an den zentralen Ort migriert haben, deinstallieren wir die lokale RSS-Verarbeitungsanwendung. Dadurch werden nicht alle KDE-Pakete entfernt, da viele andere Pakete von ihnen abhängen können. Aber wenn nicht, sind diese Pakete Junk und verbrauchen Ressourcen, einschließlich längerer Aktualisierungszeiten, als yum
standardmäßig wird alles blind aktualisiert, wofür es neue Pakete/Errata findet.
Es scheint kein Problem zu sein, Ressourcen für das Upgrade einiger nicht benötigter Pakete auf einem Laptop mit Breitbandverbindung und SSD aufzuwenden, aber stellen Sie sich ein Rechenzentrum mit Hunderten oder Tausenden von Computern vor, und Sie erhalten ein Bild. Es ist im Allgemeinen eine gute Idee, alle Systeme einfach zu halten, und die Ressourcenverwaltung ist nur ein Punkt. Je komplexer ein System ist, desto fehleranfälliger ist es. Mehr Komponenten bedeuten mehr mögliche Fehler.
Um einen Überblick über nicht benötigte Pakete zu erhalten, die auf dem System installiert sind, können wir yum und package-cleanup auf die gleiche Weise wie unter CentOS oder eine andere Funktion von yum, autoremove
, verwenden :
yum autoremove
Die Pakete, die diese Tools als nicht benötigt markieren, sind nicht identisch.
Wenn Sie eines dieser Tools verwenden, sollten Sie überprüfen, was yum
ist entfernen wird, und testen Sie möglicherweise, was die Reinigung auf Testmaschinen mit identischem Paketinhalt bewirkt, bevor Sie die Produktionssysteme bereinigen.
Diese Tools sind in der Tat clever, aber nicht allwissend:Beispielsweise wird es in der RPM-Datenbank keinen Eintrag über eine benutzerdefinierte PHP-Anwendung geben, die auf einem Webserver läuft, der cups
aufruft eingehende Bestellungen auf einem mit dem Server verbundenen Drucker auszudrucken. Das heißt, es kann ein Eintrag sein, wenn die Anwendung mit den richtigen Abhängigkeiten gepackt und korrekt mit rpm
installiert wurde oder yum
– aber das erfordert Mühe, und alle Dienste müssen auf die gleiche Weise verpackt werden, wenn Sie sich mit yum-basierten automatischen Bereinigungen sicher fühlen möchten.
Abhängigkeitsprobleme lösen
Besonders in großen Umgebungen kann es beim Installieren oder Aktualisieren von Systemen zu Abhängigkeitsproblemen kommen.
Der folgende Screenshot zeigt ein einfaches Problem:
Abhängigkeiten mit rpm lösen
Im obigen Terminalbildschirm versuchen wir, den nrpe
zu installieren Paket musste der Client viele Aspekte des Systems mit Nagios überwachen. Wir haben den Client für die Verteilung heruntergeladen, aber beide rpm
und yum
schlägt mit demselben Fehler fehl:nrpe
Paket erfordert (hängt ab) von nagios-common
Paket. In diesem Beispiel können wir das benötigte Paket aus derselben Quelle beziehen, und wenn wir beide installieren, den rpm
Das Dienstprogramm sieht, dass die Abhängigkeit, bei der wir zuvor gescheitert sind, am Ende der Transaktion erfüllt sein wird, und installiert beide Pakete, wobei es erfolgreich automatisch beendet wird.
Schlussfolgerung
Yum und RPM sind wichtige Tools, wenn Sie mit Distributionen arbeiten, die den RPM-Paketmanager verwenden. Wenn Sie das Toolset kennen, ist es viel einfacher und normalerweise sicherer, Installations-, Upgrade- und Änderungsaufgaben in der Softwareumgebung eines bestimmten Systems zu lösen.