Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Last edited 11/10/2006
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
- Wie man einen Kernel kompiliert - auf Fedora - Seite 1
- Wie man einen Kernel kompiliert - auf Fedora - Seite 2
- Wie man einen Kernel kompiliert - auf Fedora - Seite 3

