Eigenen Kernel erstellen

Da ich unter Linux nicht umhin komme, mein Betriebsystem anzupassen, sei es für spezielle Funktionen wie WLAN, sei es für spezielle Hardware wie Notebooks, baue ich mir meine eigene Kernel-Konstallation. Gerade Letztere sind durchweg für Microsofts neuestes Windows konstruiert und vorinstalliert. Desweiteren bin ich als Anwender weniger in der Lage standardisierte Hardware in das Notebook einzubauen, noch kann es bei der Vielfalt der Anbieter für jedes Notebook ein Kernel zum Download angeboten werden.
Also kann man sich unter Linux so helfen, dass man seinen eigenen Betriebskern generiert, abgestimmt auf die Hardware-Komponenten des Gerätes.

Vorbereitungen und Kernel-Download

Ich beschreibe hier die Kompilierung eines Linux-Kernels unter Debian GNU/Linux, weil das Debian-System ganz interessante Tools zur Erzeugung und Verwaltung eines Debian-Kernel-Paketes mitbringt.
Damit wir anfangen können, müssen wir auf unserem System noch ein Wenig zusätzlich installieren. Wir brauchen nämlich die Pakete "kernel-package" und "libncurses5-dev", die wir wie folgt installieren.

# apt-get install libncurses5-dev kernel-package

Damit stelle ich dem System die Kernel-Werkzeuge unter Debian zur Verfügung. Als Nächstes holen wir uns den Vanilla-Kernel bei "The Linux Kernel Archives"herunter, zur Zeit ist der stabile neueste Kernel die Version 2.6.23.14. Das immer 38 MB schwere Tar-File entpacken wir in das Verzeichnis /usr/src/

# cd /usr/src
# bunzip2 -c linux-2.6.23.14.tar.bz2 | tar x

Damit wir mit den Standardkonventionen unter Linux wieder konform sind, setze ich noch einen symbolischen Link "linux" auf das eben erzeugte Verzeichnis linux-2.6.23.14

# ln -s linux-2.6.23.14 linux

So kann man mehrere Kernelquellen auf dem System ablegen und durch Umlegen des symbolischen Links die Quellen festlegen, die man verwenden möchte. Sinnvoll ist das, wenn man mehrere Kernel für dieses Gerät entwickeln will.

Die Konfiguration des Kernels

Soweit haben wir uns die Voraussetzungen zu einer Kernel-Konfiguration geschaffen. Da unser Standard-Kernel uns ein funktionierendes System liefert, bietet es sich an diese Konfiguration in die des neuen Kernels zu übernehmen und dann den Kernel anzupassen. Besonders sinnvoll ist das, wenn man noch  nie einen Kernel kompiliert hat.
Dazu übernehmen wir die Konfigurationsdatei - in meinem Fall /boot/config-2.6.18-2-686 - und kopieren sie zu den Kernel-Sources als .config und wechseln zu den Kernel-Sources.

# cp /boot/config-2.6.18-2-686 /usr/src/linux/.config
# cd /usr/src/linux

Eine weitere Alternative ist die "from scratch"-Konfiguration, bei der man statt des letzten Schrittes eine eigene oder heruntergeladene .config in das Kernel-Sources-Verzeichnis kopiert. Zur eigentlichen Konfiguration des Kernels existieren mehrere Tools:

  • make config - ein textzeilenbasiertes Tool, das die einzelnen Parameter abfragt
  • make xconfig - ein graphisches Frontend, das allerdings einen laufenden Window-Manager voraussetzt
  • make menuconfig - ein menügesteuertes Konsolentool, das ich bevorzuge, weil ich es in einem xterm laufen lassen und gleichzeitig im Internet entsprechende HowTos zu diesem Thema schwelgen kann. Denn die Konfiguration und Kompilierung eines Kernels beeinträchtig das System nicht wie bei Windows eine Installation als besonderer Prozess, sondern ein Arbeiten im System ist auch während der Kompilierung ohne Weiteres möglich.

Wir starten also unsere Konfigurationsroutine mit

# make menuconfig

