Inhaltsverzeichnis
Beschreibung: Prüfungskandidaten sollten in der Lage sein, Paketmanagement auf Linuxdistributionen, die RPM-Pakete werden unter Linux für die Paketverwaltung verwenden, durchzuführen. Dieses Lernziel beinhaltet die (Neu-)Installation, das Update und das Entfernen von Paketen sowie das Abfragen von Status- und Versionsinformationen. Ebenfalls enthalten ist das Abfragen von Paketinformationen wie Abhängigkeiten, Integrität und Signaturen. Kandidaten sollten auch in der Lage sein, zu bestimmen, welche Dateien von einem Paket zur Verfügung gestellt werden, und das Paket zu finden, dem eine bestimmte Datei entstammt.
Die wichtigsten Dateien, Bezeichnungen und Anwendungen:
- /etc/rpmrc
- /usr/lib/rpm/*
- rpm
- grep
Die meisten heutigen Linux-Distributionen haben das Paketformat von RedHat übernommen, weil es eine sehr weitreichende Verwaltung der installierten Software ermöglicht. Dazu zählen unter anderem die korrekte Installation und Deinstallation, die Informationen über installierte Programme und die Verifikation, daß bestimmte Pakete tatsächlich das enthalten, was sie vorgeben. Die gesamte Verwaltung der Red-Hat Pakete wird durch ein Programm realisiert, das den Namen rpm trägt. Auch Nicht-RedHat Distributionen unterstützen dieses Programm.
Das Prinzip der RPM-Verwaltung
Jedes RedHat Paket hat einen Dateinamen, der auf .rpm endet. Die Dateinamensstruktur ähnelt der von Debian:
Programmname–Versionsnummer.Architektur.deb
Wobei Programmname der Name des Programmes (oder des Paketes) ist, unter dem es später dann auch angesprochen werden kann, Versionsnummer ist die Version des Programms (oder Paketes) und Architektur bezeichnet die Hardwarearchitektur, für die dieses Paket gedacht ist, also etwa i386 für die PC-Architektur.
Jedes RPM-Paket enthält neben den zu installierenden Dateien wie Debian-Pakete vier Scripts, die jeweils vor und nach der Installation und Deinstallation ausgeführt werden. Zusätzlich existieren Informationen über das Paket und die Abhängigkeiten, die die darin enthaltenen Programme besitzen.
Im Verzeichnis /usr/lib/rpm liegen die verschiedenen Hilfsmittel, die das rpm-Programm benötigt und unter /var/lib/rpm finden sich die verschiedenen Datenbanken über die installierten Pakete. Im Gegensatz zu Debian werden diese Datenbanken in einem proprietären Format abgespeichert, das nur mit dem rpm-Programm zugänglich ist.
Installieren und deinstallieren von Paketen
Eine der Hauptaufgaben des rpm-Programmes ist das Installieren und Deinstallieren von Paketen. Dazu dienen die folgenden Befehle.
Installieren eines Paketes
Um eine bestehende .rpm-Datei zu installieren, wird folgender Befehl verwendet:
rpm -i | --install [Optionen] Paketdatei
das -i | –install bedeutet, daß entweder ein -i oder ein –install angegeben wird. Mögliche Optionen sind:
--nodeps Die Überprüfung von Abhängigkeiten wird abgeschalten. --noscripts Es werden keine pre- oder postinstall Scripts abgearbeitet. --test Die Installation wird nur simuliert, keine Dateien werden installiert. --excludedocs Die im Paket enthaltenen Dokumentationen werden nicht mitinstalliert. --replacepkgs Die Installation wird durchgeführt, auch wenn schon Teile installiert sind. --replacefiles Die Installation wird auch durchgeführt, auch wenn dabei Dateien überschrieben werden, die von anderen Paketen stammen. --oldpackage Erlaubt ein Upgrade von älteren Versionen als die bereits installierten. --force Entspricht der Kombination von --replacepkgs --replacefiles --oldpackage.
Vorsicht ist geboten, wenn die Überprüfung der Abhängigkeiten abgeschalten wird, oder das zwingende Installieren von Paketen aktiviert wird. Das kann zu Inkonsistenzen des Systems führen und sollte nur verwendet werden, wenn man genau weiß, was man tut.
Deinstallieren eines Paketes
Ein Paket wird mit folgendem Befehl deinstalliert:
rpm -e | --uninstall [Optionen] Paketname
Auch für die Deinstallation gibt es einige Wichtige Optionen:
--nodeps Die Überprüfung von Abhängigkeiten wird abgeschalten. --noscripts Es werden keine pre- oder postuninstall Scripts abgearbeitet. --test Die Deinstallation wird nur simuliert, keine Dateien werden gelöscht. --allmatches Deinstalliert alle Pakete, auf die das Namensmuster zutrifft. In diesem Fall ist Paketname also ein Muster und nicht ein Paketnamen.
Upgrade eines Paketes
Wenn eine neue Version eines bereits installierten Programmes aufgespielt werden soll, so kommen zwei verschiedene Techniken zum Einsatz:
rpm -U|--upgrade [Optionen] Paketdatei
Als Optionen kommen exakt die selben Optionen wie beim Installieren zum Einsatz. Der Befehl entspricht im Übrigen genau dem, der zum Installieren benutzt wird, nur daß eventuell vorher existierende Versionen des Paketes vor der Installation entfernt werden.
rpm -F|--freshen [Optionen] Paketdatei
Dieser Befehl, der auch wieder die selben Optionen wie beim Installieren kennt, installiert die angegebene Paketdatei nur, wenn eine ältere Version des selben Programms vorher schon installiert war. Dann verhält er sich wie der vorige (-U)
Abfage von Paketinformationen
Die generelle Form, wie Paketinformationen abgefragt werden, beginnt immer mit einem -q oder –query. Dem folgen bestimmte andere Befehle, die dann die eigentliche Abfrage stellen.
Wenn ein normaler Querry-Befehl angegeben wird, so bezieht er sich auf schon installierte Pakete. rpm durchsucht also nicht eine bestimmte Paketdatei, sondern die Datenbanken, in denen die Informationen über installierte Pakete liegen. Soll aber Information über eine Paketdatei erfragt werden, die noch nicht installiert ist, so muß die Option -p angegeben werden. Statt der Angabe eines Paketnamens ist dann die Angabe einer Paketdatei notwendig.
Abfrage von Versionsinformationen
Um die Versionsnummer eines installierten Paketes abzufragen wird einer der folgende Befehle benutzt:
rpm -qi Paketname rpm --query --info Paketname
Soll stattdessen die Versionsinformation eines nicht installierten RPM-Paketes erfragt werden (was eigentlich unnötig ist, da diese Information im Dateinamen schon vorliegt) kommt einer der folgenden Befehle zum Einsatz
rpm -qi -p Paketdatei rpm --query --info --package Paketdatei
Natürlich können die langen und kurzen Optionen auch durcheinander benutzt werden wie –query -i oder -q –info.
Neben der reinen Versionsinformation werden auch noch andere Paketinformationen ausgegeben. Wenn tatsächlich nur die Information über die Version abgefragt werden soll, kann auch der eingebaute Variablensubstitutionsmechanismus benutzt werden:
rpm -q Paketname --queryformat "%{VERSION}\n"
Auf diese Art und Weise können beliebige Informationen in einem beliebigen Format ausgegeben werden. Eine komplette Liste aller so benutzbaren Variablensubstitutionen ist mit dem Befehl
rpm --querytags
einsehbar. In der gegenwärtigen Version sind es 98 verschiedene Typen wie etwa NAME, VERSION, RELEASE, DESCRIPTION, SIZE, VENDOR, FILENAMES, …
Auflisten aller Dateien eines Paketes
Oft soll überprüft werden, welche Dateien ein bestimmtes Paket geliefert hat. Mit dem Befehl
rpm -ql Paketname
wird eine Liste aller Dateien des angegebenen Paketes ausgegeben. Statt -l kann auch –list verwendet werden. Soll stattdessen wieder eine noch nicht installierte Paketdatei untersucht werden, so gilt wieder der Parameter -p
rpm -ql -p Paketdatei
Die Ausgabe erfolgt auf die Standard-Ausgabe, kann also problemlos mit Tools wie grep weiterverarbeitet werden.
Auflisten der Dokumentationsdateien eines Paketes
Um nur die Dateien eines Paketes aufzulisten, die reine Dokumentationsdateien (Handbuchseiten, READMEs, …) sind, existiert der Befehl
rpm -qd Paketname
oder wieder mit langen Optionen –docfiles statt dem d. Auch dieser Befehl ist mit -p auf eine Paketdatei anwendbar.
Auflisten der Konfigurationsdateien eines Paketes
Analog zur Ausgabe der Dokumentationsdateien gibt es eine Möglichkeit nur die Konfigurationsdateien auszugeben:
rpm -qc Paketname
oder wieder mit langen Optionen –configfiles statt dem c. Auch dieser Befehl ist mit -p auf eine Paketdatei anwendbar.
Auflisten der Scriptdateien eines Paketes
Manchmal ist es auch interessant, herauszufinden, was die Installatiopsscripts eines Paketes eigentlich tun. Hierfür gibt es den Befehl
rpm -q --scripts Paketname
Er listet hintereinander alle vier Scripts auf die Standard-Ausgabe, sollte also entweder in eine Datei umgeleitet oder an less weitergepiped werden.
Gerade dieser Befehl ist natürlich wichtig für noch nicht installierte Paketdateien, um vorher sicherzustellen, daß das Script nichts unerwünschtes macht. Also steht uns auch hier wieder die Option -p zur Verfügung.
Abfragen über installierte Pakete
Die nächsten zwei Befehle beziehen sich nur auf bereits installierte Pakete, sind aber auch Query-Formen des rpm Programms.
Auflisten aller installierten Pakete
Wenn einmal nicht klar ist, welche Pakete bereits installiert sind, so kann rpm auch eine Liste aller installierten Pakete ausgeben. Das geschieht mit dem Befehl
rpm -qa
oder
rpm -q --all
rpm verwaltet auch bestimmte Gruppen, so daß auch Abfragen möglich sind, die alle installierten Pakete einer Gruppe ausgeben:
rpm -qg Gruppe
oder
rpm -q --group Gruppe
Diese Ausgaben können natürlich sehr umfangreich sein, können aber wiederum z.B. mit grep durchsucht werden. Wenn z.B. erforscht werden soll, welche Pakete installiert sind, die etwas mit dem Editor joe zu tun haben, können wir einfach schreiben
rpm -qa | grep joe
Die Ausgabe wäre dann z.B.:
joe-2.8-154
Daraus können wir jetzt weitere Informationen gewinnen, mit einem der oben genannten Abfragemöglichkeiten.
Aus welchem Paket stammt eine bestimmte Datei?
Oft ist einfach die Frage, aus welchem Paket eine bestimmte Datei stammt. Auch diese Frage lässt sich mit rpm lösen.
rpm -qf Dateiname
oder
rpm -q --file Dateiname
rpm durchsucht jetzt seine Datenbanken nach diesem Dateinamen und gibt uns das Paket zurück, aus dem diese Datei stammt.
Abhängigkeiten
Oft benötigen bestimmte Pakete andere Pakete, um zu funktionieren. Diese Abhängigkeiten sind auch mit rpm herausfindbar.
Welche installierten Pakete benützt ein bestimmtes Paket?
Wenn ein Paket entfernt werden soll oder eine Datei gelöscht werden soll, dann stellt sich die Frage, ob das Paket bzw. die Datei nicht noch von einem anderen Paket benötigt werden würde. Mit dem Befehl
rpm -q --whatrequires Funktion
oder
rpm -q --whatrequires Datei
kann herausgefunden werden, welches installierte Paket das angegebene Paket oder die angegebene Datei benötigt.
Welche Pakete werden von einem bestimmten Paket benötigt?
Umgekehrt kann es auch interessant sein, welche Libraries und andere Pakete von einem bestimmten Paket benötigt werden. Mit
rpm -qR Paketname
oder
rpm -q --requires Paketname
wird eine Liste aller Libraries und Pakete ausgegeben, die von dem angegebenen Paket benötigt werden.
Sicherheitsabfragen
Wenn Pakete installiert werden sollen, dann kann es interessant sein, ob diese Pakete wirklich aus der Quelle kommen, aus der sie vorgeben zu kommen. Es wäre ja auch denkbar, daß jemand ein Paket mit einem Trojanischen Pferd einschmuggeln will, und dazu ein echtes Paket mit seinem Paket austauscht. Auf der anderen Seite kann der Inhalt eines Paketes auch durch Übertragungsfehler unbeabsichtigt verfälscht werden. Gegen beide dieser Gefahren kann mit rpm vorgegangen werden.
Verifizierung der Paketintegrität eines Paketes
Eine Paketverifizierung vergleicht die Informationen, über die installierten Dateien eines Paketes mit den Informationen über diese Dateien, die in den Metadaten des Paketes in der Paketdatenbank gespeichert sind. Neben anderen Dingen vergleicht die Verifizierung die Größe, dei MD5-Prüfsumme, Zugriffsrechte, Typ, Eigentümer und Zugriffsrechte jeder Datei. Jede Diskrepanz wird dargestellt.
rpm -V |--verify Paketname
Das Format der Ausgabe ist eine acht Zeichen lange Zeichenkette, ein mögliches „c“ (für Konfigurationsdatei) und der Dateiname. Jedes der acht Zeichen bezeichnet das Ergebnis eines Vergleichs zwischen den Attributen einer Datei und denen, die in der Paketdatenbank gespeichert sind. Ein einfacher Punkt (.) bedeutet, daß der Test durchgelaufen ist, während ein Fragezeichen (?) anzeigt, daß der Test nicht durchgeführt werden konnte (z.B. weil Zugriffsrechte zum Lesen gefehlt hatten). In jedem anderen Fall repräsentieren die Buchstaben Fehler des jeweiligen Verifizierungstests:
S (Size) Die Dateigröße stimmt nicht M (Mode) Der Zugriffsmodus stimmt nicht 5 Die MD5 Prüfsumme stimmt nicht D Die Major/Minor Numer der Gerätedatei stimmt nicht L ReadLink(2) Systemaufruffehler U Eigentümer stimmt nicht G Gruppenzugehörigkeit stimmt nicht T Die Zeitmarke der mtime stimmt nicht
Abfrage der PGP/GPG Signatur eines Paketes
Abschließend bietet rpm noch die Möglichkeit, daß ein Paket von seinem Autor mit einer PGP oder GPG Signatur (einer Art elektronischer Unterschrift) versehen wird. Diese Signatur kann mit folgendem Befehl überprüft werden:
rpm --checksig Paketdatei
Damit diese Überprüfung funktioniert muß eine korrekte Installation von PGP oder GPG vorliegen und die Konfiguration von rpm muß dies berücksichtigen. Die Darstellung dieser Technik würde den Rahmen dieser Dokumentation sprengen.