FPM baut parallel RPM- und DEB-Pakete

Aus LinuxUser 10/2013

FPM baut parallel RPM- und DEB-Pakete

© Jayofboy, sxc.hu

Der packt das

Das Tool Effing Package Management baut binnen weniger Sekunden fertige RPM- und DEB-Pakete, ohne dass Sie sich mit Konfigurationsdateien herumschlagen müssen.

README

Der Effing Package Management erstellt RPM- und DEB-Pakete mit einem einfachen Kommandozeilenbefehl. Stößt er dabei auf keine größeren Probleme, dann liegen nach gut einer Minute fertige Archive für die beiden Plattformen vor.

Im Gegensatz zu Windows-Anwendern kommen Linux-Nutzer in den Genuss eines komfortablen Paketmanagements. Zwei Mausklicks genügen, und schon landet eine neue Software einsatzbereit auf der Platte, das Handbuch am dafür vorgesehenen Ablageort oder der neue Stapel Hintergrundbilder im passenden Order. Die reibungslose Installation setzt voraus, dass Entwickler, Autoren und Grafiker die Ergebnisse zu einem Paket verschnüren.

Dummerweise haben sich in der Praxis mehrere Formate für das Paketieren etabliert: Debian-basierte Distributionen verwenden das DEB-Format; OpenSuse, Fedora und Co. nutzen das RPM-Format. Möchten Sie beide Varianten unterstützten, gilt es folglich, sich mit beiden Spezifikationen und den zugehörigen Konfigurationsdateien zu beschäftigen. Ein Programm namens Effing Package Management, kurz FPM [1], vereinfacht die Arbeit.

Fluchen hilft

Wie sein Name andeutet, richtet sich FPM zunächst an alle, die schon einmal am Bau eines Pakets schimpfend verzweifelt sind (der Fluch “effing” bedeutet sinngemäß “verdammt”). Das Tool schnürt in einem Arbeitsgang Pakete für unterschiedliche Distributionen, ohne dass Sie dafür weitere Angaben zu machen bräuchten.

Wie einfach das funktioniert, zeigte der Entwickler Jorden Sissel auf einer Konferenz, auf der er den Quellcode der Software Memcached in nur 60 Sekunden in ein DEB- und ein RPM-Paket verwandelte [1]. FPM eignet sich damit ideal, um während des Entwickelns einer Software schnell und automatisiert Pakete zum Testen zu erstellen.

Neben Entwicklern spricht das Werkzeug auch Anwender an, die zu einer Software kein passendes Paket finden und sich kurzerhand selbst eines bauen möchten. Einen kleinen Haken hat das FPM allerdings: Es ist auf das schnelle, unkomplizierte Erzeugen von Paketen ausgelegt. Die von ihm ausgespuckten Pakete folgen daher nicht notwendigerweise exakt den Richtlinien von Debian beziehungsweise RPM. Dies ließe sich aber – mit einigem Aufwand und zahlreichen Parametern – auf der Kommandozeile erreichen.

Kleiner Rubin

FPM selbst ist in der Skriptsprache Ruby geschrieben. Sie spielen es bei Bedarf über den Ruby-eigenen Paketmanager Gem ein. Dazu wiederum benötigen Sie die passende Laufzeitumgebung, die Entwicklerpakete sowie Make und den C-Compiler. Die entsprechenden Pakete holt unter Ubuntu holt der folgende Befehl herbei:

$ sudo apt-get install ruby ruby-dev build-essential

Unter OpenSuse und Fedora installieren Sie die Pakete ruby, ruby-devel, make und gcc, bei CentOS und Red Hat sind es ruby, ruby-devel, rubygems, make und gcc. FPM installieren Sie dann über das folgende Kommando:

$ sudo gem install fpm

Das zieht unter Umständen die Installation weiterer Ruby-Pakete nach sich (Abbildung 1). Abschließend spielen Sie die Werkzeuge ein, die zum Bau der Pakete notwendig sind. Nutzt Ihre Distribution DEB-Pakete, benötigen Sie zusätzlich Rpmbuild, um später RPM-Pakete zu bauen.

Abbildung 1: Die Installation des Ruby-Gems <code srcset=