In dem Tool lassen sich einzelne Parameter festeinkompilieren oder als Module festlegen. Man sollte sich im klaren darüber sein, was man bereits beim Booten oder prinzipiell benötigt, das baut man natürlich fest in den Kernel ein. Funktionen, die verfügbar sein sollten, aber nur bei Bedarf geladen werden sollen, instalieren wir als Module. Vorteil davon ist, dass der Kernel extrem gross wird und wertvolle Speicherressourcen frisst.
Bis hierher unterscheidet sich das Vorgehen von Debian-Kernel zur Standard-Kernelkompilierung noch nicht. Wir machen jetzt im Anschluss daran nicht mehr das vorgeschlagene make dep, sondern nutzen den Befehl make-kpkg, der in dem zuvor installierten Paket kernel-package enthalten ist.

kernel-pkg-Konfigurationsdatei anpassen

Der Name eines Debian GNU/Linux-Kernel-Pakets besteht immer aus dem Basisnamen (hier: kernel-image), der Versionsnummer des Kernels (zum Beispiel 2.6.8, diese wird aus dem Kernel-Makefile ermittelt) und der so genannten Revisionsnummer; Letztere können wir individuell vergeben (über die Option --revision, die wir dem Programm make-kpkg übergeben können). Wir sollten diese Revisionsnummer eindeutig wählen, um zu verhindern, dass ein bereits installierter Kernel überschrieben wird. Weiterhin darf das Zeichen „_“ (Unterstrich) nicht verwendet werden. Alternativ können wir auch die Umgebungsvariable DEBIAN_REVISION auf den gewünschten Wert setzen.

Wir sollten die Revisionsnummer bei jedem neuen Kernel erhöhen; das Debian-Paketsystem kann so automatisch ein Update durchführen.

Auch für das Paket kernel-package gibt es natürlich eine Konfigurationsdatei; diese finden wir wie üblich im Verzeichnis /etc/ als kernel-pkg.conf. Üblicherweise sollten wir dort mindestens unseren Namen sowie die E-Mail-Adresse angeben. Wir können so immer feststellen, dass dieses Paket kein Original-Debian-Paket ist. Wir können, wenn nötig, noch weitere Variablen in dieser Datei benutzen.

Bevor wir mittels kernel-package ein Debian-Paket unseres Kernels erstellen, ist es sinnvoll, sich eine eigene Bezeichnung (z.B. aspire5112 - beschreibt wofür der Kernel sich eignet) zu überlegen, die nebst eigener Revisionsnummer (z.B. beginnend mit 0) dem Kernel-Paket mitgegeben wird, damit der Kernel bei Bedarf wieder sauber aus dem System entfernt werden kann. Bevor man das folgende Kommando eingibt, sollte man sich ausserdem im klaren sein, dass das Kompilieren des Kernels je nach Systemleistung mehrere Stunden dauern kann.
Auf meinem Notebook, ACER Extensa 4101WLMi, mit einem 1,6 GHz Intel Centrino immerhin 38 Minuten, was ich mit einem vorgesetzten time-Befehl abchecken kann.

So weiter geht es! Erzeugen wir unseren Debian-Kernel mit

# make-kpkg linux-image --initrd --revision=aspire5112.0

Mit --initrd erzeuge ich auch noch eine Initial-RAM-Disk, die notwendig ist, um manche Module, Scripte und Programme bereits beim Booten vor dem Mounten des Root-Dateisystem zur Verfügung zu haben. Beispiel dafür sind die Treiber für die Festplatten. Man kann das alles den Kernel machen lassen, ist es jedoch flexibler, eine Initial RAM-Disk zu benutzen. Vor allem weil der Kernel unnötig gross würde. Im Anschluss daran wechseln wir zu dem darüber liegenden /usr/src Debian-Archiv und installieren es mit dpkg.

# cd ..
# dpkg -i linux-image-2.6.23.14_aspire5112.0_i386.deb

Anpassen der menu.lst

Zu guter Letzt müssen wir gegebenenfalls noch die /boot/grub/menu.lst anpassen, obwohl das bereits dpkg miterledigt, aber Kontrolle ist besser als Nachsicht.

title           Debian GNU/Linux, kernel 2.6.23.14
root            (hd0,2)
kernel          /boot/vmlinuz-2.6.23.14 root=/dev/hda3 ro noapic nolapic vga=792 pnpbios=off
initrd          /boot/initrd.img-2.6.23.14
savedefault
boot

Somit können wir unser System rebooten und in den neuen Kernel starten, um zu sehen, ob alles glatt verläuft. Wenn nicht, dann heisst es den Fehler in der .config suchen und neukompilieren.