2.3. RPM – Der Paket-Manager der Distribution

Bei SUSE LINUX kommt RPM (RPM Package Manager) mit den Hauptprogrammen rpm und rpmbuild als Management für die Softwarepakete zum Einsatz. Damit steht den Benutzern, den Systemadministratoren und nicht zuletzt dem Pakete-Macher die mächtige RPM-Datenbank zur Verfügung, über die jederzeit detaillierte Informationen zur installierten Software abgefragt werden können.

Im Wesentlichen kann rpm in fünf Modi agieren: Softwarepakete installieren bzw. de-installieren oder updaten, die RPM-Datenbank neu erstellen, Anfragen an die RPM-Datenbank bzw. an einzelne RPM-Archive richten, Pakete auf Integrität überprüfen und Pakete signieren. rpmbuild dient dazu, installierbare Pakete aus den unangetasteten Quellen (pristine sources) herzustellen.

Installierbare RPM-Archive sind in einem speziellen binären Format gepackt; die Archive bestehen aus den zu installierenden (Programm-)Dateien und aus verschiedenen Meta-Informationen, die während der Installation von rpm benutzt werden, um das jeweilige Softwarepaket zu konfigurieren, oder die zu Dokumentationszwecken in der RPM-Datenbank abgelegt werden. RPM-Archive haben die Dateinamen-Endung .rpm.

Mit rpm lassen sich LSB-konforme Pakete verwalten; zu LSB vgl. Abschnitt 12.1.1. “Linux Standard Base (LSB)”.

[Tip]Tipp

Bei etlichen Paketen sind die für die Software-Entwicklung notwendigen Komponenten (Bibliotheken, Header- und Include-Dateien etc.) in eigene Pakete ausgelagert. Diese Entwicklungspakete werden nur benötigt, wenn Sie Software selbst übersetzen (kompilieren) wollen – beispielsweise neuere GNOME-Pakete . Solche Pakete sind in der Regel an dem Namenszusatz -devel zu erkennen: alsa-devel, gimp-devel, kdelibs-devel etc.

2.3.1. Prüfen der Authentizität eines Pakets

RPM-Pakete von SUSE LINUX sind mit GnuPG signiert:

   
1024D/9C800ACA 2000-10-19 SuSE Package Signing Key <build@suse.de>
Key fingerprint = 79C1 79B2 E1C8 20C1 890F  9994 A84E DAE8 9C80 0ACA

Mit folgenem Befehl kann man die Signatur eines RPM-Pakets überprüfen und so feststellen, ob es wirklich von SUSE oder einer anderen vertrauenswürdigen Stelle stammt:

rpm --checksig apache-1.3.12.rpm

Insbesondere bei Updatepaketen aus dem Internet ist diese Vorsichtsmaßname zu empfehlen. Unser öffentlicher Paketsignierschlüssel ist standardmäßig in /root/.gnupg/ hinterlegt. Seit Version 8.1 liegt der Schlüssel zusätzlich im Verzeichnis /usr/lib/rpm/gnupg/, damit auch normale Benutzer die Signatur von RPM-Paketen prüfen können.

2.3.2. Pakete verwalten: Installieren, Updaten und Deinstallieren

Im Normalfall ist das Installieren eines RPM-Archivs schnell erledigt:

rpm -i <paket>.rpm

Mit diesem Standardbefehl wird ein Paket aber nur dann installiert, wenn die Abhängigkeiten erfüllt sind und wenn es zu keinen Konflikten kommen kann; rpm fordert per Fehlermeldung die Pakete an, die zum Erfüllen der Abhängigkeiten notwendig sind. Die Datenbank wacht im Hintergrund darüber, dass es zu keinen Konflikten kommt: Eine Datei darf in der Regel nur zu einem Paket gehören. Mit verschiedenen Optionen kann man sich über diese Regel hinwegsetzen. Wer dies tut, der sollte aber genau wissen, was er tut, da er damit eventuell die Updatefähigkeit des Systems aufs Spiel setzt.

