Wie man einen Kernel kompiliert - Debian Etch

Version 1.0
Author: Falko Timme


Jede Distribution hat ihre spezifischen Tools, mit denen ein benutzerdefinierter Kernel aus den Quellen erstellt werden kann. Diese Anleitung veranschaulicht, wie man einen Kernel auf einem Debian Etch System kompiliert. Sie beschreibt, wie man einen benutzerdefinierten Kernel unter Verwendung der neusten unmodifizierten Kernel-Quellen von www.kernel.org (Vanilla Kernel) erstellt, so dass Du nicht von den Kerneln Deiner Distribution abhängig bist. Weiterhin wird gezeigt, wie man die Kernel-Quellen patcht, falls Du Funktionen benötigst, die nicht darin enthalten sind.

Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

Im Folgenden werde ich zwei Varianten beschreiben, wie man einen neuen Kernel kompilieren kann. Bei der ersten Variante hast Du ein Kernel .deb Paket, das auf dem System installiert und mit anderen geteilt werden kann und das Du auf anderen Debian Etch Systemen installieren kannst.

Mit der zweiten Variante kompilierst Du einen Kernel auf "traditionelle" Art und Weise. Das funktioniert auf allen Linux Distributionen, jedoch endest Du nicht mit einem Kernel.deb Paket.

2 Ein Kernel .deb Paket erstellen

Dieses Kapitel zeigt, wie man einen Kernel erstellt und am Ende ein .deb Paket erhält, das man installieren und mit anderen teilen kann.

2.1 Installation benötigter Pakete für die Kompilierung des Kernels

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


2.2 Die Kernel-Quellen runter laden

Als Nächstes laden wir unseren 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.21.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.21.3.tar.bz2

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

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

2.3 Anwenden von Patches auf die Kernel-Quellen (optional)

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

Gehen wir nun davon aus, dass Du den benötigten Patch zu /usr/src geladen hast (ich nenne ihn in diesem Beispiel patch.bz2). So wendest Du ihn auf Deine Kernel-Quellen 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, er wirkt sich nicht auf Deine Quellen aus. Wenn keine Fehler angezeigt werden, kannst Du den zweiten Befehl ausführen, der den Patch anwendet. Tu das nicht, wenn der erste Befehl Fehler anzeigt!

Weiterhin kannst Du Kernel Prepatches auf Deine Kernel-Quellen anwenden. Wenn Du zum Beispiel eine Funktion benötigst, die nur in Kernel 2.6.22-rc3 enthalten ist, die gesamten Quellen für diesen Kernel aber noch nicht veröffentlicht wurden. Stattdessen ist ein patch-2.6.22-rc3.bz2 verfügbar. Du kannst diesen Patch auf die 2.6.21 Kernel-Quellen anwenden, aber nicht auf Kernel 2.6.21.1 oder 2.6.21.2, etc. Dies wird hier erklärt: http://kernel.org/patchtypes/pre.html:

Prepatches sind das Equivalent zu alpha Veröffentlichungen für Linux; sie befinden sich in den Test-Verzeichnissen der Archive. Sie sollten mittels des patch(1) Programmes auf den Source Code der vorherigen Vollversion mit einer 3-stelligen Versionsnummer angewendet werden (zum Beispiel sollte der 2.6.12-rc4 Prepatch auf die 2.6.11 Kernel-Quellen angewendet werden und nicht auf 2.6.11.10.)
Wenn Du also einen 2.6.22-rc3 Kernel kompilieren möchtest, musst Du die 2.6.21 Kernel-Quellen (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2) anstelle des Kernels 2.6.21.3 in Schritt 3 runter laden!

So wendest Du den 2.6.22-rc3 Patch auf Kernel 2.6.21 an:

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

2.4 Konfiguration des Kernels

Es macht sich immer gut die Konfiguration Deines derzeit funktionsfähigen 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 Folgendes aus

make menuconfig

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



Durchsuche das Kernel Konfigurationsmenü und treffe eine Auswahl. Wenn dies abgeschlossen ist und Du Exit gewählt hast, beantworte folgende Frage (Do you wish to save your new kernel configuration?) mit Yes:

2.5 Den Kernel kompilieren

Um den Kernel zu erstellen, führe diese beiden Befehle aus:

make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

Nach --append-to-version= kannst Du jede Wortfolge eingeben, die Dir hilft, den Kernel zu identifizieren, sie muss allerdings mit einem Minus (-) beginnen und darf kein Leerzeichen enthalten.

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

2.6 Installation des neuen Kernels

Nachdem der Kernel erfolgreich erstellt wurde, findest Du zwei .deb Pakete im /usr/src Verzeichnis.

cd /usr/src
ls -l

Auf meinem Testsystem heißen sie linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (dies enthält den eigentlichen Kernel) und linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb (enthält Dateien, die Du benötigst, falls Du später weitere Kernel Module erstellen möchtest). Ich installiere sie wie folgt:

dpkg -i linux-image-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.21.3-custom_2.6.21.3-custom-10.00.Custom_i386.deb

(Nun kannst Du sogar die zwei .deb Dateien zu anderen Debian Etch Systemen transferieren und sie auf genau die gleiche Art und Weise installieren, was bedeutet, dass Du dort den Kernel nicht noch einmal kompilieren musst.)

Das war's. Die GRUB Bootloader Konfigurationsdatei /boot/grub/menu.lst wurde automatisch modifiziert und eine Ramdisk für den neuen Kernen wurde in /boot erstellt.

Starte nun das System neu:

shutdown -r now

Wähle bei der Startaufforderung Deinen neuen Kernel aus (sollte standardmäßig ausgewählt sein):


Wenn alles gut klappt, dann sollte der Server mit dem neuen Kernel starten. Indem Du Folgendes ausführst, kannst Du überprüfen, ob wirklich Dein neuer Kernel verwendet wird

uname -r

Dies sollte etwas in der Art anzeigen

2.6.21.3-custom

Wenn das System nicht startet, starte es neu und wähle bei der Startaufforderung Deinen alten Kernel aus. Du kannst nun erneut versuchen, einen funktionsfähigen Kernel zu kompilieren. Vergiss nicht die Zeile(n) des nicht-funktionsfähgien Kernels aus /boot/grub/menu.lst zu entfernen.

0 Kommentar(e)

Zum Posten von Kommentaren bitte