# 1.102.6

# Verwendung des Red Hat Package Managers (RPM)

Beschreibung: Prüfungskandidaten sollten in der Lage sein, Paketmanagement auf Linuxdistributionen, die RPM-Pakete 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.`rpm`

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 Paket

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.