Interessant sind auch die Optionen -U bzw. --upgrade und -F bzw. --freshen, um ein Paket zu aktualisieren.

rpm -F <paket>.rpm

Dadurch wird eine ältere Version des gleichen Pakets gelöscht und die neue Version installiert. Der Unterschied zwischen den beiden Versionen liegt darin, dass bei -U auch Pakete installiert werden, die bisher nicht im System verfügbar waren, während die Option -F nur dann ein Paket erneuert, wenn es bereits zuvor installiert war. Gleichzeitig versucht rpm, sorgfältig mit den Konfigurationsdateien umzugehen, wobei – etwas vereinfacht – die folgende Strategie zum Tragen kommt:

  • Falls eine Konfigurationsdatei vom Systemadministrator nicht verändert wurde, wird von rpm die neue Version der entsprechenden Datei installiert. Es sind keine Eingriffe seitens des Administrators notwendig.

  • Falls eine Konfigurationsdatei vom Administrator zu irgendeinem Zeitpunkt vor dem Update geändert wurde, wird rpm die geänderte Datei dann – und nur dann – mit der Erweiterung .rpmorig oder .rpmsave sichern und die neue Version aus dem RPM-Paket installieren, falls sich zwischen ursprünglicher Datei und der Datei aus dem Update-Paket etwas geändert hat. In diesem Fall ist es sehr wahrscheinlich, dass Sie die frisch installierte Konfigurationsdatei anhand der Kopie (.rpmorig oder .rpmsave) auf Ihre Systembedingungen hin abstimmen müssen.

  • .rpmnew-Dateien werden immer dann auftauchen, wenn es die Konfigurationsdatei bereits gibt und wenn in der .spec-Datei die noreplace-Kennung gesetzt wurde.

Im Anschluss an ein Update sollten nach dem Abgleich alle .rpmorig-, .rpmsave- bzw. .rpmnew-Dateien entfernt werden, um bei folgenden Updates nicht zu stören. Die Erweiterung .rpmorig wird gewählt, wenn die Datei der RPM-Datenbank noch nicht bekannt war, sonst kommt .rpmsave zum Zuge; mit anderen Worten: .rpmorig entsteht beim Update von Fremdformat auf RPM und .rpmsave beim Update von RPM-alt auf RPM-neu. Bei .rpmnew kann keine Aussage gemacht werden, ob vom Systemadministrator eine Änderung an der Konfigurationsdatei vorgenommen wurde oder ob nicht. Eine Liste dieser Dateien finden Sie unter /var/adm/rpmconfigcheck.

Beachten Sie, dass einige Konfigurationsdateien (zum Beispiel /etc/httpd/httpd.conf) mit Absicht nicht überschrieben werden, um den sofortigen Weiterbetrieb mit den eigenen Einstellungen zu ermöglichen.

Die Option -U ist also mehr als ein Äquivalent für die Abfolge -e (Deinstallieren/Löschen) und -i (Installieren). Wann immer möglich, dann ist der Option -U der Vorzug zu geben.

[Important]Wichtig

Nach jedem Update müssen Sie die von rpm angelegten Sicherungskopien mit der Erweiterung .rpmorig oder .rpmsave kontrollieren, das sind Ihre alten Konfigurationsdateien. Falls erforderlich, übernehmen Sie bitte Ihre Anpassungen aus den Sicherungskopien in die neuen Konfigurationsdateien und löschen Sie dann die alten Dateien mit der Erweiterung .rpmorig bzw. .rpmsave.

YaST mit der Option -i ist in der Lage, alle Paketabhängigkeiten aufzulösen und eine entsprechende Installation durchzuführen:

yast -i <paket>

Wenn ein Paket entfernt werden soll, geht man ähnlich vor:

rpm -e <paket>

