Wie man einen Kernel kompiliert - Mandriva

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 Mandriva 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 Mandriva Free 2007 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

Ziel dieser Anleitung ist es, ein Kernel rpm Paket zu bauen, das auf dem System installiert werden kann, das Du mit anderen teilen kannst und das Du auf anderen Mandriva Systemen installieren kannst, was im Vergleich zum "traditionellen Weg" einen ziemlichen Vorteil darstellt, da Du am Ende ein rpm Paket erhältst.

2 Die Kernel Quellen runter laden

Zuerst laden wir unseren gewünschten Kernel nach /usr/src. Gehe zu www.kernel.org und wähle den Kernel aus, den Du installieren möchtest, z.B. linux-2.6.18.3.tar.bz2 (hier findest Du alle 2.6 Kernel: http://www.kernel.org/pub/linux/kernel/v2.6/). Dann kannst Du ihn wie folgt nach /usr/src runter laden:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2

Dann entpacken wir die Kernel Quellen und erstellen einen Symlink linux zu dem Kernel Quellverzeichnis:

tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux

3 Anbringen von Patches in den Kernelquellen (optional)

Manchmal benötigt man Treiber für Hardware, die vom neuen Kernel nicht standardmäßig unterstützt wird, oder Du benötigst Unterstützung für Virtualisierungstechniken oder für brandneue Technologie, die es noch nicht zum Kernel geschafft hat. In all diesen Fällen musst Du die Kernelquellen patchen (vorausgesetzt, es ist ein Patch verfügbar...).

Lass uns nun davon ausgehen, dass Du den benötigten Patch (in diesem Beispiel nenne ich ihn patch.bz2) nach /usr/src runter geladen hast. So bringst Du ihn in Deinen Kernelquellen an (Du musst Dich immer noch im /usr/src/linux Verzeichnis befinden):

bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1

Der erste Befehl ist nur ein Test und ändert nichts an Deinen Quellen. Wenn er keine Fehler anzeigt, kannst Du den zweiten Befehl ausführen, der den Patch anbringt. Tu das nicht, wenn der erste Befehl Fehler anzeigt!

Wenn Deine Patches mit gzip (.gz) anstelle von bzip2 (.bz2) komprimiert sind, dann patchst Du Deinen Kernel wie folgt:

gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1

Du kannst außerdem Kernel Prepatches in Deinen Kernelquellen anbringen. Wenn Du beispielsweise eine Funktion brauchst, die nur in Kernel 2.6.19-rc6 verfügbar ist, die vollständigen Quellen für diesen Kernel aber noch nicht veröffentlicht sind. Stattdessen ist ein patch-2.6.19-rc6.bz2 verfügbar. Du kannst diesen Patch in den 2.6.18 Kernelquellen anbringen, aber nicht in Kernel 2.6.18.1 oder 2.6.18.2 oder 2.6.18.3, etc. Dies wird hier erklärt: http://kernel.org/patchtypes/pre.html:

"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.)"
Wenn Du alos einen 2.6.19-rc6 Kernel kompilieren möchtest, musst Du die 2.6.18 Kernelquellen  (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) in Schritt 2 anstelle von Kernel 2.6.18.3 runter laden!

So bringst Du den 2.6.19-rc6 Patch in Kernel 2.6.18 an:

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1

4 Konfiguration des Kernels

Es ist keine schlechte Idee die Konfiguration Deines derzeitig funktionstüchtigen Kernels als Baisis für Deinen neuen Kernel zu verwenden. Dazu kopieren wir die vorhandene Konfiguration nach /usr/src/linux:

make clean && make mrproper
cp /boot/config-`uname -r` ./.config

Dann führen wir dies aus

make menuconfig

was das Kernel Konfigurationsmenü aufruft. Gehe zu Load an Alternate Configuration File und wähle .config (was die Konfiguration Deines derzeitig funktionstüchtigen Kernels enthält) als Konfigurationsdatei:



Durchblättere dann das Kernel Konfigurationsmenü und treffe Deine Auswahl. Pass auf, dass unter General Setup ---> () Local version - append to kernel release eine Zeichenfolge zur Indentifizierung Deiner Kernelversion definierst. Ich verwende -default, somit heißt unser Kernel rpm Paket kernel-2.6.18.3default-1.i386.rpm. Du kannst die Zeichenfolge frei lassen oder eine andere festlegen, die Dir dabei hilft, den Kernel zu identifizieren (z.B. -custom oder was auch immer Du möchtest).

Bitte beachte: Nachdem Du kernel-2.6.18.3default-1.i386.rpm installiert Dich entschlossen hast, ein anderes 2.6.18.3 Kernel rpm Paket zu kompilieren, ist es wichtig, eine andere Zeichenfolge für die Versionsnummer zu verwenden, z.B. -default1, -default2, etc., da Du Deinen neuen Kernel sonst nicht installieren kannst, weil sich rpm beschwert, dass  kernel-2.6.18.3default-1.i386.rpm bereits installiert ist!





Wenn du fertig bist und Exit wählst, beantworte folgende Frage (Do you wish to save your new kernel configuration?) mit Yes:

5 Den Kernel bauen

Um den Kernel zu bauen, führe einfach diesen Befehl aus:

make rpm

Sei nun etwas geduldig, die Kompilierung des Kernels kann einige Stunden dauern, das hängt ganz von der Kernel Konfiguration und Deiner Prozessorgeschwindigkeit ab.

6 Den neuen Kernel installieren

Nach der erfolgreichen Kompilierung des Kernels ist ein src.rpm und rpm Paket erstellt worden. Das src.rpm Paket findest Du im /usr/src/rpm/SRPMS/ Verzeichnis, seine Bezeichnung erfährst Du indem Du Folgendes ausführst

ls -l /usr/src/rpm/SRPMS/

Auf meinem System hieß es kernel-2.6.18.3default-1.src.rpm.

Das rpm Paket findest Du in /usr/src/rpm/RPMS/i386/, /usr/src/rpm/RPMS/i586/, /usr/src/rpm/RPMS/i686/, /usr/src/rpm/RPMS/x86_64/, etc., das hängt von Architektur ab. Auf meinem System war es in /usr/src/rpm/RPMS/i386/. Indem ich Folgendes ausgeführt habe

ls -l /usr/src/rpm/RPMS/i386/

fand ich heraus, dass seine Bezeichnung kernel-2.6.18.3default-1.i386.rpm war.

Nun können wir unser Kernel rpm Paket wie folgt installieren:

cd /usr/src/rpm/RPMS/i386/
rpm -ivh kernel-2.6.18.3default-1.i386.rpm

Nun kannst Du das Kernel rpm Paket sogar zu anderen Mandriva Systemen transferieren und es dort genauso installieren, was bedeutet, dass Du den Kernel dort nicht noch einmal kompilieren musst.

Als Nächstes erstellen wir eine Ramdisk für unseren neuen Kernel, da das System sonst wahrscheinlich unseren neuen Kernel nicht starten wird:

mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default


7 Konfiguration des LILO Boot Loaders

Nun müssen wir unseren LILO Boot Loader konfigurieren, damit unsere neuen Kernel gestartet werden, wenn wir das System neu starten.

Führe dies aus

ls -l /boot

um Angaben über unseren neuen Kernel (beginnt normalerweise mit vmlinuz, z.B. vmlinuz-2.6.18.3-default) und Ramdisk (beginnt normalerweise mit initrd, z.B. initrd-2.6.18.3-default.img) in Erfahrung zu bringen.

Bearbeite dann /etc/lilo.conf. Sieh Dir dort Deine vorhandenen (funktionstüchtigen) Kernelzeilen an und nimm eine von ihnen als Muster für Deine neue Zeile und ersetze den Kernel und die Ramdisk. Füge dann die Zeile über allen anderen Zeilen ein. Vergewissere Dich, dass Du einen eindeutigen Namen für diesen Kernel in der Zeile label definierst (z.B. linux-2.6.18.3-default) und definiere genau den gleichen Namen in der default Zeile, sodass der Kernel gestartet wird, wenn Du das System neu startest.

vi /etc/lilo.conf

Zum Beispiel sieht meine lilo.conf wie folgt aus, bevor ich die neue Zeile hinzugefügt habe:
# File generated by DrakX/drakboot
# WARNING: do not forget to run lilo after modifying this file default="linux" boot=/dev/sda map=/boot/map keytable=/boot/us.klt menu-scheme=wb:bw:wb:bw compact prompt nowarn timeout=100 message=/boot/message image=/boot/vmlinuz label="linux" root=/dev/sda6 initrd=/boot/initrd.img append=" resume=/dev/sda5 splash=silent" vga=788 image=/boot/vmlinuz label="linux-nonfb" root=/dev/sda6 initrd=/boot/initrd.img append=" resume=/dev/sda5" image=/boot/vmlinuz label="failsafe" root=/dev/sda6 initrd=/boot/initrd.img append=" failsafe resume=/dev/sda5"
und so danach (denke daran, was ich über die label und default Zeile gesagt habe):
# File generated by DrakX/drakboot
# WARNING: do not forget to run lilo after modifying this file default="linux-2.6.18.3-default" boot=/dev/sda map=/boot/map keytable=/boot/us.klt menu-scheme=wb:bw:wb:bw compact prompt nowarn timeout=100 message=/boot/message image=/boot/vmlinuz-2.6.18.3-default label="linux-2.6.18.3-default" root=/dev/sda6 initrd=/boot/initrd-2.6.18.3-default.img append=" resume=/dev/sda5 splash=silent" vga=788 image=/boot/vmlinuz label="linux" root=/dev/sda6 initrd=/boot/initrd.img append=" resume=/dev/sda5 splash=silent" vga=788 image=/boot/vmlinuz label="linux-nonfb" root=/dev/sda6 initrd=/boot/initrd.img append=" resume=/dev/sda5" image=/boot/vmlinuz label="failsafe" root=/dev/sda6 initrd=/boot/initrd.img append=" failsafe resume=/dev/sda5"
Führe dann dies aus

lilo

Starte das System jetzt neu:

shutdown -r now

Wenn alles klappt, sollte es mit dem neuen Kernel starten. Du kannst überprüfen, ob das System tatsächlich Deinen neuen verwendet, indem Du dies ausführst

uname -r

Dies sollte etwas in der Art anzeigen

2.6.18.3-default

Wenn das System nicht startet, starte es neu und wenn Du zum LILO Boot Loader Menü gelangst, wähle Deinen alten Kernel aus und starte das System:


Nun kannst Du erneut versuchen, einen funktionstüchtigen Kernel zu kompilieren. Vergiss nicht die Zeile Deines nicht-funktionierenden Kernels aus /etc/lilo.conf und vergewissere Dich, dass Du Folgendes ausführst

lilo

nachdem Du /etc/lilo.conf modifiziert hast.

8 Links