4.3. RPM – Der Paket-Manager

Bei SUSE LINUX kommt RPM (engl. 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 (engl. 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 A.4, „Standards und Spezifikationen“.

[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.

4.3.1. Prüfen der Authentizität eines Pakets

RPM-Pakete von SUSE LINUX sind mit GnuPG signiert. Der Schlüssel einschließlich Fingerprint ist:

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 folgendem 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ßnahme zu empfehlen. Unser öffentlicher Paketsignierschlüssel ist standardmäßig in /root/.gnupg/ hinterlegt. Der Schlüssel liegt zusätzlich im Verzeichnis /usr/lib/rpm/gnupg/, damit auch normale Benutzer die Signatur von RPM-Paketen prüfen können.

4.3.2. Pakete verwalten: Installieren, Updaten und Deinstallieren

Im Normalfall benötigt man für das Installieren eines RPM-Archivs lediglich den Befehl 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. Der Befehl rpm -F paket.rpm beispielsweise löscht eine ältere Version des gleichen Pakets gelöscht und installiert die neue Version. 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.

Um ein Paket zu entfernen, geben Sie rpm -e paket ein. 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.

4.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 Fehlern in kleinen Dateien können so schnell große Datenmengen zusammen kommen. Seit der Version 8.1 gibt es bei SUSE LINUX daher ein 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.

4.3.4. Delta-RPM-Pakete

Delta-RPM-Pakete enthalten den Unterschied (d. h. „Delta“) zwischen der alten und der neuen Version eines RPM-Pakets. Die Anwendung eines Delta-RPM-Pakets auf ein altes RPM-Paket bewirkt ein vollständig neues RPM-Paket. Sie benötigen jedoch das alte RPM-Paket nicht unbedingt, da ein Delta-RPM-Paket auch mit dem installierten RPM funktioniert. deltarpm-Pakete sind sogar kleiner als Patch-RPMs, was ein Vorteil ist, wenn aktualisierte Pakete über das Internet übertragen werden müssen. Der Nachteil von Aktualisierungen mit Delta-RPMs ist, dass sie wesentlich mehr CPU-Zyklen beanspruchen als einfache RPMs oder Patch-RPMs. Wenn Sie möchten, dass YaST bei Aktualisierungen mit YOU Delta-RPM-Pakete benutzt, setzen Sie in /etc/sysconfig/onlineupdate die Variable YOU_USE_DELTAS auf „yes“.

Die Binaries prepdeltarpm, writedeltarpm und applydeltarpm sind Teil der deltarpm-Suite und helfen Ihnen bei der Erstellung und Anwendung von Delta-RPM-Paketen. Benutzen Sie die folgenden Befehle, um ein Delta-RPM-Paket namens new.delta.rpm zu erstellen (dies erfordert, dass old.rpm und new.rpm vorhanden sind):

prepdeltarpm -s seq -i info old.rpm > old.cpio
prepdeltarpm -f new.rpm > new.cpio

xdelta delta -0 old.cpio new.cpio delta

writedeltarpm new.rpm delta info new.delta.rpm
rm old.cpio new.cpio delta

Das neue RPM-Paket kann mit applydeltarpm erstellt werden. Dies kann vom Dateisystem geschehen, falls die alte Packung bereits installiert ist:

applydeltarpm new.delta.rpm new.rpm

Alternativ können die Daten mit der Option -r dem alten RPM-Paket entnommen werden, ohne auf das Dateisystem zuzugreifen:

applydeltarpm -r old.rpm new.delta.rpm new.rpm

Siehe file:///usr/share/doc/packages/deltarpm/README zu zu technischen Einzelheiten.

4.3.5. Anfragen stellen

Mit der Option -q (engl. 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 4.8, „Die wichtigsten Abfrageoptionen“.

Tabelle 4.8. Die wichtigsten Abfrageoptionen

-i

Paketinformationen anzeigen

-l

Dateiliste 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)

-c

Nur 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, -R

Paket-Abhängigkeiten ausgeben

--scripts

Die diversen (De-)Installations-Skripten ausgeben

Der Befehl rpm -q -i wget beispielsweise zeigt die in Beispiel 4.2, „rpm -q -i wget“ gezeigte Information an.

Beispiel 4.2. rpm -q -i wget

Name        : wget                         Relocations: (not relocatable)
Version     : 1.9.1                             Vendor: SUSE LINUX AG, Nuernberg, Germany
Release     : 50                            Build Date: Sat 02 Oct 2004 03:49:13 AM CEST
Install date: Mon 11 Oct 2004 10:24:56 AM CEST      Build Host: f53.suse.de
Group       : Productivity/Networking/Web/Utilities   Source RPM: wget-1.9.1-50.src.rpm
Size        : 1637514                          License: GPL
Signature   : DSA/SHA1, Sat 02 Oct 2004 03:59:56 AM 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-4.1.1-191
wget-1.9.1-50

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

Beispiel 4.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 /media/cdrom/suse/i586/rpm-4*.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 4.9. Die Überprüfungen

5

MD5-Prüfsumme

S

Dateigröße

L

Symbolischer Link

T

Änderungszeit

D

major und minor Gerätenummer (engl. device number)

U

Benutzer (engl. user)

G

Gruppe (engl. group)

M

Modus (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.

4.3.6. 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.bz2- oder .tar.gz-Dateien usw.) und für die distributionsspezifischen Anpassungen (meistens .diff- oder .patch-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, sollten Sie Dateien wie die folgenden vorfinden:

/usr/src/packages/SOURCES/nops_doc.diff
/usr/src/packages/SOURCES/toplev_destdir.diff
/usr/src/packages/SOURCES/wget-1.9.1+ipvmisc.patch
/usr/src/packages/SOURCES/wget-1.9.1-brokentime.patch
/usr/src/packages/SOURCES/wget-1.9.1-passive_ftp.diff
/usr/src/packages/SOURCES/wget-LFS-20040909.tar.bz2
/usr/src/packages/SOURCES/wget-wrong_charset.patch
/usr/src/packages/SPECS/wget.spec

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.

4.3.7. 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 Verzeichnis 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 Manualpage von build.

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

Der Midnight Commander (mc) kann den Inhalt eines RPM-Archivs anzeigen bzw. Teile daraus kopieren. Er bildet ein solches Archiv als ein virtuelles Dateisystem ab, sodass alle gewohnten Menüpunkte des Midnight Commander – wenn sinnvoll – zur Verfügung stehen. Die Informationen in den Kopfzeilen 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.

KDE enthält das Tool kpackage als Frontend für rpm. Ein vollständiger Paketmanager ist als YaST-Modul verfügbar (vgl. Abschnitt 2.2.1, „Software installieren oder löschen“).


SUSE LINUX Administrationshandbuch 9.3