RPM-Umbau aus einem src.rpm mit "rpmbuild" (Beispiele: wlan-kmp & fcdslsl)

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
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:

Code:
man 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
Code:
rpm -i wlan-kmp-1-16.src.rpm
"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.

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
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).

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
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/)

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
Auch hier der selbst heruntergeladenen Version anpassen.

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
Und fertig.

6. Das _passende_ Paket installieren.

Code:
uname -r
2.6.18.2-34-default
Ich habe einen default-Kernel, also:

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%]
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
 

Rain_Maker

Administrator
Teammitglied
AW: RPM-Umbau aus einem src.rpm mit "rpmbuild" => zd1211-firmware

Ein weiteres Beispiel, nützlich für User von WLAN-Sticks mit zd1211-Chipsatz, welche eine Firmware benötigen.

Hierzu verwendete ich das src.rpm für Mandriva 2007 und passte das SPEC-File an, wobei dieses auch auf die neuste Firmware angepasst und diese eingebunden wurde.

1. Download der Firmware:

SourceForge.net: Files

Neuste Version (zur Zeit 1.3) herunterladen und nach '/usr/src/packages/SOURCES' kopieren.

Nachtrag (Wichtig):

Unter Umständen benötigt man eine ältere Firmwareversion als 1.3, siehe auch:

Zydas zd1211b unter suse 10.2 - linuxforen.de -- User helfen Usern

Das Prinzip des Baus bleibt das selbe, man muß nur die Versionsnummern in der Zeile %define version anpassen. Da der Build nur wenige Sekunden dauert, sollte das kein großes Problem sein.


2. SPEC-File (siehe auch Anhang).

Code:
%define name zd1211-firmware
[B]%define version 1.3[/B]
%define release 1

Summary: Firmware files for the ZD1211 chip
Name: %{name}
Version: %{version}
Release: %{release}
Source0: http://prdownloads.sourceforge.net/zd1211/%{name}%{version}.tar.bz2
License: GPL
Group: System/Kernel and hardware
Url: http://sourceforge.net/projects/zd1211/
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
BuildArch: noarch

%description
This package contains the firmware files for the ZD1211 chip, which is
used in WLAN USB sticks.
The files are generated from C header files distributed in the
original ZyDAS ZD1211 driver under the GNU Public License.
The full source of the original ZYDAS driver is available from
http://www.deine-taler.de/zd1211/

%prep
%setup -q -n %{name}

%build

%install
rm -rf $RPM_BUILD_ROOT
install -d $RPM_BUILD_ROOT/lib/firmware/zd1211
install -m644 zd1211* $RPM_BUILD_ROOT/lib/firmware/zd1211

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
%doc README
/lib/firmware/zd1211/zd1211*

%changelog
* Sun Dec 31 2006 Rain_Maker rain_maker(at)root-forum.org
- Firmware updatet to 1.3 and SEPC-file changed for the use on SuSE 10.x

* Tue Sep  5 2006 Olivier Blin <blino(at)mandriva.com> 1.1-2mdv2007.0
- install firmwares in /lib/firmware/zd1211

* Mon Jul 10 2006 Olivier Blin <blino(at)mandriva.com> 1.1-1mdv2007.0
- initial Mandriva release
Als zd1211-firmware.spec nach '/usr/src/packages/SPECS/' kopieren.

Anmerkung (Wichtig!):

Solle sich irgendwann eine neue Version der Firmware auf dem Server befinden, dann ist die oben fett markierte Zeile %define version entsprechend anzupassen!


3. Bau des RPMs

Code:
rpmbuild -bb /usr/src/packages/SPECS/zd1211-firmware.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.60326
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd /usr/src/packages/BUILD
+ rm -rf zd1211-firmware
+ /usr/bin/bzip2 -dc /usr/src/packages/SOURCES/zd1211-firmware1.3.tar.bz2
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd zd1211-firmware
++ /usr/bin/id -u
+ '[' 1001 = 0 ']'
++ /usr/bin/id -u
+ '[' 1001 = 0 ']'
+ /bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.60326
+ umask 022
+ cd /usr/src/packages/BUILD
+ /bin/rm -rf /var/tmp/zd1211-firmware-1.3-1-buildroot
++ dirname /var/tmp/zd1211-firmware-1.3-1-buildroot
+ /bin/mkdir -p /var/tmp
+ /bin/mkdir /var/tmp/zd1211-firmware-1.3-1-buildroot
+ cd zd1211-firmware
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.60326
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd zd1211-firmware
+ rm -rf /var/tmp/zd1211-firmware-1.3-1-buildroot
+ install -d /var/tmp/zd1211-firmware-1.3-1-buildroot/lib/firmware/zd1211
+ install -m644 zd1211b_ub zd1211b_uph zd1211b_uphm zd1211b_uphr zd1211b_ur zd1211_ub zd1211_uph zd1211_uphm zd1211_uphr zd1211_ur /var/tmp/zd1211-firmware-1.3-1-buildroot/lib/firmware/zd1211
+ RPM_BUILD_ROOT=/var/tmp/zd1211-firmware-1.3-1-buildroot
+ export RPM_BUILD_ROOT
+ test -x /usr/sbin/Check -a 1001 = 0 -o -x /usr/sbin/Check -a '!' -z /var/tmp/zd1211-firmware-1.3-1-buildroot
+ echo 'I call /usr/sbin/Check...'
I call /usr/sbin/Check...
+ /usr/sbin/Check
Checking permissions and ownerships - using the permissions files
        /tmp/Check.perms.c23277
setting /var/tmp/zd1211-firmware-1.3-1-buildroot/ to root:root 0755. (wrong owner/group test:users)
setting /var/tmp/zd1211-firmware-1.3-1-buildroot/lib to root:root 0755. (wrong owner/group test:users)
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-symlink
Processing files: zd1211-firmware-1.3-1
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.19105
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd zd1211-firmware
+ DOCDIR=/var/tmp/zd1211-firmware-1.3-1-buildroot/usr/share/doc/packages/zd1211-firmware
+ export DOCDIR
+ rm -rf /var/tmp/zd1211-firmware-1.3-1-buildroot/usr/share/doc/packages/zd1211-firmware
+ /bin/mkdir -p /var/tmp/zd1211-firmware-1.3-1-buildroot/usr/share/doc/packages/zd1211-firmware
+ cp -pr README /var/tmp/zd1211-firmware-1.3-1-buildroot/usr/share/doc/packages/zd1211-firmware
+ exit 0
Finding  Provides: /usr/lib/rpm/find-provides zd1211-firmware
Finding  Requires: /usr/lib/rpm/find-requires zd1211-firmware
sed: kann /usr/src/packages/SOURCES/zd1211-firmware.spec nicht lesen: Datei oder Verzeichnis nicht gefunden
Finding  Supplements: /usr/lib/rpm/find-supplements zd1211-firmware
Requires(rpmlib): rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/zd1211-firmware-1.3-1-buildroot
Wrote: /usr/src/packages/RPMS/noarch/zd1211-firmware-1.3-1.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.44872
+ umask 022
+ cd /usr/src/packages/BUILD
+ cd zd1211-firmware
+ rm -rf /var/tmp/zd1211-firmware-1.3-1-buildroot
+ exit 0
4. Installation des RPMs

Code:
sudo rpm -Uvh /usr/src/packages/RPMS/noarch/zd1211-firmware-1.3-1.noarch.rpm
root's password:
Preparing...                ########################################### [100%]
   1:zd1211-firmware        ########################################### [100%]
Voilà

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben