Pfad: http://www.cs.tu-berlin.de/~ccorn/software/rpm/build-rpm.de.html [] [de] [en]

RPMs selber bauen

Wer mit dem make-basierten Weg, Programmpakete in Unix-System zu installieren, vertraut ist, soll hier dazu angeregt werden, einen Schritt weiter zu gehen und RedHat's Package Manager (RPM) zu verwenden.

Inhalt

  1. Über RPM
  2. Vorbereitung auf das Bauen mit RPM
  3. RPM-Anwendungsbeispiele
  4. Empfehlungen

Über RPM

RPM ist grundlegender Bestandteil von RedHat Linux, SuSE Linux und anderen Linux-Distributionen. RPM ist nicht der einzige verfügbare Paket-Manager, aber wer eine RPM-basierte Linux-Distribution besitzt, sollte lernen, ihn zu benutzen, insbesondere wenn er/sie Programmpakete ansonsten geradewegs von make bauen und installieren lässt. Einen Paket-Manager zu benutzen, erleichtert das De-Installieren und Aktualisieren von Programmpaketen, und ein Paket-Manager bietet darüberhinaus weitere nützliche Möglichkeiten, beispielsweise zur Ermittlung der Paketzugehörigkeit jeder installierten Datei und zur Erkennung von Änderungen an installierten Paketen.

Das hier ist kein einschlägiges RPM-Tutorium; wer RPM installiert hat, verfügt auch über einführende Dokumentation, z.B. das RPM-HOWTO und die Handbuchseite rpm(1). Auch ein Blick in Ed Baileys Buch Maximum RPM lohnt sich, es ist bei RedHat erhältlich.

Einige erklärende Worte seien dennoch voran gestellt. Normalerweise baut und testet man ein Programmpaket so, wie in dessen Installationsanweisungen beschrieben ist, findet möglicherweise einige Fehler und bringt vereinzelt Änderungen an. Dann simuliert man eine Installation, üblicherweise durch das Umdefinieren von Variablen wie prefix oder DESTDIR in der Kommandozeile von make install, so dass beispielsweise Dateien, die für den /usr-Baum bestimmt sind, nach, sagen wir, /var/tmp/foo-root/usr gelangen. In diesem Beispiel ist /var/tmp/foo-root die von RPM so genannte Buildroot für das Paket foo. Daraufhin inspiziert man den Dateibaum unter der Buildroot, um heraus zu finden, welche Dateien installiert werden. Schließlich legt man all diese Informationen, einschließlich der verwendeten Patch-, Bau- und Installationskommandos und der ermittelten Dateiliste, zusammen mit einigen Eckdaten über das Paket in einer so genannten Spec-Datei ab.

Anhand dieser Spec-Datei kann RPM nun die gesamte Folge vom Auspacken der Paketquellen und Anbringen der Patches über den Bauvorgang bis zur (simulierten) Installation nachvollziehen. RPM sammelt die zu installierenden Dateien ein und bildet daraus ein oder mehrere Binär-Pakete. Weil dabei keine Systemverzeichnisse berührt werden, sind dazu keine zusätzlichen Berechtigungen erforderlich. Die eigentliche Installation der Binärpakete kann mit einem anderen RPM-Kommando erfolgen, welches dann Root-Privilegien voraussetzt. RPM speichert Daten über alle installierten Pakete und ihre Dateien in einer Datenbank und benutzt diese Informationen bei Verwaltungsaufgaben wie Untersuchung auf nachträgliche Änderungen, Paket-Aktualisierung oder De-Installation.

RPM kann außerdem ein so genanntes Quell-RPM-Paket erzeugen, welches alle Dateien enthält, aus denen das (die) Binär-RPM-Paket(e) gemacht worden sind, also das ursprüngliche Quellarchiv, Patch-Dateien und die Spec-Datei. Somit ist alles, was man für eine Wiederholung des Bauvorgangs benötigt, kompakt zusammengefasst.

Aus dem Gesagten dürfte deutlich geworden sein, dass alles, was man braucht, um irgendein foo.tar.gz von RPM bauen zu lassen, eine Spec-Datei und zuweilen Patch-Dateien sind. Einige entgegenkommende Entwickler fügen ihren herausgegebenen Quellarchiven selber Spec-Dateien hinzu, und RPM kann solche Quellarchive direkt verwenden.

Vorbereitung auf das Bauen mit RPM

Die folgenden Hinweise gehen davon aus, dass ein System mit installiertem RPM zur Verfügung steht, was bei RPM-basierten Linux-Distributionen natürlich der Fall ist.

RPM-Anwendungsbeispiele

