Linux RPM HOWTO Donnie Barnes (djb@redhat.com) und Tilo Wenzel v2.0.1-2, 25. September 1997 In diesem HOWTO wird beschrieben, wie man den Red Hat Packagemanager rpm anwendet und eigene Pakete erstellt. 1. Copyright 1.1. Copyright der englischen Version Dieses Dokument und sein Inhalt sind durch Copyright geschützt. Die Weiterverbreitung dieses Dokuments ist so lange gestattet, wie der Inhalt vollständig und unverändert bleibt. Das heißt, es ist nur ein Neuformatieren, Neuausdrucken oder Weiterverteilen erlaubt. Da die deutsche Version ein von der englischen Version abgeleitetes Werk ist, unterliegt sie demselben Copyright. 1.2. Bemerkungen zur deutschen Übersetzung Dieses Dokument ist die deutsche Übersetzung des englischen Originals von Donnie Barnes. In der deutschen Übersetzung wurden mit Zustimmung des Autors des Originals ein paar Korrekturen und Änderungen vom Übersetzer Tilo Wenzel vorgenommen, die das Eine oder Andere hoffentlich etwas klarer machen. 2. Einführung RPM ist der Red Hat Package Manager. Obwohl der Name die Bezeichnung Red Hat enthält, ist er dennoch als ein vollständig offenes System angelegt, welches jeder benutzen kann. Es gibt dem Benutzer die Möglichkeit, aus dem Quellcode für eine neue Software Pakete mit Quell- und Binärcode zu erstellen, mit denen es möglich ist, Binaries einfach zu installieren und zu verwalten sowie Quellcode einfach zu übersetzen. Er besitzt auch eine eigene Datenbank mit Informationen über alle Pakete und deren zugehörige Dateien, die zum Testen von Paketen und zum Abfragen von Informationen bezüglich Dateien und/oder Paketen benutzt werden kann. Red Hat Software erlaubt es anderen Herstellern von Distributionen ausdrücklich, den Paketmanager auszutesten und ihn für den Aufbau der eigenen Distributionen einzusetzen. RPM ist sehr flexibel und einfach zu benutzen, obwohl es die Grundlage für ein komplexes und großes System darstellt. Es ist darüber hinaus vollständig offen und für jeden verfügbar, wir würden uns jedoch über Berichte bezüglich Fehler und deren Beseitigung freuen. Die Benutzung und Verbreitung des RPM wird lizenzfrei unter der GPL gewährt. Eine ausführlichere Dokumentation bezüglich des RPM ist mit dem Buch Maximum RPM von Ed Bailey verfügbar. Dieses Buch steht zum Herunterladen oder zum Kauf auf http://www.redhat.com zur Verfügung. 3. Übersicht Zunächst einige Worte über die Philosophie, die hinter dem RPM steht. Eines der Ziele des RPM war die Möglichkeit der Verwendung der ursprünglichen Quellen. Für den RPP (unser altes Paketsystem, aus dem sich kein Teil des RPM herleitet) waren die Quellpakete die gepatchten Quellen, aus denen wir die fertigen Pakete herstellten. Im Prinzip konnte man ein Quell-RPP installieren und es anschließend ohne weitere Probleme mit make übersetzen. Aber die Quellen waren nicht mehr die Originale, und es gab keinen Hinweis darauf, was wir für Änderungen hatten vornehmen müssen, um es zum Laufen zu bringen. Die Originalquellen mußten separat heruntergeladen werden. Mit RPM hat man sowohl die Originalquellen als auch den Patch, von dem kompiliert wurde. Unserer Meinung nach ist das aus verschiedenen Gründen ein großer Vorteil. Wenn z.B. eine neue Version eines Programmes herauskommt, ist es nicht mehr nötig, noch einmal komplett von vorne anzufangen, um es unter RHL (Red Head Linux) zu kompilieren. Man kann sich den Patch anschauen, um zu sehen, was eventuell zu ändern ist. Alle einzukompilierenden Defaults usw. sind so einfach herauszufinden. RPM hat ebenfalls einen leistungsfähigen Abfragemechanismus. Man kann die gesamte Paketdatenbank nach bestimmten Paketen oder einzelnen Dateien durchsuchen und so einfach feststellen, zu welchem Paket eine Datei gehört und wo sie herkommt. Die RPM-Dateien selbst sind komprimierte Archive, die einzelnen Pakete können jedoch einfach und schnell nach bestimmten Informationen durchsucht werden, da ein spezieller Header im Binärformat an jedes Paket angefügt wird. Dieser Header ist unkomprimiert und enthält alle wichtigen Informationen. Das ermöglicht das schnelle Durchsuchen von Paketen. Eine andere nützliche Funktion ist die Möglichkeit, Pakete zu überprüfen. Falls man vermutet, daß man ein für ein Paket wichtiges File gelöscht haben könnte, kann man dieses damit einfach kontrollieren. Man wird dann über Probleme mit der gegenwärtigen Konfiguration informiert und kann falls notwendig das Paket neu installieren. Konfigurationsdateien werden, soweit vorhanden, nicht überschrieben. Wir möchten den Leuten von der Bogusdistribution für viele ihrer Ideen und Konzepte danken, die im RPM enthalten sind. Obwohl der RPM vollständig von Red Hat Software geschrieben wurde, basiert er doch auf von BOGUS geschriebenem Code (PM and PMS). 4. Allgemeine Informationen 4.1. Quellen für den RPM Die beste Möglichkeit, den RPM zu installieren, ist natürlich, Red Hat Linux zu installieren. Wenn man das nicht will, kann man sich den RPM separat besorgen. Er ist von ftp.redhat.com zu bekommen. 4.2. Voraussetzungen für den RPM Die Hauptvoraussetzung, um den RPM benutzen zu können, ist cpio 2.4.2 oder größer. Obwohl das System primär für den Einsatz unter Linux gedacht ist, ist es wahrscheinlich auch auf die meisten anderen UNIX- Systeme portierbar. Bisher wurde es schon auf SunOS, Solaris, AIX, Irix, AmigaOS und anderen Systemen übersetzt. Die Binärpakete sind jedoch zwischen den verschiedenen Unixtypen nicht kompatibel! Das sind die minimalen Voraussetzungen für die Installation des RPM. Um den RPM aus den Quellen selbst zu kompilieren, braucht man auch noch die üblichen Dinge, die zum Übersetzen notwendig sind, d.h. gcc, make, usw. 5. Benutzung des RPM Die einfachste Möglichkeit der Anwendung ist die Installation eines Paketes: rpm -i foobar-1.0-1.i386.rpm Ebenso einfach ist die Deinstallation eines Paketes: rpm -e foobar Ein etwas komplizierteres, aber sehr nützliches Kommando erlaubt die Installation von Paketen via FTP. Wenn man eine Verbindung ins Internet hat und ein neues Paket installieren will, muß man die Dateien nur zusätzlich mit einem gültigen URL versehen, etwa so: rpm -i ftp://ftp.pht.com/pub/linux/redhat/rh-2.0-beta/RPMS/foobar-1.0-1.i386.rpm Man beachte, daß der RPM jetzt via FTP arbeitet und installiert. Außer für diese simplen Kommandos kann rpm auch noch für viele andere Aufgaben eingesetzt werden, wie dies die Usage Message andeutet: RPM version 2.3.9 Copyright (C) 1997 - Red Hat Software This may be freely redistributed under the terms of the GNU Public License usage: rpm {--help} rpm {--version} rpm {--initdb} [--dbpath ] rpm {--install -i} [-v] [--hash -h] [--percent] [--force] [--test] [--replacepkgs] [--replacefiles] [--root ] [--excludedocs] [--includedocs] [--noscripts] [--rcfile ] [--ignorearch] [--dbpath ] [--prefix ] [--ignoreos] [--nodeps] [--ftpproxy ] [--ftpport ] file1.rpm ... fileN.rpm rpm {--upgrade -U} [-v] [--hash -h] [--percent] [--force] [--test] [--oldpackage] [--root ] [--noscripts] [--excludedocs] [--includedocs] [--rcfile ] [--ignorearch] [--dbpath ] [--prefix ] [--ftpproxy ] [--ftpport ] [--ignoreos] [--nodeps] file1.rpm ... fileN.rpm rpm {--query -q} [-afpg] [-i] [-l] [-s] [-d] [-c] [-v] [-R] [--scripts] [--root ] [--rcfile ] [--whatprovides] [--whatrequires] [--requires] [--ftpuseport] [--ftpproxy ] [--ftpport ] [--provides] [--dump] [--dbpath ] [targets] rpm {--verify -V -y} [-afpg] [--root ] [--rcfile ] [--dbpath ] [--nodeps] [--nofiles] [--noscripts] [--nomd5] [targets] rpm {--setperms} [-afpg] [target] rpm {--setugids} [-afpg] [target] rpm {--erase -e} [--root ] [--noscripts] [--rcfile ] [--dbpath ] [--nodeps] [--allmatches] package1 ... packageN rpm {-b|t}[plciba] [-v] [--short-circuit] [--clean] [--rcfile ] [--sign] [--test] [--timecheck ] specfile rpm {--rebuild} [--rcfile ] [-v] source1.rpm ... sourceN.rpm rpm {--recompile} [--rcfile ] [-v] source1.rpm ... sourceN.rpm rpm {--resign} [--rcfile ] package1 package2 ... packageN rpm {--addsign} [--rcfile ] package1 package2 ... packageN rpm {--checksig -K} [--nopgp] [--nomd5] [--rcfile ] package1 ... packageN rpm {--rebuilddb} [--rcfile ] [--dbpath ] rpm {--querytags} Mehr dazu, was die verschiedenen Optionen bewirken, findet man in der Manpage des RPM. 6. Wozu der RPM wirklich gut ist Der RPM ist ein sehr nützliches Tool und hat wie gesehen verschiedene Optionen. Der beste Weg, sie zu verstehen, ist, sich ein paar Beispiele anzuschauen. Einfaches Installieren/Deinstallieren habe ich oben behandelt, also folgen hier noch ein paar andere Beispiele: · Sagen wir, man hat aus Versehen ein paar wichtige Dateien gelöscht. Um sein gesamtes System zu überprüfen und festzustellen, was fehlt, gibt man ein: rpm -Va · Falls man eine Datei findet, von der man nicht weiß, was für eine es ist, kann man herausfinden, zu welchem Paket sie gehört, indem man eingibt: rpm -qf /usr/X11R6/bin/xjewel Die Ausgabe würde wie folgt aussehen: xjewel-1.6-1 · Man findet ein neues Koules rpm, hat aber keine Ahnung, was das eigentlich ist. Um ein paar Informationen dazu zu bekommen, gibt man ein: rpm -qpi koules-1.2-2.i386.rpm Die Ausgabe würde wie folgt aussehen: Name : koules Distribution: Red Hat Linux Colgate Version : 1.2 Vendor: Red Hat Software Release : 2 Build Date: Mon Sep 02 11:59:12 1996 Install date: (no Build Host: porky.redhat.com Group : Games Source RPM: koules-1.2-2.src.rpm Size : 614939 Summary : SVGAlib action game with multiplayer, network, and sound support Description : This arcade-style game is novel in conception and excellent in execution. No shooting, no blood, no guts, no gore. The play is simple, but you still must develop skill to play. This version uses SVGAlib to run on a graphics console. · Wenn man sehen will, welche Dateien Koules installieren würde, hilft ein: rpm -qpl koules-1.2-2.i386.rpm Die Ausgabe ist in diesem Falle: /usr/doc/koules /usr/doc/koules/ANNOUNCE /usr/doc/koules/BUGS /usr/doc/koules/COMPILE.OS2 /usr/doc/koules/COPYING /usr/doc/koules/Card /usr/doc/koules/ChangeLog /usr/doc/koules/INSTALLATION /usr/doc/koules/Icon.xpm /usr/doc/koules/Icon2.xpm /usr/doc/koules/Koules.FAQ /usr/doc/koules/Koules.xpm /usr/doc/koules/README /usr/doc/koules/TODO /usr/games/koules /usr/games/koules.svga /usr/games/koules.tcl /usr/man/man6/koules.svga.6 Das sind nur einige Beispiele. Andere und komplexere kann man schnell zusammenstellen, wenn man erst einmal mit dem RPM vertraut ist. 7. RPM-Pakete erstellen Ein eigenes RPM-Paket zusammenzustellen ist recht einfach, insbesondere wenn man die Software, die man in ein Paket zusammenpacken möchte, dazu bringen kann, ohne Eingriff eines Nutzers automatisch zu kompilieren. Der grundlegende Ablauf beim Erstellen eines RPM-Paketes ist wie folgt: · Sicherstellen, daß /etc/rpmrc für das System konfiguriert ist. · Der Sourcecode, der in das Paket soll, muß auf dem eigenem System korrekt kompilieren. · Einen Patch für alle Veränderungen erstellen, die notwendig waren, damit die Quellen korrekt übersetzt wurden. · Erstellen einer Spec-Datei für das Paket. · Sicherstellen, daß alles da ist, wo es hingehört. · Paket erstellen mit dem RPM. Standardmäßig erzeugt der RPM sowohl Quell- als auch Binärcode. 7.1. Die Datei rpmrc Im Moment wird die Konfiguration des RPM ausschließlich über die Datei /etc/rpmrc erledigt. Eine Beispieldatei könnte so aussehen: require_vendor: 1 distribution: Marke Eigenbau! require_distribution: 1 topdir: /usr/src/meins vendor: Mickiesoft packager: Mickeysoft Packaging Account optflags: i386 -O2 -m486 -fno-strength-reduce optflags: alpha -O2 optflags: sparc -O2 signature: pgp pgp_name: Mickeysoft Packaging Account pgp_path: /home/packages/.pgp tmppath: /usr/tmp Die Zeile require_vendor veranlaßt RPM dazu, eine Vendorzeile zu verlangen. Diese kann dann sowohl in /etc/rpmrc als auch im Header der Spec-Datei selbst festgelegt werden. Um dieses Feature abzuschalten, wird es auf 0 gesetzt. Gleiches gilt für die Zeilen require_distribution und require_group. Die nächste Zeile ist die distribution Zeile. Diese kann entweder hier oder erst später im Header der Spec-Datei definiert werden. Wenn man das Archiv für eine bestimmte Distribution zusammenstellt, ist es sinnvoll, die Zeile entsprechend anzugeben, es ist jedoch nicht unbedingt erforderlich. Die vendor Zeile ist ähnlich, kann jedoch alles mögliche enthalten (z.B. Joe's Software and Rock Music Emporium). RPM unterstützt jetzt auch das Packen von Archiven für verschiedene Architekturen. Die Datei rpmrc kann ``optflags'' Variablen beinhalten, die für einzelne Architekturen spezifische Flags für das Kompilieren usw. enthalten. Die Verwendung dieser Variablen wird in einem späteren Abschnitt behandelt. Zusätzlich zu den obigen Makros gibt es noch einige weitere. Man kann rpm --showrc benutzen, um herauszufinden, wie die Tags im Moment gesetzt sind und was die verfügbaren Flags sind. 7.2. Die Spec-Datei Kommen wir jetzt zu den Spec-Dateien. Sie sind erforderlich, um ein Paket zu erstellen. Sie enthalten eine Beschreibung der Software, Hinweise zum Übersetzen der selbigen und eine Dateiliste aller Binaries, die installiert werden. Man sollte die Spec-Datei nach der Standardkonvention benennen. Diese lautet Paketname-Strich-Versionsnummer-Strich-Releasenummer-Punkt- spec. Hier ein Beispiel für eine Spec-Datei (vim-3.0-1.spec): Summary: ejects ejectable media and controls auto ejection Name: eject Version: 1.4 Release: 3 Copyright: GPL Group: Utilities/System Source: sunsite.unc.edu:/pub/Linux/utils/disk-management/eject-1.4.tar.gz Patch: eject-1.4-make.patch Patch1: eject-1.4-jaz.patch %description This program allows the user to eject media that is autoejecting like CD-ROMs, Jaz and Zip drives, and floppy drives on SPARC machines. %prep %setup %patch -p1 %patch1 -p1 %build make RPM_OPT_FLAGS="$RPM_OPT_FLAGS" %install install -s -m 755 -o 0 -g 0 eject /usr/bin/eject install -m 644 -o 0 -g 0 eject.1 /usr/man/man1 %files %doc README COPYING ChangeLog /usr/bin/eject /usr/man/man1/eject.1 Die erläuternden Texte wie %description oder Summary sollten sin­ nvollerweise in Englisch verfaßt werden, es sei denn, es handelt sich um ein Paket, das nur für deutschsprachige Anwender gedacht ist. 7.3. Der Header Der Header hat einige Standardfelder, die angegeben werden müssen. Es gibt auch ein paar kleine "Problemzonen", die man kennen sollte. Die Felder haben folgenden Inhalt: · Summary: Kurze Beschreibung des Paketes (eine Zeile) · Name: Namensstring aus dem Dateinamen, den das RPM-Paket erhalten soll · Version: Versionsstring aus dem Dateinamen, den das RPM-Paket erhalten soll · Release: Releasenummer für Pakete gleicher Version (d.h. wenn man nach dem Zusammenpacken und Veröffenlichen seines Paketes feststellt, daß es doch noch den einen oder anderen kleineren Bug enthält, bekommt die neue Ausgabe nur eine neue, um eins höhere Releasenummer) · Icon: Name der Icondatei, die von anderen Highlevel- Installationstools verwendet wird (wie z.B. Red Hat's ``glint''). Es muß ein Gif sein, und sich im SOURCES-Verzeichnis befinden. · Source: Diese Zeile verweist auf die Stelle, von der die originalen Quellen stammen. Diese kann man dann verwenden, wenn man einmal das ursprünglichen Paket haben will, oder nach neueren Versionen sucht. Nachteil: Der Dateiname in dieser Zeile muß dem Dateinamen auf dem eigenen System entsprechen, d.h. man sollte das heruntergeladene Archiv nicht umbenennen. Man kann auch mehrere Quelldateien mit mehreren Zeilen wie hier angeben: Source0: ftp://sunsite.unc.edu/pub/foo/bar/blah-0.tar.gz Source1: ftp://sunsite.unc.edu/pub/foo/bar/blah-1.tar.gz Source2: ftp://sunsite.unc.edu/pub/foo/bar1/fooblah.tar.gz Diese Dateien würden im SOURCES Verzeichnis gespeichert werden. Die Verzeichnisstruktur wird in einem späteren Abschnitt diskutiert: "Die Struktur der Quellenverzeichnisse". · Patch: Die Stelle, von der man den Patch wenn nötig herunterladen kann. Bedingung: Der Dateiname muß hier dem Namen entsprechen, der benutzt wird, wenn man den Patch SELBST anwendet. Auch hier kann man wieder mehrere Patchdateien angeben: Patch0: ftp://sunsite.unc.edu/pub/foo/bar/blah-0.patch Patch1: ftp://sunsite.unc.edu/pub/foo/bar/blah-1.patch Patch2: ftp://sunsite.unc.edu/pub/foo/bar1/fooblah.patch Diese Dateien werden auch im SOURCES Verzeichnis gespeichert. · Copyright: Das Copyright des Paketes. Hier sollte etwas von der Art GPL, BSD, MIT, public domain, distributable, oder commercial stehen. · BuildRoot: Hier kann ein Verzeichnis festgelegt werden, welches als ``root''-Verzeichnis für die Übersetzung und Installation des Paketes dient. Man kann diese Möglichkeit einsetzen, um ein Paket erst zu testen, bevor man es endgültig auf dem Rechner installiert. · Group: Diese Zeile teilt einem Highlevel-Installationsprogram ,wie z.B. Red Hat's ``glint'', mit, wo in der Pakethierarchie es einzuordnen ist. Der Groups-Baum sieht zur Zeit etwa so aus: Applications Communications Editors Emacs Engineering Spreadsheets Databases Graphics Networking Mail Math News Publishing TeX Base Kernel Utilities Archiving Console File System Terminal Text Daemons Documentation X11 XFree86 Servers Applications Graphics Networking Games Strategy Video Amusements Utilities Libraries Window Managers Libraries Networking Admin Daemons News Utilities Development Debuggers Libraries Libc Languages Fortran Tcl Building Version Control Tools Shells Games · %description Dies ist kein direkter Teil des Headers, wird aber trotzdem hier kurz mit erwähnt. Dies ist ein mehrzeiliges Feld, und sollte eine kurze Beschreibung des Paketes geben. Man benötigt einen Punkt Beschreibung pro Paket und/oder Unterpaket. 7.4. Prep Das ist der zweite Abschnitt in der Spec-Datei. Hiermit werden die Quellen fürs Übersetzen angepaßt. Man sollte hier alle Dinge veranlassen, die nötig sind, um die Quellen zu patchen und für ein make vorzubereiten. Anmerkung: Jeder dieser Abschnitte ist eigentlich nur ein Platz, an dem Shellskripte ausgeführt werden. Man könnte einfach ein Shellskript schreiben, das nach dem %prep Tag eingetragen wird und die Quellen entpackt und patcht. Wir haben jedoch Makros geschrieben, die das ein wenig vereinfachen sollen. Das erste dieser Makros ist das %setup Makro. Im einfachsten Fall (keine Parameter auf der Kommandozeile) entpackt es nur die Quellen und macht ein cd ins Quellverzeichnis. Es versteht die folgenden Optionen: · -n name setzt den Namen des Übersetzungsverzeichnisses auf den angegebenen Namen name. Der Defaultwert ist $NAME-$VERSION. Andere Möglichkeiten sind $NAME, ${NAME}${VERSION} oder was immer das Haupttararchiv enthält. (Man beachte, daß die hier genannten ``$'' Variablen keine echten Variablen, die im Specfile zur Verfügung stehen, sind, sondern nur als Platzhalter anstelle von Beispielnamen stehen. Man muß die echten Namen und Versionen der Pakete einsetzen, keine Variablen.) · -c erstellt und wechselt in das angegebene Verzeichnis vor dem Entpacken. · -b # entpackt Source# vor dem Wechseln in das Verzeichnis (nicht in Verbindung mit -c verwenden). Diese Option ist nur sinnvoll für mehrere Quelldateien. · -a # entpackt Source# nach dem Wechseln in das Verzeichnis. · -T Diese Option verhindert die Default-Aktion des Entpackens der Quellen und erfordert ein -b 0 oder -a 0 um die Hauptquelldatei zu entpacken. Das wird benötigt, wenn es noch andere Quellen gibt. · -D Das Verzeichnis nicht vor dem Entpacken löschen. Das ist nur sinnvoll, wenn man mehr als ein Setup-Makro hat. Die Option sollte nur in Setup-Makros nach dem ersten Makro benutzt werden, aber nie im ersten. Das nächste verfügbare Makro ist das %patch Makro. Dieses Makro erleichtert das Anwenden von Patches auf die Quellen. Es kennt die folgenden Optionen · # verwendet Patch# als Patchfile. · -p # gibt die Anzahl der Verzeichnisse an, die für das patch(1) Kommando vom Pfad (siehe auch Man-Page von patch)entfernt werden. · -pN Führt ein patch -pN < $RPM_SOURCE_DIR/patchname/ aus, wobei patchname der Name des Patches aus der Patch-Zeile im Header ist. Diese Option ist nützlich für die Anwendung weiterer Patches, wenn für diese eine andere Anzahl von Verzeichnissen vom Pfad entfernt werden muß als für das erste Makro. · %patch# ist an Stelle des richtigen Kommandos %patch # -pN auch möglich Das sollten alle Makros sein, die man benötigt. Wenn man diese richtig verstanden hat, kann man auch andere Arten von Setup's via sh-Skripten erstellen. Alles was bis zum %build Makro, näher erläutert im nächsten Abschnitt, eingefügt wird, wird von der sh abgearbeitet. Siehe das Beispiel oben für Aktionen, die hier ausgeführt werden können. 7.5. Build Für diesen Abschnitt gibt es keine eigenen Makros. Hier werden alle Kommandos eingetragen, die notwendig sind, um ein Programm zu übersetzen, nachdem die Quellen entpackt und gepacht wurden und man ins entsprechende Verzeichnis gewechselt hat. Auch dies hier ist wieder nur eine Folge von Anweisungen, die der shzur Ausführung übergeben werden, d.h. alle gültigen sh-Kommandos können hier benutzt werden, inklusive Kommentare. Das aktuelle Verzeichnis wird nach jedem dieser Abschnitte wieder auf das Toplevel-Verzeichnis der Quellen gesetzt, man sollte das immer beachten. Man kann, wenn notwendig, in ein Unterverzeichnis wechseln. 7.6. Install Auch für diesen Abschnitt gibt es keine eigenen Makros. Es werden hier ebenfalls alle Kommandos aufgelistet, die notwendig sind, um das fertige Programm zu installieren. Falls das Paket ein make install hat, kann man es hier einsetzen. Wenn nicht, kann das Makefile entsprechend gepatcht werden, oder die Installation von Hand mit Shellkommandos bewerkstelligt werden. Das aktuelle Verzeichnis ist hier wieder das Toplevel-Verzeichnis der Quellen. 7.7. Optionale Pre- und Postinstall/deinstall Skripten Hier können Skripten angegeben werden, die vor und nach der Installation und der Deinstallation von fertig übersetzten Paketen abgearbeitet werden. Einer der Hauptgründe dafür ist das Ausführen von speziellen Programmen, wie z.B. ldconfig nach dem Installieren oder Entfernen von Paketen mit Shared Libraries. Die Makros für die jeweiligen Skripte sind: · %pre ist das Makro zum Ausführen von Pre-Install Skripten. · %post ist das Makro zum Ausführen von Post-Install Skripten. · %preun ist das Makro zum Ausführen von Pre-Deinstall Skripten. · %postun ist das Makro zum Ausführen von Post-Deinstall Skripten. Der Inhalt dieser Abschnitte ist ein beliebiges sh-Skript, jedoch ohne die #!/bin/sh Zeile. 7.8. Files In diesem Abschnitt müssen die Dateien des fertig übersetzten Paketes angegeben werden. RPM hat keine Möglichkeit, herauszufinden, welche Dateien als Ergebnis eines make install im System installiert werden. Hierfür gibt es KEINE Möglichkeit. Es gab Vorschläge, dieses mit einem find vor und nach dem Installieren zu bewerkstelligen. In einem Multiusersystem, bei dem zur gleichen Zeit von anderen Prozessen Dateien geschaffen werden können, die mit dem Paket nichts zu tun haben, ist dies jedoch nicht sinnvoll. Hier gibt es ebenfalls einige Makros für spezielle Zwecke. Folgende Makros stehen zur Verfügung: · %doc bezeichnet Dokumentation aus dem Quellpaket, die zusammen mit den übersetzten Binärpaketen installiert werden soll. Sie wird in /usr/doc/$NAME-$VERSION-$RELEASE installiert. Man kann mehrere Dokumente auf einer Kommandozeile auflisten oder je eins pro separatem Makro. · %config bezeichnet Konfigurationsdateien aus dem Paket. Dies beinhaltet z.B. Dateien wie sendmail.cf, passwd usw. Wenn man später das Paket deinstalliert, werden unveränderte Kofigurationsdateien mit dem Paket gelöscht und veränderte mit einem angehängten .rpmsave gesichert. Auch hier können einem Makro mehrere Dateien übergeben werden. · %dir bezeichnet ein Verzeichnis in einer Dateiliste, welches komplett mit zum Paket gehört. Normalerweise wird ein Verzeichnis, das OHNE ein %dir Makro aufgeführt wird, zusammen mit seinem KOMPLETTEN Inhalt in die Dateiliste aufgenommen und später mit dem Paket zusammen installiert. · %files -f ermöglicht das Auflisten der zugehörigen Dateien in einer beliebigen anderen Datei im Übersetzungsverzeichnis der Quellen. Das ist sinnvoll, wenn man ein Paket hat, das seine eigene Dateiliste zusammenstellen kann. Man kann diese Liste dann hier angeben, und muß sie dann nicht extra hier einfügen. Das größte Problem der Dateilisten ist das Auflisten von Verzeichnissen. Wenn man aus Versehen /usr/bin mit auflistet, werden alle Dateien in /usr/bin des Systems als zum Paket gehörig betrachtet. . 7.9. Übersetzen 7.9.1. Die Struktur der Quellenverzeichnisse Zunächst braucht man natürlich einen passenden Verzeichnisbaum für die Quelldateien. Man kann diesen in der Datei /etc/rpmrc festlegen, üblicherweise wird hier einfach /usr/src verwendet. Eventuell müssen die folgenden Verzeichnisse angelegt werden, um einen Verzeichnisbaum für das Übersetzen zu erstellen: · BUILD ist das Verzeichnis, in dem die Übersetzung durch den RPM stattfindet. Man muß seine Testübersetzungen nicht in diesem speziellen Verzeichnis durchführen, aber hier ist es, wo der RPM seine Übersetzungen durchführt. · SOURCES hier sollten alle tar-Archive der originalen Quellen und die Patches stehen. Hier sucht der RPM per Default nach den Quelldateien. · SPECS hier gehören die Spec-Dateien hin. · RPMS das Verzeichnis für die fertig übersetzten rpm's. · SRPMS das Verzeichnis für die Quell-rpm's. 7.9.2. Testübersetzung Zunächst sollte man dafür sorgen, daß die Quellen korrekt ohne den RPM übersetzt werden. Dazu entpackt man die Quellen und benennt das Verzeichnis um nach $NAME.orig. Danach werden die Quellen ein zweites Mal entpackt. Diese zweite Version wird dann zum Übersetzen benutzt. Man wechselt ins Quellverzeichnis und folgt den Anweisungen zum Übersetzen des Paketes. Wenn man, um die Quellen zu übersetzen, Änderungen an ihnen vornehmen mußte, braucht man ein Patch. Um einen solchen zu erstellen, entfernt man alle Dateien, die von einem configure Skript o.ä. angelegt wurden, aus dem Verzeichnis, das die jetzt vollständig übersetzbaren Quellen enthält. Danach wechselt man in das übergeordnete Verzeichnis des obersten Quellverzeichnisses. Danach wird der Patch erstellt mit diff -uNr verzname.orig verzname > ../SOURCES/dirname-linux.patch o.ä., je nach konkretem Fall. Das erzeugt einen Patch, der in der Spec-Datei verwendet werden kann. Der ``linux'' Teil des Patchnamens ist hier nur als Beispiel, man kann hier einen Namen verwenden, der etwas mehr über den Grund für diesen Patch aussagt, z.B. ``config'' oder ``bugs''. Man sollte außerdem noch einen Blick in die fertige Patchdatei werfen, um sicherzustellen, daß nicht aus Versehen Binaries o.ä. mit eingetragen wurden. 7.9.3. Erstellen der Dateiliste Nachdem man funktionierende Quellen hat, werden diese übersetzt und installiert, so wie es beim Endbenutzer geschehen würde. Aus dem Resultat dieser Installation wird dann die Dateiliste erstellt. Wir erstellen die Spec-Datei normalerweise gleichzeitig mit den beschriebenen Schritten. Man erstellt eine Startversion der Datei und setzt die einfachen Teile ein, und ergänzt dann nach und nach die anderen Teile im weiteren Verlauf. 7.9.4. Erstellen des Paketes mit dem RPM Wenn die Spec-Datei fertig ist, kann man versuchen, ein RPM-Paket zu erzeugen. Dies geschieht meistens mit einem rpm -ba foobar-1.0.spec Es gibt weitere Optionen, die mit dem -b Switch zusammen nützlich sind: · p Ausführen des prep Abschnittes der Spec-Datei. · l ist ein Listencheck, der einige Tests mit %files macht. · c Ausführen von prep und kompilieren. Kann verwendet werden, um zu testen, ob die Quellen auch wirklich durchkompilieren. Das sieht auf den ersten Blick etwas sinnlos aus, da man seine Quellen üblicherweise erst zum Übersetzen bringt und dann erst den RPM anwirft, aber wenn man erst mit dem RPM vertraut ist, gibt es Gelegenheiten, in denen das sinnvoll ist. · i Ausführen von prep, kompilieren, installieren. · b Ausführen von prep, kompilieren, installieren, erstellen nur des Binärpaketes. · a alles erstellen (Quell- und Binärpakete). Es gibt noch einige Optionen zum Modifizieren des Ablaufs des -b- Switch: · --short-circuit beginnt direkt mit dem angegebenen Abschnitt (nur zusammen mit c und i). · --clean entfernt nach Beendigung die Übersetzungsverzeichnisse. · --keep-temps behält alle temporären Dateien und Skripte, die in /tmp angelegt wurden. Mit der Option -v kann man sehen, was in /tmp erzeugt wurde. · --test führt keine wirklichen Aktionen aus, aber bewahrt temp- Dateien. 7.10. Austesten Wenn man ein fertiges Paket für die Quellen und die Binaries hat, sollte man es testen. Das Beste und Einfachste ist es, das Paket auf einem völlig anderen Rechner zu testen als dem, auf dem man es erstellt hat. Schließlich hat man das Paket bereits mehrfach auf diesem Rechner mit make install o.ä. installiert, so das es nun bereits recht gut installiert sein sollte. Man kann das Paket mit rpm -u packagename zwar wieder deinstallieren, wenn man aber in der Liste der Dateien eine oder mehrere vergessenen hat, die aber durch das make install installiert wurden, werden diese nicht wieder deinstalliert. Wenn man danach das Paket wieder installiert, ist es wieder vollständig auf dem Rechner, auch wenn das rpm selbst unvollständig ist. Darüber hinaus sollte man beachten, daß man selbst zwar eine Testinstallation mit rpm -ba package macht, die meisten Leute jedoch nur ein rpm -i package machen werden. Man muß daher darauf achten, daß in den build oder install Abschnitten nichts getan wird, was auch für eine reine Installation der Binaries notwendig ist. 7.11. Wenn das neue rpm fertig ist Wenn man ein neues rpm von irgend etwas fertiggestellt hat, kann man es - unter der Voraussetzung, daß es noch nicht als rpm existiert - anderen zur Verfügung stellen. Hierbei muß das, was man zusammengepackt hat, natürlich ein entsprechendes Copyright haben. Man kann es dann auf den FTP-Server ftp.redhat.com stellen. 7.12. Was weiter? Es sei hier noch einmal besonders auf die vorhergehenden Abschnitte zum Testen und der Verwendung der fertigen rpm's hingewiesen. Wir wollen so viele rpm's wie möglich in guter Qualität zur Verfügung stellen. Bitte die rpm's gründlich austesten und dann zum Nutzen aller ins Netz stellen. Unbedingt sollte man jedoch vorher sicherstellen, daß das Copyright dieses auch zuläßt. Kommerzielle Software und Shareware sollte nicht öffentlich zur Verfügung gestellt werden, es sei denn, das Copyright der entsprechenden Software läßt das ausdrücklich zu. Das gilt z.B. für Programme wie Netscape, ssh, pgp, usw. 8. RPM's für verschiedene Architekturen RPM unterstüzt jetzt das Erstellen von Paketen für Intel i386, Digital Alpha mit Linux und Sparc. Berichte besagen, daß es auch auf SGI's und HP's funktionieren soll. Eine Reihe von Eigenschaften vereinfachen das Erstellen von Paketen auf allen Plattformen. Die erste ist die ``optflags'' Direktive in /etc/rpmrc. Sie kann dazu benutzt werden, Flags, die beim Übersetzen von Paketen verwendet werden, auf architekturspezifische Werte zu setzen. Ein anderes Beispiel sind die ``arch'' Makros in der Spec-Datei. Sie können dazu benutzt werden, unterschiedliche Aktionen auszulösen, je nachdem, auf welcher Architektur übersetzt wird. Eine andere Möglichkeit ist die ``Exclude'' Direktive im Header. 8.1. Beispiel für eine Spec-Datei Der folgende Ausschnitt ist Teil des ``fileutils''-Paketes. Es ist für das Übersetzen auf der Intel- und Alphaplattform konfiguriert. Summary: GNU File Utilities Name: fileutils Version: 3.16 Release: 1 Copyright: GPL Group: Utilities/File Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz Source1: DIR_COLORS Patch: fileutils-3.16-mktime.patch %description These are the GNU file management utilities. It includes programs to copy, move, list, etc, files. The ls program in this package now incorporates color ls! %prep %setup %ifarch alpha %patch -p1 autoconf %endif %build configure --prefix=/usr --exec-prefix=/ make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s %install rm -f /usr/info/fileutils* make install gzip -9nf /usr/info/fileutils* . . . 8.2. Optflags In diesem Beispiel wird gezeigt, wie man die ``optflags''-Direktive aus /etc/rpmrc einsetzt. In Abhängigkeit von der jeweiligen Architektur wird die Variable RPM_OPT_FLAGS auf den entsprechenden Wert gesetzt. Das Makefile muß angepaßt werden, damit hier dann diese Variable anstelle der üblichen Direktiven wie -m486 oder -O2 verwendet wird. Man kann sich ein Gefühl dafür verschaffen, was gemacht werden muß, indem man sich erwähntes Quellpaket installiert und das Makefile ansieht. Dazu kann man sich dann im Vergleich den Patch anschauen, um zu sehen, welche Änderungen notwendig sind. 8.3. Makros Sehr wichtig ist das Makro %ifarch. Meistens muß man den einen oder anderen Patch machen, der nur für eine bestimmte Architektur angewandt werden soll. In diesem Fall sorgt der RPM mit Hilfe dieses Makros für die korrekte Verwendung der Patches. Im obigen Beispiel hat das fileutils-Paket einen Patch für 64-bit Architekturen. Dieser Patch soll natürlich im Moment nur für Alpha-Rechner angewandt werden. Deshalb wird ein %ifarch Makro um den 64-bit Patch herumgelegt: %ifarch axp %patch1 -p1 %endif Das stellt sicher, daß der Patch ausschließlich für Alphas verwendet wird. 8.4. Ausschließen von Architekturen in Paketen Damit man die Quell-rpm's für alle Plattformen weiterhin in einem Verzeichnis aufbewahren kann, haben wir die Möglichkeit geschaffen, Pakete von der Übersetzung auf bestimmten Architekturen auszuschließen. Das ermöglicht weiterhin Dinge wie eine Übersetzung ganzer Gruppen von Paketen mit einem Mal, z.B. mit einem rpm --rebuild /usr/src/SRPMS/*.rpm ,wobei man trotzdem dann nur die passenden übersetzten Pakete erhält. Falls ein Programm noch nicht auf eine bestimmte Plattform portiert wurde, reicht ein Einfügen einer Zeile wie: ExcludeArch: axp in den Header der Spec-Datei des Quellpaketes. Danach erstellt man das rpm auf der Architektur, auf der es läuft, und erhält so ein Paket, das z.B. auf Intel übersetzt wird, aber auf Alphas einfach übergangen wird. 8.5. Zusammenfassung Oft ist es einfacher, den RPM zum Erstellen von Paketen für mehrere Architekturen einzusetzen als das Paket selber dazu zu bringen. Wie üblich ist der beste Weg, wenn man mit seinem rpm nicht mehr weiter weiß, einen Blick auf ähnliche andere rpm's zu werfen.