Wie man einen Kernel kompiliert – Ubuntu

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

Jede Distribution hat bestimmte Tools für die Kompilierung eines benutzerdefinierten Kernels aus den Quellen. Diese Anleitung veranschaulicht, wie man einen Kernel auf Ubuntu Systemem kompiliert. Sie beschreibt, wie man einen benutzerdefinierten Kernel mit den neusten unmodifizierten Quellen von www.kernel.org (Vanilla Kernel) kompiliert, damit Du nicht an die Kernel, die von Deiner Distribution bereitgestellt werden, gebunden bist. Es wird weiterhin gezeigt, wie man die Kernel Quellen patcht, falls Du Funktionen benötigst, die sich nicht darin befinden.

Ich habe dies auf einem Ubuntu 6.10 Server („Edgy Eft“) und Ubuntu 6.06 Desktop („Dapper Drake“) 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

Ich ziehe es vor, alle Schritt als root Benutzer durchzuführen. Wenn Du also noch kein Root Login eingerichtet hast, solltest Du das jetzt tun:

sudo passwd root

Melde Dich danach als Root an:

su

Wenn Du lieber als normaler Benutzer anstelle von Root arbeiten möchtest, dann denke daran, sudo vor alle Befehle, die in dieser Anleitung verwendet werden, zu setzen. Wenn ich also Folgendes ausführe

apt-get update

solltest Du stattdessen dies ausführen, etc.

sudo apt-get update

1.1 /bin/sh auf Ubuntu 6.10 („Edgy Eft“)

Auf Ubuntu 6.10 ist /bin/sh standardmäßig ein Symlink zu /bin/dash. /bin/dash scheint Probleme zu verursachen, wenn man Software aus den Quellen kompiliert, zumindest hatte ich diesen Eindruck. Daher sorge ich dafür, dass /bin/sh stattdessen ein Symlink zu /bin/bash wird.

Wenn Du Dich auf Ubuntu 6.10 befindest, solltest Du dies jetzt tun:

rm -f /bin/sh
ln -s /bin/bash /bin/sh

2 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

3 Die Kernel Quellen 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.1.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.1.tar.bz2

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

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

4 Anbringen von Patches in den Kernel Quellen (optional)

Manchmal benötigt man für die Hardware, die vom neuen Kernel nicht standardmäßig unterstützt wird, Treiber. Außerdem kann es sein, dass man Unterstützung für Virtualisierungstechniken oder einige andere brandneue Technologien benötigt, die es bis jetzt noch nicht bis zum Kernel geschafft hat. In all diesen Fällen musst Du die Kernel Quellen patchen (vorausgesetzt es ist ein Patch verfügbar…).

Lass uns nun davon ausgehen, Du hast den benötigten Patch (in diesem Beispiel nenne ich ihn patch.bz2) nach /usr/src runter geladen. So bringst Du ihn in Deinen Kernel Quellen 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 lediglich ein Test und verändert nichts in Deinen Quellen. Wenn er keine Fehler anzeigt, kannst Du den zweiten Befehl ausführen, der den Patch dann anbringt. Führe den zweiten Befehl nicht aus, wenn der erste Fehler anzeigt!

Du kannst außerdem Kernel Prepatches in Deinen Kernel Quellen anbringen. Wenn Du beispielsweise eine Funktion benötigst, die nur in Kernel 2.6.19-rc4 verfügbar ist, die vollständigen Quellen für diesen Kernel aber noch nicht veröffentlicht wurden. Stattdessen ist ein patch-2.6.19-rc4.bz2 verfügbar. Du kannst diesen Patch in den 2.6.18 Kernel Quellen anbringen, aber nicht in den Kerneln 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-rc4 Kernel kompilieren möchtest, musst Du die 2.6.18 Kernel Quellen (http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2) in Schritt 3 anstatt Kernel 2.6.18.1 runter laden!

So bringst Du den 2.6.19-rc4 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-rc4.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1 –dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc4.bz2 | patch -p1

5 Den Kernel konfigurieren

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

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 derzeit funktionstüchtigen Kernels enthält) als Konfigurationsdatei:

Überfliege dann das Kernel Konfigurationsmenü und treffe Deine Auswahl. Wenn Du damit fertig bist und Exit gewählt hast, beantworte folgende Frage (Do you wish to save your new kernel configuration?) mit Yes:

6 Den Kernel bauen

Führe um den Kernel zu bauen 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 irgendeine Zeichenfolge schreiben, mit der Du den Kernel identifizieren kannst, allerdings muss sie mit einem Minus (-) beginnen und darf keine Leerzeichen enthalten.

Sei nun etwas geduldig, die Kompilierung des Kernels kann einige Stunden dauern, je nach Kernel Konfiguration und Geschwindigkeit Deines Prozessors.

7 Installation des neuen Kernels

Nachdem der Kernel erfolgreich gebaut 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.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (das den eigentlichen Kernel enthält) und linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb (das Dateien enthält, die benötigt werden, wenn Du später weitere Kernel Module kompilieren möchtest). Ich installiere diese wie folgt:

dpkg -i linux-image-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb
dpkg -i linux-headers-2.6.18.1-custom_2.6.18.1-custom-10.00.Custom_i386.deb

(Nun kannst Du die zwei .deb Dateien sogar zu anderen Ubuntu Systemen transferieren und sie genauso installieren, was bedeutet, dass Du den Kernel dort nicht noch einmal kompilieren musst.)

Das war’s. Du kannst nun /boot/grub/menu.lst überprüfen. Dort solltest Du zwei Zeilen für Deinen neuen Kernel finden:

vi /boot/grub/menu.lst

Die Zeilen, die auf meinem Testsystem hinzugefügt wurden, sehen wie folgt aus:

title           Ubuntu, kernel 2.6.18.1-custom
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro quiet splash
initrd          /boot/initrd.img-2.6.18.1-custom
savedefault
boot

title           Ubuntu, kernel 2.6.18.1-custom (recovery mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18.1-custom root=/dev/sda1 ro single
initrd          /boot/initrd.img-2.6.18.1-custom
boot

Starte nun das System neu:

shutdown -r now

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

uname -r

Dies sollte etwas in der Art anzeigen

2.6.18.1-custom

Wenn das System nicht startet, starte es neu. Wenn Du dies siehst:

drücke ESC um ins GRUB Menü zu gelangen:

Wähle Deinen alten Kernel aus und starte das System. Nun kannst Du erneut versuchen, einen funktionstüchtigen Kernel zu kompilieren. Vergiss nicht, die zwei Zeilen des nicht-funktionierenden Kernels aus der /boot/grub/menu.lst zu entfernen.

8 Links

Das könnte dich auch interessieren …