Wie man einen Kernel kompiliert - auf Debian (Sarge)

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 Debian Sarge 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 Debian Sarge im VMware Server 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 das Erstellen eines Kernel .deb Paketes, das auf dem System installiert werden kann und welches Du mit anderen teilen und auf anderen Debian Sarge Systemen installieren kannst. Im Vergleich zum "traditionellen Weg" - mit dem Du kein .deb Paket erhältst -  ist dies ein großer Vorteil.

2 Installation benötigter Pakete für die Kernel Kompilierung

Zuerst aktualisieren wir unsere Paketdatenbank:

apt-get update

Dann installieren wir alle benötigten Pakete wie folgt:

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential udev

Bitte beachte, dass wir soeben udev installiert haben, das das alte devfs in den neuen Kerneln ersetzt. Der Standard Debian Sarge Kernel (2.6.8) verwendet immer noch devfs, das in neuen Kerneln nicht mehr verfügbar ist.

3 Download der Kernelquellen

Als Nächstes 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 Kernelquellen und erstellen einen Symlink linux zum Kernelquellen-Verzeichnis:

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

4 Anbringen von Patches in den Kernelquellen (optional)

Manchmal benötigst Du Treiber für Hardware, die von dem neuen Kernel nicht standardmäßig unterstützt wird, oder Du benötigst Unterstützung für Virtualisierungstechniken oder eine andere brandneuen Technologie, die beim Kernel noch nicht angekommen ist. In all diesen Fällen musst Du die Kernelquellen patchen (vorausgesetzt es ist ein Patch verfügbar...).

Gehen wir davon aus, Du hast den benötigten Patch (ich nenne ihn in diesem Beispiel patch.bz2) nach /usr/src geladen. So bringst Du ihn in Deinen Kernelquellen an (immer noch im /usr/src/linux Verzeichnis):

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 verändert nichts an Deinen Quellen. Wenn er keine Fehler anzeigt, kannst Du den zweiten Befehl ausführen, der den Patch tatsächlich anbringt. Tu das nicht, wenn der erste Befehl Fehler angezeigt hat!

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 auch Kernel Prepatches in Deinen Kernelquellen anbringen. Wenn Du zum Beispiel eine Funktion brauchst, die nur in Kernel 2.6.19-rc6 verfügbar ist, die gesamten Quellen für diesen Kernel aber noch nicht veröffentlicht wurden. 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 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.)"
Wenn Du also 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 3 statt des Kernels 2.6.18.3 runter laden!

So bringst Du den 2.6.19-rc6 Patch im 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

5 Konfiguration des Kernels

Es ist eine gute Idee, die Kofiguration Deines derzeit funktionstüchtigen Kernels als Basis für Deinen neuen Kernel zu verwenden. Daher 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 Kernelkonfigurationsmenü aufruft. Gehe zu Load an Alternate Configuration File und wähle .config (das die Konfiguration Deines derzeit funktionstüchtigen Kernels enthält) als Konfigurationsdatei aus:



Durchblättere dann das Kernelkonfigurationsmenü und treffe Deine Wahl. Pass auf, dass Du eine Versionsbezeichnung des Kernels unter General Setup ---> () Local version - append to kernel release festlegst. Ich verwende -default1, also heißt unser Kernel .deb Paket linux-2.6.18.3-default1_2.6.18.3-default1_i386.deb. Stelle sicher, dass die Bezeichnung eine Ziffer enthält (z.B. 1, 2, ...), da sonst der Kompilierungsprozess in einem Fehler resultieren wird.

Bitte beachte: Nachdem Du linux-2.6.18.3-default1_2.6.18.3-default1_i386.deb installiert hast und Dich dazu entscheidest, ein anderes 2.6.18.3 Kernel .deb Paket zu kompilieren, ist es wichtig, eine andere Versionsbezeichnung zu verwenden, z.B. -default2, -default3, etc. Anderenfalls kannst Du Deinen neune Kernel nicht installieren, da sich dpkg beschwert, dass linux-2.6.18.3-default1_2.6.18.3-default1_i386.deb bereits installiert ist!





Vergewissere Dich als Nächstes, dass die Fusion MPT Gerätetreiber unter Device Drivers --> Fusion MPT device support aktivierst. Ich weiß nicht, ob das auf allen Plattformen notwendig ist; zumindest ist es das auf meiner (Debian Sarge auf einem VMware Server), da Du sonst diese Fehlermeldung erhältst, wenn Du Deinen neuen Kernel startest:

/bin/cat: /sys/block/sda/dev: No such file or directory

was sich in einer Kernel-Panik äußert.




Durchblättere dann das restliche Kernelkonfigurationsmenü und treffe Deine Wahl. Wenn Du damit fertig bist und Exit wählst, beantworte folgende Frage (Do you wish to save your new kernel configuration?) mit Yes:


0 Kommentar(e)

Zum Posten von Kommentaren bitte