Thema geschlossen
Ergebnis 1 bis 2 von 2

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

  1. #1
    Administrator Avatar von Rain_Maker
    Registriert seit
    06.02.2006
    Beiträge
    5,458

    Standard 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/internetkon...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/dis...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/dis...p-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
    BuildRequires:  kernel-source kernel-syms sharutils
    %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
    %define rt2x00_version cvs-2006091108
    %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
    Source90:       rt2x00-%{rt2x00_version}.tar.bz2
    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/rt2x00-cvs-2007011912.tar.bz2
    + 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
    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
    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
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE 11.4 - 3.2.2-desktop - fluxbox 1.3.2

    For Windows-Problems - Reboot / For Linux-Problems - BE ROOT!
    (==> Und hier das wirkliche "Geheimnis meines Erfolges")

  2. #2
    Administrator Avatar von Rain_Maker
    Registriert seit
    06.02.2006
    Beiträge
    5,458

    Standard 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
    %define version 1.3
    %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
    Angehängte Dateien
    Geändert von Rain_Maker (27.01.2007 um 21:08 Uhr)
    "Programming today is a race between software engineers striving to build better & bigger idiot-proof programs and the Universe trying to produce bigger & better idiots. So far, the Universe is winning." (Rick Cook)

    Dies ist ein _öffentliches_ Supportforum, keinerlei Support per PN, EMail oder Instant Messenger.

    openSUSE 11.4 - 3.2.2-desktop - fluxbox 1.3.2

    For Windows-Problems - Reboot / For Linux-Problems - BE ROOT!
    (==> Und hier das wirkliche "Geheimnis meines Erfolges")

Thema geschlossen

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87