Angenommen, das Paket foo soll aus Quellen von foo-1.0.tar.gz mittels RPM gebaut werden. Es sei eine Spec-Datei und unter Umständen auch einige Patch-Dateien für foo-1.0 vorhanden.

  1. Das Quellarchiv und die Patch-Dateien sind in dasjenige Verzeichnis zu verschieben, wo RPM die Quellen vorzufinden erwartet, z.B. in /usr/src/packages/SOURCES/. In der Regel wird man die Spec-Datei im dazugehörigen SPECS-Verzeichnis halten.

  2. Nun ist das Kommando rpm -ba foo.spec auszuführen, wobei foo.spec der Pfadname der Spec-Datei sein soll. (Gegebenenfalls sind Verzeichniskomponenten einzufügen.) Wenn alles gut geht, baut (-b) RPM nun alle (-a) erzeugbaren RPM-Pakete, d.h., sowohl das Quellpaket als auch ein oder mehrere Binärpakete. Das Quellpaket landet dabei z.B. in /usr/src/packages/SRPMS/, Binärpakete etwa in /usr/src/packages/RPMS/i386/. Die Buildroot für die Pseudo-Installation ist typischerweise ein Unterverzeichnis von /var/tmp/.

    Um die dabei auftretenden Bildschirmausgaben in einer Protokolldatei zu speichern, sollte obiges Kommando verfeinert werden wie folgt:

    rpm -ba foo.spec 2>&1 | tee foo-1.0.log
    

    Die Protokolldatei kann im Fehlerfall nützlich sein und sollte selbstverständlich auf Warnungen oder sonstige Anzeichen seltsamer Vorgänge untersucht werden.

  3. Das oder die erhaltenen Binärpakete können, sobald man über root-Rechte verfügt, mit folgendem exemplarischen Kommando (wirklich) installiert werden:

    rpm -Uvh /usr/src/packages/RPMS/i386/foo-1.0-1.i386.rpm   # or whatever
    

    Damit ist das Paket foo ordentlich ins System integriert. (Anmerkung: -U bedeutet Upgrade Package, das -vh dient lediglich zur Ausgabe eines Fortschrittsbalkens.)

  4. Sofern man mit der Installation zufrieden ist, kann man nun den beim Bauen entstandenen Dateibaum in /usr/src/packages/BUILD/ entfernen. Das kann entweder direkt geschehen oder mit dem Kommando

    rpm --clean foo.spec
    

    (wobei anzumerken ist, dass die --clean-Option nicht mit dem %clean-Abschnitt in der Spec-Datei zu verwechseln ist, welcher die Pseudo-Installation rückgängig macht. Wenn Binär-RPM-Pakete erfolgreich gebaut werden, kommen die %clean-Kommandos automatisch zur Ausführung, aber der Dateibaum, in welchem gebaut worden ist, bleibt erhalten, wenn nicht die Option --clean gegeben wird.)

  5. Auf ähnliche Weise kann man nun das Quellarchiv und die Patch-Dateien aus /usr/src/packages/SOURCES/ löschen, da man stattdessen ein Quell-RPM-Paket hat. (Hat man?) RPM erledigt das von sich aus, wenn man das folgende Kommando gibt:

    rpm --rmsource foo.spec
    

    Zu beachten ist, dass die Spec-Datei damit nicht gelöscht wird, obwohl sie ebenfalls im Quell-RPM zu finden ist. Die Spec-Datei kann manuell oder mit der Option --rmspec gelöscht werden.

  6. Ebenfalls bemerkenswert ist, dass die Optionen --clean und --rmsource ebenso gut dem Baukommando rpm -b hinzugefügt werden können. D.h., man kann RPM-Pakete bauen und anschließend aufräumen lassen, indem man ein einziges Kommando gibt:

    rpm -ba --clean --rmsource foo.spec 2>&1 | tee foo-1.0.log
    
  7. Sollten die Quellen, die Patch-Dateien und/oder die Spec-Datei jemals wieder benötigt werden, kann man das Quell-RPM-Paket auspacken, indem man RPM auffordert, es zu installieren:

    rpm -i /usr/src/packages/SRPMS/foo-1.0-1.src.rpm
    

    Im Gegensatz zur Installation eines Binär-RPMs bedarf die Installation eines Quell-RPMs keiner besonderen Privilegien, solange die SOURCES- und SPECS-Verzeichnisse beschreibbar sind.

  8. In dem speziellen Fall, dass man nur das Quell-RPM-Paket auspacken, von RPM neu bauen lassen und danach aufräumen lassen möchte, genügt folgendes Kommando:

    rpm --rebuild /usr/src/packages/SRPMS/foo-1.0-1.src.rpm 2>&1 | tee foo-1.0.log
    

Empfehlungen