rpm wird ein Paket aber nur dann entfernen, wenn keine Abhängigkeiten mehr bestehen. So ist es zum Beispiel theoretisch nicht möglich, Tcl/Tk zu löschen, solange noch irgendein anderes Programm Tcl/Tk benötigt – auch darüber wacht RPM mithilfe der Datenbank. Falls in einem Ausnahmefall eine derartige Lösch-Operation nicht möglich sein sollte, obwohl keine Abhängigkeiten mehr bestehen, kann es hilfreich sein, die RPM-Datenbank mittels der Option --rebuilddb neu aufzubauen; vgl. unten die Anmerkungen zur RPM-Datenbank.

2.3.3. RPM und Patches

Um die Betriebssicherheit eines Systems zu gewährleisten, ist es notwendig, von Zeit zu Zeit Pakete in das System einzuspielen, die es auf einen neuen Stand bringen. Bisher konnte ein Fehler in einem Paket nur dadurch behoben werden, dass man das komplette Paket ersetzt hat. Bei großen Paketen mit kleinen Fehlern können so schnell große Datenmengen zusammen kommen. Seit der Version 8.1 gibt es bei SUSE daher ein neues Feature in RPM, das es ermöglicht, Patches zu Paketen einzuspielen.

Die interessantesten Informationen zu einem Patch-RPM sollen am Beispiel pine aufgezeigt werden:

  • Passt das Patch-RPM zu meinem System?

    Um dies zu prüfen, sollten Sie zunächst die installierte Version des Paketes abfragen. Im Fall von pine geht das mit dem Befehl

    rpm -q pine
    pine-4.44-188
    

    Als Nächstes wird das Patch-RPM untersucht, ob es zu genau dieser Version von pine passt:

    rpm -qp --basedon pine-4.44-224.i586.patch.rpm
    pine = 4.44-188
    pine = 4.44-195
    pine = 4.44-207
    

    Dieser Patch passt zu drei verschiedenen Versionen von pine. Auch die in unserem Fall installierte Version ist dabei enthalten, so dass der Patch eingespielt werden kann.

  • Welche Dateien werden durch den Patch ersetzt?

    Die von einem Patch betroffenen Dateien können leicht aus dem Patch-RPM ausgelesen werden. Der Parameter -P von rpm dient dazu, spezielle patch-relevanten Möglichkeiten auszuwählen. Demnach bekommt man die Liste der Dateien mit

    rpm -qpPl pine-4.44-224.i586.patch.rpm
    /etc/pine.conf
    /etc/pine.conf.fixed
    /usr/bin/pine
    

    oder, wenn der Patch bereits installiert ist, mit

    rpm -qPl pine
    /etc/pine.conf
    /etc/pine.conf.fixed
    /usr/bin/pine
    
  • Wie spielt man ein Patch-RPM in das System ein?

    Patch-RPMs werden wie normale RPMs verwendet. Der einzige Unterschied liegt darin, dass für sie ein passendes RPM bereits eingespielt sein muss.

  • Welche Patches sind im System eingespielt und auf welchen Paketversionen haben sie aufgesetzt?

    Eine Liste aller Patches, die im System eingespielt sind bekommen Sie mit dem Befehl rpm -qPa. Wenn, wie in unserem Beispiel, in einem neuen System erst ein Patch eingespielt ist, sieht das so aus:

    rpm -qPa
    pine-4.44-224
    

    Wenn Sie nach einiger Zeit wissen möchten, welche Paketversion denn zunächst eingespielt war, so ist dies ebenfalls noch in der RPM-Datenbank vorhanden. Sie bekommen diese Information für pine mit dem Kommando:

    rpm -q --basedon pine
    pine = 4.44-188
    

Weitere Informationen, auch zum Patch-Feature von RPM, finden Sie in dem Manualpages von rpm und rpmbuild.

2.3.4. Anfragen stellen

Mit der Option -q query leitet man Anfragen ein. Damit ist es möglich die RPM-Archive selbst zu durchleuchten (Option -p PaketDatei) als auch die RPM-Datenbank zu befragen. Die Art der angezeigten Information kann man mit den zusätzlichen Optionen auswählen; vgl. Tabelle 2.2. “Die wichtigsten Abfrageoptionen (-q [-p] paket)”.