fpm holt je nach Distribution zahlreiche weitere Gems nach.” width=”300″ height=”183″ /> Abbildung 1: Die Installation des Ruby-Gems fpm holt je nach Distribution zahlreiche weitere Gems nach.

Unter Ubuntu steckt Rpmbuild im Paket rpm. Sind Sie nicht sicher, welche Programme Sie auf Ihrer Distribution benötigen, versuchen Sie mit FPM einfach ein Paket zu bauen: Fehlt ein Werkzeug, nennt Ihnen das Tool dann den entsprechenden Namen.

Bildersammlung

Möchten Sie beispielsweise eine Sammlung von Hintergrundbildern in einem RPM- oder DEB-Paket konservieren, finden Sie zuerst heraus, in welchem Verzeichnis im System die Bilder in der Regel lagern. Unter Ubuntu liegen diese in /usr/share/backgrounds. Auf dieses Verzeichnis setzen Sie fpm an:

$ fpm -n hintergrundbilder -s dir -t deb /usr/share/backgrounds

Der Parameter -s dir zeigt an, dass ein Verzeichnis seinen Weg in das Paket findet. Über -t deb erzeugen Sie ein DEB-Paket; analog würde -t rpm zu einem RPM-Paket führen. Hinter -n steht schließlich noch der Dateiname des Pakets, die Endung ergänzt fpm selbst (Abbildung 2). Unter OpenSuse heißt das Programm übrigens nicht fpm, sondern fpm1.9.

Abbildung 2: Ein kurzer Befehl reicht aus, um den Inhalt von <code srcset=

/usr/share/backgrounds in ein Paket zu stecken.” width=”300″ height=”93″ /> Abbildung 2: Ein kurzer Befehl reicht aus, um den Inhalt von /usr/share/backgrounds in ein Paket zu stecken.

Das Ergebnis ist ein Paket mit allen Hintergrundbildern, die Sie nun leicht auf anderen Rechnern einspielen. Dort landen die Dateien aus dem Paket wieder ordnungsgemäß im Unterverzeichnis /usr/share/backgrounds. Das fertige Archiv besitzt jedoch gleich mehrere Schönheitsfehler.

Zunächst bemängelt vermutlich der Paketmanager die schlechte Qualität (Abbildung 3). Diese Warnung klicken Sie einfach weg beziehungsweise unterdrücken sie. Des Weiteren hat FPM einfach alle Bilddateien aus dem Verzeichnis /usr/share/backgrounds eingepackt, auch die ursprünglich dort von Ubuntu installierten. Der Paketmanager versucht folglich auf dem Zielsystem diese Hintergrundbilder mit denen aus dem selbst gebauten Paket zu überschreiben, was wiederum mit einer Fehlermeldung endet.

Abbildung 3: Das fertige Paket hält sich nicht an die Richtlinien, was das Ubuntu Software-Center hier beim Einspielen bemängelt.

Abbildung 3: Das fertige Paket hält sich nicht an die Richtlinien, was das Ubuntu Software-Center hier beim Einspielen bemängelt.

Sie haben jetzt die Möglichkeit, den Paketmanager dazu zwingen, die Bilder zu ersetzen. Das führt unter Umständen jedoch zu einem kleinen Chaos – erst recht, wenn es nicht mehr nur um Bilder, sondern etwa die mühsam angepassten Konfigurationsdateien aus dem Verzeichnis /etc handelt.

Im Dschungel

Sie sollten sich folglich gut überlegen, welche Verzeichnisse Sie einpacken. Auf Nummer sicher gehen Sie, wenn Sie hinter fpm alle selbst hinzugefügten Hintergrundbilder auflisten:

$ fpm -n hintergrundbilder -t deb /usr/share/backgrounds/wueste.png /usr/share/backgrounds/wald.png

Bei vielen Bildern fällt das natürlich recht umständlich aus. Abhilfe schafft ein kleiner Trick: Erstellen Sie im Verzeichnis /tmp das Unterverzeichnis usr/share/backgrounds, der komplette Pfad lautet somit /tmp/usr/share/backgrounds. Dort hinein kopieren Sie die eigenen Hintergrundbilder. Anschließend wechseln Sie in das Verzeichnis /tmp und weisen fpm an, die Dateien aus dem Unterverzeichnis usr/share/backgrounds einzupacken:

