RPM-Umbau aus einem src.rpm mit "rpmbuild" (Beispiele: wlan-kmp & fcdslsl)
In diesem kleinen Tutorial möchte ich zeigen, wie man recht einfach aus einem bereits vorhandenen src.rpm ein verändertes RPM (z.B. mit einer neueren Programmversion oder an eine andere Prozessorarchitektur angepasst) erstellen kann.
Das funktioniert zwar nicht immer, aber sollte der Versionssprung nicht allzu groß sein, dann hat man zumindest gute Karten.
Als Beispiele habe ich mir die Pakete "fcdslsl" und "wlan-kmp" ausgesucht, da es bei beiden Paketen häufiger Probleme mit den fertigen Binary-RPMS gibt.
Wer eine 64 Bit Installation besitzt und die AVM-Pakete verwenden möchte, der wird um einen Rebuild nicht herumkommen, da es nur fertige Binaries für 32 Bit gibt.
A) Einfacher Rebuild eines src.rpm ohne Veränderung der eigentlichen Komponenten des src.rpm.
Diese Methode macht dann Sinn, wenn man ein Paket auf seine Prozessorarchitektur umstricken möchte, weil es keine passenden Pakete gibt.
Ein weiterer Grund könnte sein, daß es sich um fertige Kernelmodule handelt, für die es nach einem Kernelupdate noch keine neuen Versionen gibt.
Wie das geht habe ich schon einmal beschrieben, deshalb keine weiteren Details dazu.
http://www.pc-forum24.de/internetkonfiguration/2493-opensuse-10-2-avm.html#post12784
Einzig eine Anmerkung, die allgemeingültig ist. Damit der Rebuild gelingt, müssen natürlich die passenden devel-Pakete installiert sein, welche zum Kompilieren benötigt werden.
Hat sich der Ersteller des src.rpm ordentlich Mühe gegeben, dann werden diese auch alle geprüft und schon vor dem unter Umständen langwierigen Kompilierprozeß erscheint eine passende und sehr leicht zu verstehende Fehlermeldung, welche die fehlenden Pakete beim Namen nennt und so ein Nachinstallieren erleichtert.
B) Neubau eines geänderten Binary-RPM aus einem src.rpm.
Diese Methode macht z.B. Sinn, wenn man eine neue Programmversion ausprobieren möchte oder ein Feature aktivieren(deaktivieren) möchte, welches das installierte RPM nicht hat(man nicht benötigt). Hierzu muß das sogenannte SPEC-File editiert werden, welches üblicherweise in '/usr/src/packages/SPECS' liegt. Ein src.rpm besteht prinzipiell aus 2 Komponenten, den eigentlichen Quellen, meist der Sourcecode des Programms und (optionalen) Patches und dem SPEC-File, welches eine Art "Bauvorschrift" für das fertige Binary-RPM darstellt.
Wichtigstes Verzeichnis für den RPM-Bau ist '/usr/src/packages' bzw. die entsprechenden Unterverzeichnisse "RPMS", "SPECS", "SOURCES", "SRPMS" und "BUILD".
In den meisten Fällen kann übrigens der Bau als normaler User erfolgen, nur zur Installation des fertigen RPMs sind natürlich root-Rechte erforderlich.
Eine vollständige Dokumentation aller Optionen findet sich in der Manpage von rpmbuild:
OK, genug der grauen Theorie, machen wir das Ganze mal anhand eines Beispiels.
Ich habe mir hierzu das Paket "wlan-kmp" für openSUSE 10.2 ausgesucht, da es scheinbar ab und zu Probleme mit den darin enthaltenen Serialmonkey Treibern für Ralink WLAN-Karten gibt.
Da dieses Projekt sehr aktiv entwickelt wird, lohnt es sich einen CVS-Snapshot auszuprobieren um den aktuellsten Treiber zu haben.
Im Gegensatz zur händischen Installation über 'make && make install' hat ein RPM natürlich den großen Vorteil der einfacheren und saubereren (De)installation.
1. Pakete besorgen.
a) Download des src.rpm von einem SuSE-Mirror aus dem Repository "src-oss".
ftp://ftp-1.gwdg.de/pub/opensuse/distribution/10.2/repo/src-oss
Dieses Repository kann übrigens auch als Installationsquelle eingebunden werden.
Das Paket wlan-kmp befindet sich im Ordner 'suse/src'.
ftp://ftp-1.gwdg.de/pub/opensuse/distribution/10.2/repo/src-oss/suse/src/wlan-kmp-1-16.src.rpm
Das Paket wird als user (sic!) mit
"installiert". Warum die ""? Nun die Installation besteht in einem einfachen Kopieren des SPEC-Files in '/usr/src/packages/SPECS' und der anderen Dateien in '/usr/src/packages/SOURCES' .
b) Download des neuste CVS-Snapshots der Serialmonkey-Treiber.
http://rt2x00.serialmonkey.com/rt2x00-cvs-daily.tar.gz
2. Tarball und SPEC-File anpassen.
a) Nun werfen wir einen Blick in das SPEC-File.
Zunächst sehen wir die BUILD-Requires, darunter auch die Kernelquellen. Im Gegensatz zu einer Installation von Hand wird als der Kompiliervorgang nicht irgendwann mit "No Rule to make target modules" abbrechen, sondern schon zu Beginn wird eine Fehlermeldung ausspucken, daß das Paket "kernel-source" fehlt, sofern es nicht installiert ist.
Hier ist nun ein guter Zeitpunkt, die Pakete kernel-source, kernel-syms (natürlich PASSEND zum laufenden Kernel!) und sharutils nachzuinstallieren, falls nicht schon vorhanden. Natürlich den gcc ebenfalls installieren!
Weiterhin sehen wir, daß explizit die Version "cvs-2006091108" als "tar.bz2" für den BUILD verwendet werden soll, was wir natürlich ändern möchten.
b) Auspacken des Tarballs von Serialmonkey und erneutes Verpacken im richtigen Format (Ich mache das auf der Konsole, wer es gerne grafisch hat, der verwendet Ark/FileRoller).
Die Dateinamen müssen natürlich den von Euch heruntergeladenen Versionen angepasst werden.
3. Kopieren des tar.bz2 an die richtige Stelle (/usr/src/packages/SOURCES/)
4. Editieren des SPEC-Files mit einem Texteditor und Ändern folgender Zeile.
Auch hier der selbst heruntergeladenen Version anpassen.
5. Neubau des RPM anhand des angepassten SPEC-Files.
Und fertig.
6. Das _passende_ Paket installieren.
Ich habe einen default-Kernel, also:
Das --force stellt sicher, daß auch das "alte" Paket (welches aber die selbe Versionsnummer hat!) überschrieben wird. Ansonsten _grösste Vorsicht_ mit dieser Option!
Damit haben wir eine aktualisierte Version der Serialmonkey-Treiber in das distributionseigene Paket "wlan-kmp" eingebaut und sauber über rpm installiert.
Wer einmal das Prinzip verstanden hat, der kann hiermit einige "eigene" RPMs erstellen.
Happy Frickling!
Greetz,
RM
In diesem kleinen Tutorial möchte ich zeigen, wie man recht einfach aus einem bereits vorhandenen src.rpm ein verändertes RPM (z.B. mit einer neueren Programmversion oder an eine andere Prozessorarchitektur angepasst) erstellen kann.
Das funktioniert zwar nicht immer, aber sollte der Versionssprung nicht allzu groß sein, dann hat man zumindest gute Karten.
Als Beispiele habe ich mir die Pakete "fcdslsl" und "wlan-kmp" ausgesucht, da es bei beiden Paketen häufiger Probleme mit den fertigen Binary-RPMS gibt.
Wer eine 64 Bit Installation besitzt und die AVM-Pakete verwenden möchte, der wird um einen Rebuild nicht herumkommen, da es nur fertige Binaries für 32 Bit gibt.
A) Einfacher Rebuild eines src.rpm ohne Veränderung der eigentlichen Komponenten des src.rpm.
Diese Methode macht dann Sinn, wenn man ein Paket auf seine Prozessorarchitektur umstricken möchte, weil es keine passenden Pakete gibt.
Ein weiterer Grund könnte sein, daß es sich um fertige Kernelmodule handelt, für die es nach einem Kernelupdate noch keine neuen Versionen gibt.
Wie das geht habe ich schon einmal beschrieben, deshalb keine weiteren Details dazu.
http://www.pc-forum24.de/internetkonfiguration/2493-opensuse-10-2-avm.html#post12784
Einzig eine Anmerkung, die allgemeingültig ist. Damit der Rebuild gelingt, müssen natürlich die passenden devel-Pakete installiert sein, welche zum Kompilieren benötigt werden.
Hat sich der Ersteller des src.rpm ordentlich Mühe gegeben, dann werden diese auch alle geprüft und schon vor dem unter Umständen langwierigen Kompilierprozeß erscheint eine passende und sehr leicht zu verstehende Fehlermeldung, welche die fehlenden Pakete beim Namen nennt und so ein Nachinstallieren erleichtert.
B) Neubau eines geänderten Binary-RPM aus einem src.rpm.
Diese Methode macht z.B. Sinn, wenn man eine neue Programmversion ausprobieren möchte oder ein Feature aktivieren(deaktivieren) möchte, welches das installierte RPM nicht hat(man nicht benötigt). Hierzu muß das sogenannte SPEC-File editiert werden, welches üblicherweise in '/usr/src/packages/SPECS' liegt. Ein src.rpm besteht prinzipiell aus 2 Komponenten, den eigentlichen Quellen, meist der Sourcecode des Programms und (optionalen) Patches und dem SPEC-File, welches eine Art "Bauvorschrift" für das fertige Binary-RPM darstellt.
Wichtigstes Verzeichnis für den RPM-Bau ist '/usr/src/packages' bzw. die entsprechenden Unterverzeichnisse "RPMS", "SPECS", "SOURCES", "SRPMS" und "BUILD".
In den meisten Fällen kann übrigens der Bau als normaler User erfolgen, nur zur Installation des fertigen RPMs sind natürlich root-Rechte erforderlich.
Eine vollständige Dokumentation aller Optionen findet sich in der Manpage von rpmbuild:
Code:
man rpmbuild
Ich habe mir hierzu das Paket "wlan-kmp" für openSUSE 10.2 ausgesucht, da es scheinbar ab und zu Probleme mit den darin enthaltenen Serialmonkey Treibern für Ralink WLAN-Karten gibt.
Da dieses Projekt sehr aktiv entwickelt wird, lohnt es sich einen CVS-Snapshot auszuprobieren um den aktuellsten Treiber zu haben.
Im Gegensatz zur händischen Installation über 'make && make install' hat ein RPM natürlich den großen Vorteil der einfacheren und saubereren (De)installation.
1. Pakete besorgen.
a) Download des src.rpm von einem SuSE-Mirror aus dem Repository "src-oss".
ftp://ftp-1.gwdg.de/pub/opensuse/distribution/10.2/repo/src-oss
Dieses Repository kann übrigens auch als Installationsquelle eingebunden werden.
Das Paket wlan-kmp befindet sich im Ordner 'suse/src'.
ftp://ftp-1.gwdg.de/pub/opensuse/distribution/10.2/repo/src-oss/suse/src/wlan-kmp-1-16.src.rpm
Das Paket wird als user (sic!) mit
Code:
rpm -i wlan-kmp-1-16.src.rpm
b) Download des neuste CVS-Snapshots der Serialmonkey-Treiber.
http://rt2x00.serialmonkey.com/rt2x00-cvs-daily.tar.gz
2. Tarball und SPEC-File anpassen.
a) Nun werfen wir einen Blick in das SPEC-File.
Code:
Name: wlan-kmp
[B]BuildRequires: kernel-source kernel-syms sharutils[/B]
%define kernel_version %(uname -r)
%define at76_version 0.14beta1
%define wlanng_version 0.2.5
%define acx_version 20060521
%define adm_version 20060111
%define rfswitch_version 0.1
[B]%define rt2x00_version cvs-2006091108[/B]
%define rtl_version 1.0.1-b
%define ipw3945_version 1.1.0
Summary: Kernel Modules for Wireless LAN Cards
Version: 1
Release: 16
Group: System/Kernel
License: GNU General Public License (GPL)
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#Provides:
#Requires:
#Conflicts:
Url: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html
Autoreqprov: on
Supplements: modalias(pci:v*d*sv*sd*bc06sc07i00*)
Source10: at76_usb-%{at76_version}.tar.bz2
Patch10: at76_usb.diff
Source30: linux-wlan-ng-%{wlanng_version}.tar.bz2
Patch30: linux-wlan-ng.diff
Source31: linux-wlan-ng.config
Source32: linux-wlan-ng-mkversionh.sh
Source40: acx-%{acx_version}.tar.bz2
Patch40: acx.dif
Source50: ipw3945-%{ipw3945_version}.tar.bz2
Source51: ipw3945-Makefile
Patch50: ipw3945-api_version.diff
Source60: adm8211-%{adm_version}.tar.bz2
Patch60: adm8211.dif
Source70: rtl818x-%{rtl_version}.tar.bz2
Patch70: rtl818x.diff
Source80: rfswitch-%{rfswitch_version}.tar.bz2
Patch80: rfswitch.dif
[B]Source90: rt2x00-%{rt2x00_version}.tar.bz2[/B]
Patch90: rt2x00.diff
Source100: preamble
Hier ist nun ein guter Zeitpunkt, die Pakete kernel-source, kernel-syms (natürlich PASSEND zum laufenden Kernel!) und sharutils nachzuinstallieren, falls nicht schon vorhanden. Natürlich den gcc ebenfalls installieren!
Weiterhin sehen wir, daß explizit die Version "cvs-2006091108" als "tar.bz2" für den BUILD verwendet werden soll, was wir natürlich ändern möchten.
b) Auspacken des Tarballs von Serialmonkey und erneutes Verpacken im richtigen Format (Ich mache das auf der Konsole, wer es gerne grafisch hat, der verwendet Ark/FileRoller).
Code:
tar xvzf rt2x00-cvs-daily.tar.gz #Auspacken
ls
rt2x00-cvs-2007011912 rt2x00-cvs-daily.tar.gz #Name des Ordners auflisten
tar cvfj rt2x00-cvs-2007011912.tar.bz2 rt2x00-cvs-2007011912/ #Verpacken
3. Kopieren des tar.bz2 an die richtige Stelle (/usr/src/packages/SOURCES/)
Code:
cp rt2x00-cvs-2007011912.tar.bz2 /usr/src/packages/SOURCES/
4. Editieren des SPEC-Files mit einem Texteditor und Ändern folgender Zeile.
Code:
%define rt2x00_version cvs-2006091108
%define rt2x00_version cvs-2007011912
5. Neubau des RPM anhand des angepassten SPEC-Files.
Code:
rpmbuild -bb /usr/src/packages/SPECS/wlan-kmp.spec
----------Ratter----Ratter-----------------------------
+ cd /usr/src/packages/BUILD
+ rm -rf rt2x00-cvs-2007011912
+ /usr/bin/bzip2 -dc /usr/src/packages/SOURCES/[B]rt2x00-cvs-2007011912.tar.bz2[/B]
+ tar -xf -
-------- Es wird das "neue" Paket verwendet! ----------
----------Ratter----Ratter-----------------------------
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/wlan-kmp-1-build
[B]Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-bigsmp-1_2.6.18.2_34-16.i586.rpm
Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-debug-1_2.6.18.2_34-16.i586.rpm
Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-default-1_2.6.18.2_34-16.i586.rpm
Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-xen-1_2.6.18.2_34-16.i586.rpm
Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-xenpae-1_2.6.18.2_34-16.i586.rpm
Wrote: /usr/src/packages/RPMS/i586/wlan-kmp-debuginfo-1-16.i586.rpm[/B]
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.68140
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd rt2x00-cvs-2007011912
+ rm -rf /var/tmp/wlan-kmp-1-build
+ exit 0
6. Das _passende_ Paket installieren.
Code:
uname -r
2.6.18.2-34-default
Code:
sudo rpm -Uvh /usr/src/packages/RPMS/i586/wlan-kmp-default-1_2.6.18.2_34-16.i586.rpm --force
root's password:
Preparing... ########################################### [100%]
1:wlan-kmp-default ########################################### [100%]
Damit haben wir eine aktualisierte Version der Serialmonkey-Treiber in das distributionseigene Paket "wlan-kmp" eingebaut und sauber über rpm installiert.
Wer einmal das Prinzip verstanden hat, der kann hiermit einige "eigene" RPMs erstellen.
Happy Frickling!
Greetz,
RM