Tabelle 2.2. Die wichtigsten Abfrageoptionen (-q [-p] paket)

-iPaket-Informationen anzeigen
-lDateiliste des Pakets anzeigen
-f DATEI Anfrage nach Paket, das die Datei DATEI besitzt; DATEI muss mit vollem Pfad angegeben werden!
-s Status der Dateien anzeigen (impliziert -l)
-d Nur Dokumentationsdateien auflisten (impliziert -l)
-cNur Konfigurationsdateien auf"|listen (impliziert -l)
--dump Alle überprüfbaren Infos zu jeder Datei anzeigen (mit -l, -c oder -d benutzen!)
--provides Fähigkeiten des Pakets auflisten, die ein anderes Paket mit --requires anfordern kann
--requires, -RPaket-Abhängigkeiten ausgeben
--scriptsDie diversen (De-)Installations-Skripten ausgeben

Der folgende Befehl gibt die Information in Ausgabe 2.2. “rpm -q -i wget” aus:

rpm -q -i wget

Beispiel 2.2. rpm -q -i wget

    
Name        : wget                    Relocations: (not relocateable)
Version     : 1.8.2                   Vendor: SuSE Linux AG, Nuernberg, Germany
Release     : 301                     Build Date: Di 23 Sep 2003 20:26:38 CEST
Install date: Mi 08 Okt 2003 11:46:31 CEST      Build Host: levi.suse.de
Group: Productivity/Networking/Web/Utilities Source RPM: wget-1.8.2-301.src.rpm
Size        : 1333235                          License: GPL
Signature   : DSA/SHA1, Di 23 Sep 2003 22:13:12 CEST, Key ID a84edae89c800aca
Packager    : http://www.suse.de/feedback
URL         : http://wget.sunsite.dk/
Summary     : A tool for mirroring FTP and HTTP servers
Description :
Wget enables you to retrieve WWW documents or FTP files from a server.
This can be done in script files or via the command line.
[...]

Die Option -f führt nur dann zum Ziel, wenn man den kompletten Dateinamen, einschließlich des Pfades, kennt. Sie können beliebig viele zu suchende Dateinamen angeben, zum Beispiel:

rpm -q -f /bin/rpm /usr/bin/wget

führt zu dem Ergebnis:

rpm-3.0.3-3
wget-1.5.3-55

Kennt man nur einen Teil des Dateinamens, so muss man sich mit einem Shell-Skript behelfen (vgl. Datei 2.3. “Paket-Suchskript”); der gesuchte Dateiname ist als Parameter beim Aufruf des Skripts zu übergeben.

Beispiel 2.3. Paket-Suchskript

#! /bin/sh
for i in $(rpm -q -a -l | grep  $1); do
    echo "\"$i\" ist in Paket:"
    rpm -q -f $i
    echo ""
done

Mit dem Befehl kann man sich gezielt die Auflistung der Informationen (Updates, Konfiguration, Änderungen etc.) zu einem bestimmten Paket anzeigen lassen; hier beispielsweise zu dem Paket rpm:

rpm -q --changelog rpm

Es werden allerdings nur die letzten 5 Einträge in der RPM-Datenbank angezeigt; im Paket selbst sind alle Einträge (der letzten 2 Jahre) enthalten. Diese Abfrage funktioniert, wenn CD 1 unter /cdrom eingehangen ist:

rpm -qp --changelog /cdrom/suse/i586/rpm-3*.rpm

Anhand der installierten Datenbank lassen sich auch Überprüfungen durchführen. Eingeleitet werden diese Vorgänge mit der Option -V (gleichbedeutend mit -y oder --verify). Damit veranlasst man rpm, all die Dateien anzuzeigen, die sich im Vergleich zur ursprünglichen Version, wie sie im Paket enthalten war, geändert haben. rpm stellt dem eigentlichen Dateinamen bis zu acht Zeichen voran, die auf folgende Änderungen hinweisen:

Tabelle 2.3. Die Überprüfungen