$ cd /tmp
$ fpm -n hintergrundbilder -t deb usr/share/backgrounds

Bei der Installation des Pakets landen die Hintergrundbilder damit wieder ordnungsgemäß im Verzeichnis /usr/share/backgrounds und nicht unterhalb von /tmp/. Den Wechsel ins Verzeichnis übernimmt bei Bedarf FPM für Sie:

$ fpm -C /tmp -n hintergrundbilder -t deb usr/share/backgrounds

Hier funktioniert der Parameter -C genau so wie beim allseits bekannten Tar.

Architektur

FPM erstellt automatisch immer ein Archiv mit der Architektur des Systems zum Paketieren verwendeten Systems. Nutzen Sie das Programm auf einem 32-Bit-System, erhalten Sie folglich ein entsprechendes Paket. Die gewählte Architektur lesen Sie direkt am Dateinamen ab. Im Fall der Bilder wäre allerdings ein von der Architektur unabhängiges Paket wünschenswert. Genau dafür sorgt der Parameter -a all bei Aufruf.

FPM vergibt für das Paket zudem standardmäßig die Versionsnummer 1.0. Über den Parameter -v geben Sie stattdessen selbst eine eigene vor. An die Versionsnummern schließt sich häufig noch ein Bindestrich und eine Release-Bezeichnung an, wie etwa 1.7-3. Diese nachgestellte Nummer geben Sie mit dem Parameter --iteration vor:

$ fpm -n hintergrundbilder -a all -v 1.7 --iteration 3 -s dir -t deb /usr/share/backgrounds

Neben Zahlen nimmt dieser Parameter auch Texte entgegen, die Sie in Anführungszeichen einschließen. Auf diesem Weg erzeugen Sie beispielsweise ein Paket mit der Versionsnummer 1.7-meines

Bauplatz

Auf ähnlich einfach Weise tüten Sie komplette Programme ein. Dazu laden Sie lediglich den Quellcode des gewünschten Programms herunter, übersetzen diesen, installieren ihn in ein Verzeichnis und setzen abschließend FPM darauf an. Als Beispiel dient im Folgenden das Strategiespiel “Curse of War” [2]. Es ist recht klein, besitzt wenige Abhängigkeiten und liegt den großen Distributionen noch nicht bei (Abbildung 4).

Abbildung 4: Das Strategiespiel "Curse of War" kann anstelle der schicken Grafiken auch ASCII-Zeichen verwenden.

Abbildung 4: Das Strategiespiel “Curse of War” kann anstelle der schicken Grafiken auch ASCII-Zeichen verwenden.

Den Quellcode für das Spiel erhalten Sie auf der Website [3]. Den folgenden Ausführungen liegt die Version 1.2 zugrunde. Das Archiv mit dem Quellcode entpacken Sie und wechseln in einem Terminal in das entstandene Verzeichnis. Anschließend spielen Sie alle Entwicklerpakete und Werkzeuge ein, die Sie zum Übersetzen des Programms benötigen.

“Curse of War” setzt lediglich die SDL-Bibliothek voraus. Das Paket heißt unter Ubuntu libsdl1.2-dev. Nachdem Sie es mit dem Paketmanager eingespielt haben, übersetzen Sie das Programm wie gewohnt. In der Regel geschieht das per ./configure, gefolgt von make; bei “Curse of War” genügt ein make SDL=yes. Das Spiel nimmt dabei als Verzeichnis für die Installation /usr/bin an, was Sie nicht ändern sollten.

Normalerweise würden Sie jetzt das fertig übersetzte Ergebnis mit make install im System installieren. Im Fall von FPM braucht es jedoch etwas Gehirnschmalz, denn das Programm erkennt nicht selbst, welche Dateien zum Spiel gehören und in welche Systemverzeichnisse diese gehören. Sie kommen folglich nicht umhin, das komplette Spiel erst einmal in ein temporäres Verzeichnis zu installieren:

$ mkdir /tmp/curseofwar
$ make install SDL=yes DESTDIR=/tmp/curseofwar

Der erste Befehl erstellt das Verzeichnis /tmp/curseofwar. Der zweite installiert das Spiel nicht wie sonst üblich im Verzeichnis /usr, sondern unter /tmp/curseofwar/usr. Der Trick mit dem angehängten DESTDIR=/tmp/curseofwar funktioniert durchweg bei allen Programmen, die auf Make setzen. Bei allen anderen Anwendungen gilt es, die Dokumentation zu studieren.

