Wie man einen Kernel kompiliert – SuSE

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

Jede Distribution hat besondere Tools, mit denen sie einen benutzerdefinierten Kernel aus den Quellen kompiliert. Diese Anleitung veranschaulicht, wie man einen Kernel auf SuSE-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 SuSE 10.1 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

Das Ziel dieser Anleitung ist es, ein Kernel rpm Paket zu bauen, das auf Deinem System installiert werden kann, das Du mit anderen teilen kannst und das Du auf anderen SuSE Systemen installieren kannst, was im Vergleich zum „traditionellen Weg“ ein großen Vorteil darstellt, da Du am Ende ein rpm Paket erhältst.

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

Wir müssen ncurses-devel installieren, das vom make menuconfig Befehl benötigt wird, den wir später ausführen werden:

yast -i ncurses-devel

Als Nächstes müssen wir einige Tools modifizieren, die für die Kompilierung unseres Kernels benötigt werden. Wenn wir sie nicht modifizieren, erhalten wir folgende Fehlermeldungen während der Kompilierung:

/usr/lib/rpm/find-requires.ksyms: line 12: /usr/bin/nm: Argument list too long

und werden nicht in der Lage sein, unser Kernel rpm Paket zu installieren.

Bevor wir die Tools modifizieren, erstellen wir Sicherungskopien von ihnen:

cp /usr/lib/rpm/find-provides.ksyms /usr/lib/rpm/find-provides.ksyms_orig
cp /usr/lib/rpm/find-requires.ksyms /usr/lib/rpm/find-requires.ksyms_orig
cp /usr/lib/rpm/find-supplements.ksyms /usr/lib/rpm/find-supplements.ksyms_orig

Dann öffnen wir jedes einzelne Skript und ersetzen kernel-*) is_kernel_package=1 ;; mit kernel*) is_kernel_package=1 ;;:

vi /usr/lib/rpm/find-provides.ksyms

[...]
#kernel-*)           is_kernel_package=1 ;;
kernel*)           is_kernel_package=1 ;;
[...]

vi /usr/lib/rpm/find-requires.ksyms

[...]
#kernel-*)           is_kernel_package=1 ;;
kernel*)           is_kernel_package=1 ;;
[...]

vi /usr/lib/rpm/find-supplements.ksyms

[...]
#kernel-*)          is_kernel_package=1 ;;
kernel*)          is_kernel_package=1 ;;
[...]

3 Die Kernelquellen runter laden

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.2.tar.bz2 (hier findest Du alle 2.6 Kernel: http://www.kernel.org/pub/linux/kernel/v2.6/). Dann kannst Du ihn nach /usr/src wie folgt runter laden:

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

Dann entpacken wir die Kernelquellen und erstellen einen Symlink linux zum Kernel Quellverzeichnis:

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

4 Anbringen von Patches in den Kernelquellen (optional)

Manchmal benötigt man Treiber für Hardware, die vom neuen Kernel standardmäßig nicht unterstützt wird oder man benötigt Unterstützung für Virtualisierungstechniken oder andere 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…).

Gehen wir nun davon aus, dass Du den benötigten Patch (ich nenne ihn in diesem Beispiel 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 dann tatsächlich 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

Außerdem kannst Du Kernel Prepatches in Deinen Kernelquellen abringen. Wenn Du beispielsweise Funktionen benötigst, die nur in Kernel 2.6.19-rc6 verfügbar sind, 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, 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 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 runter laden anstelle von Kernel 2.6.18.2!

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 keine schlechte Idee die Konfiguration Deines derzeitg funktionstüchtigen Kernels als Basis für den neuen Kernel zu verwenden. Dazu kopieren wir die vorhandene Konfiguration nach /usr/src/linux:

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 (die die Konfiguration Deines derzeitig funktionstüchtigen Kernels enthält) als Konfigurationsdatei aus:

Durchblättere dann das Kernel Konfigurationsmenü und treffe Deine Auswahl. Vergewissere Dich, dass Du unter General Setup —> (-default) Local version – append to kernel release eine Zeichenfolge zur Identifizierung der Kernel Version definierst. Die Standard Zeichenfolge ist -default also heißt unser Kernel rpm Paket kernel-2.6.18.2default-1.i386.rpm. Du kannst die Zeichenfolge so lassen wie sie ist oder eine andere definieren, mit der Du den Kernel besser identifizieren kannst (z.B. -custom oder was auch immer Du möchtest).

Ich verwende die Zeichenfolge -default in dieser Anleitung.

Bitte beachte: Nachdem Du kernel-2.6.18.2default-1.i386.rpm installiert und Dich entschlossen hast, einen anderen 2.6.18.2 Kernel zu kompilieren, ist es wichtig, dass Du eine andere Zeichenfolge für die Version verwendest, z.B.  -default1, -default2, etc., sonst kannst Du Deinen neuen Kernel nicht installieren, da sich rpm darüber beschwert, dass  kernel-2.6.18.2default-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:

6 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 eingie Stunden dauern, das hängt von der Kernel Konfiguration und Deiner Prozessorgeschwindigkeit ab.

Das könnte dich auch interessieren …