RPM-Pakete selber bauen

Geflickt

Das neue Spielzeug liegt auf dem Tisch, nur leider funktioniert es mit der aktuell eingesetzten Linux-Distribution nicht. Was tun? Ein eigenes RPM-Paket bringt die passende Software auf den Rechner. Die neueste Folge der Admin-Story verrät, wie das geht.
Wer sein System permanent überwacht, hat den Grundstein dafür gelegt Engpässe zu vermeiden und Fehler frühzeitig zu erkennen. Neben dem Platzhirsch Nagios ... (mehr)

Am Ende wurde auch ich ein Opfer des Marketings und entschloss mich, mir ein iPad zuzulegen. Ein paar Leute werden jetzt sicherlich den Kopf schütteln und fragen, wieso es denn ausgerechnet ein Apple-Produkt sein musste, schließlich gibt es auch sehr nette Tablets mit Android. Um mich nicht in endlose Diskussionen zu verstricken – die habe ich bereits hinter mir – stelle ich den Kauf einfach mal als Fakt dar.

Da ich sehr viel unterwegs bin, habe ich das Tablet meistens bei mir und nutze es oft, um Fotos direkt ins Netz oder auf den Computer zu übertragen. Das klappt mit iOS-Geräten, dank Libimobiledevice [1] , auch ganz hervorragend. Mit der Library ist es problemlos möglich, alle Arten von Media-Dateien zwischen dem Tablet und Linux-Geräten zu synchronisieren, sogar die Aktivierung von iPhones funktioniert damit reibungslos.

Vor einiger Zeit war es wieder so weit, es hatten sich jede Menge Bilder und Podcasts auf dem iPad angesammelt, und ich wollte diese gerne auf mein Desktop-System übertragen. Für die Bilder benutze ich Shotwell, bei Audiodateien hat sich Banshee bewährt. Beide Tools sind mittels Libimobiledevice in der Lage, die Dateien vom Tablet zu synchronisieren und zu verwalten. Nach dem Anschluss des Gerätes werde ich diesmal jedoch bitterlich enttäuscht. Nautilus meldet, dass es Probleme beim Einbinden des Gerätes gibt. Auch manuelle Versuche führen nicht zum gewünschten Erfolg. Was war geschehen? Ein schneller Blick in das Libimobiledevice-Forum bestätigt meinen Verdacht: Das kurz zuvor durchgeführte Update auf iOS 5 war schuld.

Bei einem kurzen Zwischenstop im IRC-Kanal der Software bestätigen mir die Entwickler, dass das Git-Repository zwar schon Patches für iOS 5 enthält, diese aber noch nicht als Teil einer Archiv-Datei, geschweige denn in Form eines fertigen Installationspaketes verfügbar sind. Soll ich etwa so lange warten, bis die Maintainer des entsprechenden RPM-Paktes die Patches einbauen oder lieber selbst aktiv werden und ein eigenes Paket bauen?

Ersteres hätte den Vorteil, dass ich nicht in der Paketverwaltung meines Systems herumfusche und eventuelle Probleme beim nächsten Paket-Update provoziere, allerdings könnte ich dann nicht mehr auf mein Tablet zugreifen und müsste so lange warten, bis ein neues Paket mit den notwendigen Patches zur Verfügung steht. So lange will ich jedoch nicht warten und entschließe mich doch, ein eigenes Paket zu bauen.

Ausgecheckt

Libimobiledevice setzt als Versionskontrollsystem Git ein. Um an die aktuellen Patches zu kommen, ist es am einfachsten, sich den kompletten Source-Baum aus dem Git-Repository des Projektes zu laden. Natürlich darf auch Rpmbuild nicht fehlen. Wenn die nötigen Entwicklungswerkzeuge und Bibliotheken auf einem Fedora-System noch fehlen, hilft der Aufruf von »yum groupinstall Development Libraries Development Tools« weiter. Wer erst einmal nachsehen möchte, welche Software er sich auf das eigene System holt, dem sei die Yum-Option »groupinfo« ans Herz gelegt.