Eingepackter Krieg

Anschließend weisen Sie FPM an mit dem Befehl aus Listing 1 an, die Dateien im Verzeichnis /tmp/curseofwar in ein DEB-Paket zu verpacken. Der erste Aufruf im Listing sieht ziemlich kryptisch aus, ist aber schnell entwirrt: Der Packer erstellt ein Debian-Paket (-t deb) mit dem Namen curseofwar. Das Spiel liegt in der Version 1.2 vor, folglich bietet es sich an, diese Versionsnummer ins Paket zu übernehmen (-v 1.2). Spielt die Version keine Rolle, verzichten Sie auf die komplette Klammer.

Listing 1

$ fpm -s dir -t deb -n curseofwar -v 1.2 \
      -C /tmp/curseofwar \
      -d "libsdl1.2debian (>= 1.2)" \
      usr/bin usr/share/curseofwar
$ fpm -s dir -a all -t deb -n curseofwar-doc \
      -v 1.2 -C /tmp/curseofwar \
      usr/share/man usr/share/doc

FPM wechselt ins Verzeichnis /tmp/curseofwar, wo es die Verzeichnisse usr/bin und usr/share/curseofwar ins Paket steckt. Das erste Verzeichnis enthält das eigentliche Programm, unter usr/share/curseofwar lagern die Grafiken (Abbildung 5). Alternativ hätte es sich angeboten, das komplette Verzeichnis usr/ einzupacken. In Beispiel soll die Dokumentation in ein eigenes Paket wandern.

Abbildung 5: Mit <code srcset=

dpkg überprüfen Sie auf die Schnelle, ob das geschnürte Paket alle Dateien enthält und diese in den korrekten Verzeichnissen liegen.” width=”300″ height=”249″ /> Abbildung 5: Mit dpkg überprüfen Sie auf die Schnelle, ob das geschnürte Paket alle Dateien enthält und diese in den korrekten Verzeichnissen liegen.

“Curse of War” setzt die SDL-Bibliothek voraus, die unter Debian und Ubuntu im Paket libsdl1.2debian steckt. Genau diese Abhängigkeit impft der Parameter -d libsdl1.2debian ein. In den Klammern steht dabei hinter >= die Versionsnummer, in der die Bibliothek mindestens vorliegen muss.

Im Beispiel verlangt das Spiel nach einer SDL-Bibliothek in der Version 1.2 oder höher. Alternativ setzen Sie nur ein Größer-Zeichen einsetzen: (> 3.4.5). In diesem Fall müsste die Bibliothek eine Versionsnummer größer als 3.4.5 tragen. Sofern Ihr Programm weitere Abhängigkeiten besitzt, hängen Sie entsprechend weitere Parameter -d an.

Die Dokumentation wandert mit dem zweiten Aufruf aus Listing 1 in ein eigenes, von der Architektur unabhängiges Paket.

Garnierung

Unschön ist noch, dass die fertigen DEB-Pakete keine Beschreibung aufweisen (Abbildung 6) und die Paketmanager die schlechte Qualität bemängeln.

Abbildung 6: FPM gibt ein paar Standard-Metadaten vor, insbesondere fehlt dabei eine vernünftige Beschreibung.

Abbildung 6: FPM gibt ein paar Standard-Metadaten vor, insbesondere fehlt dabei eine vernünftige Beschreibung.

Ersteres beheben Sie leicht mit dem Parameter --description, dem Sie einfach einen entsprechenden Text anhängen:

$ fpm -s dir -t deb --description "Die Dokumentation zum Spiel Curse of War" ...

Über den Parameter --url legen Sie analog eine Website fest, über -m den Maintainer, also den Ersteller des Pakets, mit --license die Lizenz, über --vendor das Unternehmen und via --category die Kategorie, zu der das Paket gehört.