5MD5-Prüfsumme
SDateigröße
LSymbolischer Link
TModification Time
Dmajor und minor Gerätenummer device number
UBenutzer user
GGruppe group
MModus (einschl. Rechte und Typus)

Bei Konfigurationsdateien wird zusätzlich ein c ausgegeben. Beispiel, falls etwas an /etc/wgetrc aus dem wget geändert wurde:

rpm -V wget
S.5....T c /etc/wgetrc

Die Dateien der RPM-Datenbank liegen unter /var/lib/rpm.

Bei einer /usr-Partition von 1 GB kann die Datenbank durchaus 30 MB Plattenplatz beanspruchen; insbesondere nach einem kompletten Update. Falls die Datenbank über Gebühr groß erscheint, ist es meist hilfreich, mit der Option --rebuilddb eine neue Datenbank auf Basis der existierenden zu erstellen. Es ist sinnvoll, vor einem solchen Rebuild eine Kopie der existierenden Datenbank aufzubewahren.

Weiterhin legt das cron-Skript cron.daily täglich gepackte Kopien der Datenbank unter /var/adm/backup/rpmdb an, deren Anzahl durch die Variable MAX_RPMDB_BACKUPS (Standard: 5) in der /etc/sysconfig/backup vorgegeben wird; es ist mit bis zu 3 MB pro Backup bei einem 1 GB großen /usr Verzeichnis rechnen.

2.3.5. Quellpakete installieren und kompilieren

Alle Quellpakete haben die Erweiterung .src.rpm hinter dem eigentlichen Paketnamen; diese Dateien sind die „Source-RPMs“.

[Tip]Tipp

Diese Pakete können mit YaST – wie jedes andere Paket – installiert werden, allerdings werden Quellpakete nie als installiert ([i]) markiert wie die regulären anderen Pakete. Dies liegt daran, dass die Quellpakete nicht in die RPM-Datenbank aufgenommen werden; in der RPM-Datenbank nämlich erscheint nur installierte Betriebssoftware.

Die Arbeitsverzeichnisse für rpm bzw. rpmbuild unter /usr/src/packages müssen vorhanden sein (falls keine eigenen Einstellungen wie etwa via /etc/rpmrc vorgenommen wurden):

SOURCES

für die originalen Quellen (.tar.gz-Dateien etc.) und für die distributionsspezifischen Anpassungen (.dif-Dateien).

SPECS

für die .spec-Dateien, die in der Art eines Meta-Makefiles den build-Prozess steuern.

BUILD

unterhalb dieses Verzeichnisses werden die Quellen entpackt, gepatcht und kompiliert.

RPMS

hier werden die fertigen Binary-Pakete abgelegt.

SRPMS

und hier die Source-RPMs.

Wenn Sie ein Quellpaket mit YaST installieren, dann werden die für den build-Prozess notwendigen Komponenten unter /usr/src/packages installiert: die Quellen und die Anpassungen unter SOURCES und die dazugehörige .spec-Datei unter SPECS.

[Important]Wichtig

Bitte machen Sie keine RPM-Experimente mit wichtigen System-Komponenten (glibc, rpm, sysvinit etc.), Sie setzen damit die Funktionstüchtigkeit Ihres Systems aufs Spiel.

Im Folgenden wird das Paket wget.src.rpm betrachtet. Nachdem das Quellpaket wget.src.rpm mit YaST installiert wurde, gibt es die Dateien:

/usr/src/packages/SPECS/wget.spec
/usr/src/packages/SOURCES/wget-1.4.5.dif
/usr/src/packages/SOURCES/wget-1.4.5.tar.gz

Mit rpmbuild -b X /usr/src/packages/SPECS/wget.spec wird der Kompiliervorgang angestoßen; dabei kann X für verschiedene Stufen stehen (vgl. die --help-Ausgabe bzw. die RPM-Dokumentation); hier nur eine kurze Erläuterung:

-bp

Quellen im Verzeichnis /usr/src/packages/BUILD präparieren: entpacken und patchen