Bevor es ans Bauen eines neuen RPM-Paketes geht, ist zuerst das aktuellste Source-Paket aus dem Respository der Distribution zu laden:

yumdownloader --source libimobiledevice

Mittels »rpm -i libimobiledevice*.rpm« packt RPM das Paket aus und speichert die Source Dateien unterhalb von »~/rpmbuild/SOURCES« . Das Specfile, also der Bauplan für das Paket, liegt in »~/rpmbuild/SPECS« . Im Specfile findet sich ein Hinweis darauf, welche Version der Software in dem Paket zum Einsatz kommt, in diesem Fall ist es die Version 1.1.1.

Parallel zu den Sourcen des RPM-Paketes, sind nun ebenfalls die aktuellen Sourcen aus dem Git-Repository des Software notwendig, schließlich suche ich die aktuellen Patches, um mein iOS-5-Problem zu beheben. Mittels Git hole ich diese also auf meinen eigenen Rechner:

git clone git://git.sukimashita.com/libimobiledevice.git

Hierdurch entsteht der Unterordner »libimobiledevice« , in dem sich die Quellcode-Dateien befinden. Mit ein bisschen Git-Kung-Fu erhält man schnell einen Überblick über das Projekt. Mittels »git tag -l« zeigt Git beispielsweise die bekannten Tags auf. Das sind einfache Label, mit denen man auf bestimmte Snapshots der Software zurückgreifen kann. Tags werden gerne eingesetzt, um Release-Stände mit einem Label zu versehen. Das letzte Tag lautet 1.1.1, das deutet also darauf hin, dass dies wirklich das letzte Release der Software war. Das letzte verfügbare Tar-Archiv auf der Webseite trägt ebenfalls diese Versionsnummer. Jedoch heißt dies natürlich nicht, dass die Entwicklung seitdem stillsteht. Der folgende Git-Aufruf bestätigt, dass seit dem 1.1.1-Release einiges im Repository los war ( Listing 1 ).

Listing 1

Repository-Status

 

Es wurden also 51 Zeilen im Programmcode hinzugefügt und 34 entfernt, das Ganze verteilt auf sieben Dateien. Mich interessieren natürlich die Commit-Messages, die jede Änderung dokumentieren ( Listing 2 ).

Listing 2

Kommentare

 

Das sieht doch sehr vielversprechend aus: Gleich zwei Patches enthalten einen Hinweis auf iOS-5-spezische Änderungen (Zeilen 2 und 6). Die will ich haben. Da es nichts schaden kann, auch die anderen Patches mit in mein eigenes Paket aufzunehmen, schreibe ich alle verfügbaren Änderungen in eine Patchdatei. Das geht mit einem Aufruf von

git diff 1.1.1..HEAD > ~/rpmbuild/SOURCES/ios5.patch

Bevor ich weitermache, schaue ich mir jedoch erst einmal die Änderungen an. Da keine bösen Überraschungen zu erwarten sind, editiere ich das zuvor heruntergeladene Specfile von Libimobiledevice und führe die Patch-Datei in der Preamble mittels »Patch1: ios5.patch« auf.

Paketbau

In der »prep« -Sektion sorgt die Anweisung »%patch1 -p1« dafür, dass die Patches auch wirklich auf die Quellen der Software angewendet werden und die Änderungen nach dem Bauen des Paketes zur Verfügung stehen. Das klappt übrigens ohne große Probleme mittels:

rpmbuild -bb ~/rpmbuild/SPECS/libimobiledevice.spec

Vor dem Aufruf ist es erst einmal notwendig, die Release-Nummer im Specfile zu erhöhen, damit der RPM-Paketmanager das Paket auch wirklich als Update erkennt. Mit dem so erzeugten Paket aktualisiere ich schließlich mein System per »yum update libimobiledevice« . Die Spannung steigt, als ich mein iPAD erneut an den Rechner anschließe.

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023