Wie man einen Kernel kompiliert - auf Fedora

Version 1.0
Author: Falko Timme


Jede Distribution hat besondere Tools, mit denen sie einen benutzerdefinierten Kernel aus den Quellen kompiliert. Diese Anleitung veranschaulicht, wie man einen Kernel auf Fedora-Systemen kompiliert. Sie beschreibt, wie man einen benutzerdefinierten Kernel baut, unter Verwendung der neusten unveränderten Kernelquellen von www.kernel.org (vanilla kernel), damit Du nicht an die Kernel, die von Deiner Distribution bereitgestellt werden, gebunden bist. Weiterhin wird gezeigt, wie man die Kernelquellen patcht, falls Funktionen benötigt werden, die darin nicht enthalten sind.

Ich habe dies auf Fedora Core 6 getestet.

Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen - dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

In dieser Anleitung beschreibe ich zwei Varianten, wie man einen Kernel für Fedora Systeme baut. Die erste Variante ist Fedora-spezifisch. Du erhältst am Ende ein Kernel rpm Paket, das Du installieren oder mit anderen teilen kannst. Die zweite Variante ist für alle Linux Distributionen die gleiche, Du hast am Ende allerdings kein rpm Paket.

Ich werde alle Schritte dieser Anleitung als root Benutzer ausführen. Es ist jedoch möglich, die meisten Befehle als nicht-privilegierter Benutzer auszuführen (z.B. Benutzer tom). Einige Befehle, wie yum oder rpm verlangen trotzdem Root-Privilegien, Du solltest tom (oder was auch immer Dein Benutzername ist) also /etc/sudoers hinzufügen indem Du Folgendes ausführst

visudo

Füge diese Zeile hinzu:
tom  ALL=(ALL) ALL
Wenn Du also einen Befehl ausführst, der Root-Privilegien erfordert, wie zum Beispiel

yum install fedora-rpmdevtools unifdef

wird Dir das der Befehl mitteilen und Du musst stattdessen Folgendes ausführen

sudo yum install fedora-rpmdevtools unifdef

Denke daran: Du kannst sudo vergessen, wenn Du alle Befehle als root ausführst. Es ist Dir überlassen, was Du bevorzugst.

2 Ein Kernel rpm Paket bauen

Dieses Kapitel zeigt, wie man einen Kernel baut und ein rpm Paket erhält, das man installieren und mit anderen teilen kann.

2.1 Dein rpmbuild Verzeichnis erstellen

Erstelle Dein rpmbuild Verzeichnis wie folgt:

cd ~
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros

Installiere dann die benötigten Pakete um rpm Pakete zu bauen

yum install fedora-rpmdevtools unifdef

und führe dies aus

fedora-buildrpmtree


2.2 Lade ein Fedora Kernel src.rpm runter und installiere es

Als Nächstes laden wir das neuste Kernel src.rpm für unsere Fedora Version runter. Für Fedora Core 6 befinden sich die src.rpm Pakete in http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/, für Fedora Core 5 ist es http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/ usw.

Das neuste Fedora Core 6 Kernel src.rpm ist kernel-2.6.18-1.2798.fc6.src.rpm, also laden wir es runter und installieren es:

cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm

Wenn Du diese Warnungen siehst:

warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root

kannst Du sie ignorieren.

Wir haben soeben die Kernelquellen für den 2.6.18 Kernel zusammen mit vielen Fedora Patches und einem Patch für den Kernel 2.6.18.1 installiert. Wenn wir also damit fortfahren würden, einen Kernel aus diesem src.rpm zu bauen, würden wir den Kernel 2.6.18.1 erhalten.

2.3 Den Kernel patchen

Anstelle von Kernel 2.6.18.1 möchte ich Kernel 2.6.18.2 installieren. Das src.rpm, das wir installiert haben, enthielt Kernel 2.6.18 plus einem Patch für Kernel 2.6.18.1. Wir werden diesen Patch nun mit dem Patch für Kernel 2.6.18.2 ersetzen.

cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2

Du könntest außerdem den http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2 Prepatch verwenden, wenn Du Kernel 2.6.19-rc5 haben möchtest. Bitte beachte, dass dies nur für Prepatches funtioniert, d.h. Patches für Kernel, die noch nicht in einer Endversion verfügbar sind, wie zum Beispiel der 2.6.19 Kernel. Du kannst diesen Patch in den 2.6.18 Kernelquellen anbringen, aber nicht in Kernel 2.6.18.1 oder 2.6.18.2, etc. Dies wird auf http://kernel.org/patchtypes/pre.html erklärt:

"Prepatches are the equivalent to alpha releases for Linux; they live in the testing directories in the archives. They should be applied using the patch(1) utility to the source code of the previous full release with a 3-part version number (for example, the 2.6.12-rc4 prepatch should be applied to the 2.6.11 kernel sources, not, for example, 2.6.11.10.)"
Nun müssen wir die kernel-2.6.spec Datei modifizieren, damit sie von unserem neuen Kernel Patch weiß:

cd ~/rpmbuild/SPECS/

vi kernel-2.6.spec

Suche die Zeile

Patch1: patch-2.6.18.1.bz2

und ersetze sie mit dieser:

Patch1: patch-2.6.18.2.bz2

(oder mit dem Patch, den Du zuvor runter geladen hast).

Führe dann dies aus

rpmbuild -bp kernel-2.6.spec

(Wenn Du den Kernel für eine besondere Architektur bauen möchtest, wie zum Beispiel i386, i586, i686, oder x86_64, kannst Du dies wie folgt ausführen:

rpmbuild -bp --target=i686 kernel-2.6.spec

Ich definiere es in diesem Beispiel nicht und erhalte hier einen i386 Kernel. Dein System baut stattdessen vielleicht einen Kernel für eine andere Architektur, wenn Du es nicht definierst, also denke daran, wenn Du weiterhin dieser Anleitung folgst.)

Jetzt kommt der knifflige Part. Das src.rpm hat viele Fedora-spezifische Patches. Einige von ihnen werden mit unserem 2.6.18.2 Patch nicht funktionieren, wenn Du also etwas in der Art in der rpmbuild Ausgabe siehst:

+ echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
+ patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

musst Du kernel-2.6.spec erneut bearbeiten und den Patch #300 auskommentieren:

vi kernel-2.6.spec


[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch [...] #%patch300 -p1 [...]
Führe dann erneut Deinen rpmbuild Befehl aus, z.B.

rpmbuild -bp kernel-2.6.spec

Du musst das so lange wiederholen, bis es keine Fehlermeldungen mehr gibt, dass Patches nicht angewandt werden konnten.

2.4 Eine Kernelbezeichnung festlegen

Jetzt sollten wir eine Bezeichnung festlegen, mit der wir unseren Kernel später identifizieren können. Daher führen wir dies aus:

cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
vi Makefile

Du kannst die Kernel Identifikation in die EXTRAVERSION Zeile setzen. Ich finde, es macht sich auch ganz gut, die Kernel Version mit anzuhängen, also ist etwas in der Art in Ordnung:

EXTRAVERSION = -custom-2.6.18.2


0 Kommentar(e)

Zum Posten von Kommentaren bitte