-bc

wie -bp, jedoch zusätzlich noch kompilieren

-bi

wie -bc, jedoch zusätzlich noch installieren; Achtung, wenn ein Paket nicht das BuildRoot-Feature unterstützt, ist es möglich, dass Sie sich während dieses Installationsvorgangs wichtige Konfigurationsdateien überschreiben!

-bb

wie -bi, jedoch zusätzlich noch das sog. Binary-RPM herstellen; bei Erfolg liegt es in /usr/src/packages/RPMS.

-ba

wie -bb, jedoch zusätzlich noch das sog. Source-RPM herstellen; bei Erfolg liegt es in /usr/src/packages/SRPMS.

--short-circuit

Mit dieser Option lassen sich einzelne Schritte überspringen.

Das erzeugte Binary-RPM ist schließlich mit rpm -i oder besser mit rpm -U zu installieren.

2.3.6. RPM-Pakete mit build erzeugen

Bei vielen Paketen besteht die Gefahr, dass während ihrer Erstellung ungewollt Dateien in das laufende System kopiert werden. Um dies zu vermeiden, können Sie das build verwenden, das eine definierte Umgebung herstellt, in der das Paket gebaut wird. Zum Aufbau dieser chroot-Umgebung muss dem build Skript ein kompletter Paketbaum zur Verfügung stehen. Dieser kann auf Festplatte, über NFS oder auch von DVD bereitgestellt werden. Dem Skript teilt man die entsprechende Stelle mit dem Befehl build --rpms <Pfad> mit. Im Unterschied zu rpm möchte der Befehl build das SPEC-File im gleichen Verzeichnis haben, wie die eigentlichen Quellen. Wenn Sie wie im obigen Beispiel wget neu übersetzen möchten, und die DVD unter /media/dvd in das System eingehängt ist, verwenden Sie als Benutzer root folgende Befehle:

cd /usr/src/packages/SOURCES/
mv ../SPECS/wget.spec .
build --rpms /media/dvd/suse/ wget.spec

Daraufhin wird unter /var/tmp/build-root eine minimale Umgebung aufgebaut, in der das Paket gebaut wird. Die entstandenen Pakete liegen danach in /var/tmp/build-root/usr/src/packages/RPMS

Das build Skript stellt noch einige weitere Optionen zur Verfügung. So kann man eigene RPMs bevorzugt verwenden lassen, die Initialisierung der Build-Umgebung auslassen oder den rpm-Befehl auf eine der bereits beschriebenen Stufen beschränken. Sie erhalten mehr Informationen mit dem Befehl build --help und in der |refman[1]build.

2.3.7. Tools für RPM-Archive und die RPM-Datenbank

Der Midnight Commander (mc) kann den Inhalt eines RPM-Archivs anzeigen bzw. Teile daraus zu kopieren. Er bildet ein solches Archiv als ein virtuelles Dateisystem ab, so dass alle gewohnten Menüpunkte des Midnight Commander – wenn sinnvoll – zur Verfügung stehen: Die Kopfzeilen-""Informationen der Datei HEADER kann man sich mit F3 ansehen; mit den Cursor-Tasten und Enter lässt sich durch die Struktur des Archivs browsen, um bei Bedarf mit F5 Komponenten herauszukopieren. – Übrigens, mittlerweile gibt es auch für den Emacs ein rpm.el, ein Frontend für rpm.

KDE™ enthält das Tool kpackage, bei GNOME™ finden Sie gnorpm.

Mit Alien (alien) ist es möglich, die Paketformate der verschiedenen Distributionen zu konvertieren. So kann man versuchen, alte TGZ-Archive vor dem Installieren nach RPM umzuwandeln, damit während der Installation die RPM-Datenbank mit den Paket-Informationen versorgt wird. Aber Achtung: alien ist ein Perl-Skript und befindet sich nach Angaben der Programm-Autoren noch in einem Alpha-Stadium – wenngleich es bereits eine hohe Versionsnummer erreicht hat.