Sind Ihnen das zu viele Parameter, verwenden Sie den Parameter -e. Effing Package Management öffnet dann vor dem Erstellen des Pakets einen Editor (in der Regel Vi) mit dem sogenannten Spec-File, das alle genannten Infos zusammenfasst. Wie der Inhalt dieses Spec-Files aussieht, hängt vom Paketformat ab. Abbildung 7 zeigt die noch gut verständliche Debian-Fassung, das RPM-Pendant liest sich wesentlich kryptischer. Sie sollten daher nur die Informationen ändern, deren Zweck sie kennen.

Abbildung 7: Die Meta-Informationen eines Pakets öffnet FPM auf Wunsch im voreingestellten Texteditor – wie hier ist das meist Vi.

Abbildung 7: Die Meta-Informationen eines Pakets öffnet FPM auf Wunsch im voreingestellten Texteditor – wie hier ist das meist Vi.

FPM stellt für jedes Paketformat noch spezielle Parameter bereit. Die für das DEB-Format beginnen allesamt mit --deb-. So gibt --deb-user root vor, dass alle Dateien im Paket dem Benutzer root gehören sollen. Analog setzt --deb-group root die Zugehörigkeit zur Gruppe.

Verwenden Sie das RPM-Format, heißen die entsprechenden Parameter --rpm-user beziehungsweise --rpm-group. Beide Parameter sollten Sie im vorliegenden Beispiel verwenden, andernfalls bemängelt der Paketmanager falsche Benutzerrechte.

Der komplette Befehl für das Spiel “Curse of War” besteht aus dem kryptischen Bandwurm, den Sie in Listing 2 sehen. Sämtliche möglichen Parameter listen die Manpage von FPM und das Wiki auf [1]. Letztgenanntes hält zudem noch ein paar komplexere Beispiele aus der Praxis bereit.

Listing 2

$ fpm --category "games" \
      -m "Max Mustermann <max@example.com>" \
      --url "http://a-nikolaev.github.io/curseofwar/" \
      --description "Das Spiel Curse of War" \
      --deb-user root --deb-group root \
      -s dir -t deb -n curseofwar -v 1.2 \
      -C /tmp/curseofwar \
      -d "libsdl1.2debian (>= 1.2)" \
      usr/bin usr/share/curseofwar

Bislang hat FPM die Dateien für ein Paket immer aus einem Verzeichnis genommen. Sie besteht aber auch die Möglichkeit, ein anderes Paket als Ausgangspunkt zu nehmen. Auf diese Weise wandeln Sie bei Bedarf ein RPM-Paket in ein DEB-Paket um:

fpm -s deb -t rpm -n curseofwar curseofwar_1.2_i386.deb

Auf diesem Weg manipulieren Sie auf die Schnelle ein Paket. So tauscht etwa die folgende Kommandozeile die ursprüngliche Beschreibung des Pakets gegen den String “Keine” und die Versionsnummer gegen 1.1 aus:

$ fpm -s deb -t deb -n curseofwar --description "Keine" -v 1.1 curseofwar_1.2_i386.deb

Neben rpm und deb dürfen Sie als Eingabeformate auch Tar-Archive, Ruby Gems und Python-Module verwenden. FPM erstellt darüber hinaus noch Pakete für Solaris und Puppet.

Fazit

Jordan Sissel schafft es nicht ganz, sein Versprechen einzulösen: Wer FPM nutzen möchte, sollte sich einiger Restriktionen bewusst sein und muss teils mit zahlreichen Parametern jonglieren. Zudem arbeitet das Programm nur dann reibungslos, wenn es einen Haufen Dateien verpackt – die Sie im schlimmsten Fall FPM einzeln nennen müssen. Außerdem produziert FPM nicht ganz standardkonforme Pakete.

Dennoch gelangen Sie mit FPM oft extrem schnell zu fertigen Paketen. Zudem eignet sich das Programm äußerst gut zum Einbinden in Shell-Skripte, die zum Beispiel einmal in der Nacht neue DEB- und RPM-Pakete erzeugen.Sissel entwickelt sein Effing Package Management recht zügig weiter, wobei immer wieder neue Formate und Funktionen hinzukommen. Es lohnt sich folglich, die Github-Seiten im Auge zu behalten. 

Infos

[1] Effing Package Management: https://github.com/jordansissel/fpm/wiki

[2] “Curse of War”: http://a-nikolaev.github.io/curseofwar/

[3] “Curse of War” auf Github: https://github.com/a-nikolaev/curseofwar/releases

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 10/2013 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben