Selbstgebacken: Kernel kompilieren nach Rezept
Das Erstellen eines Kernels aus den Quellen ist kein Voodoo. Hier wird gezeigt, welche Möglichkeiten es aktuell gibt.
Moderne Linux-Distributionen bringen alles mit: Vom Systemkern über die Anwendungen bis hin zu den bunten Rüschen der graphischen Oberfläche. Für viele Nutzer gehört das Anpassen des Desktops zur Pflicht, das manuelle Installieren von Programmen - meist in einer aktuelleren Version - ist dann die Kür. Den Kernel jedoch lassen viele in Ruhe und vertrauen hier lieber auf die Aktualisierungen des Distributors.
Dabei ist das Erstellen eines Kernels aus den Quellen kein großes Voodoo. In den Grundzügen läuft es wie bei allen anderen Anwendungen auch in drei Schritten:
- Konfigurieren
- Kompilieren
- Installieren
Zur Pflege gehört dann natürlich auch das Aktualisieren des Kernels, das ebenfalls in diesem Artikel behandelt wird.
Ein paar Dinge vorweg
An dieser Stelle ist bei Texten zur Kernel-Kompilierung meist ein Warnhinweis zu finden, der allzu Mutige vor dem Nachmachen warnt. Doch dieser Beitrag richtet sich explizit an jene Anwender, die bislang keine Berührung mit gcc und make hatten. Linux-Nutzer, die gerne den Weg in die tieferen Ebenen ihres Systems finden möchten, sollen hier zum Ausprobieren ermutigt werden. In der Regel richten auch vermurkste Kernel-Eigenkompilate keine dauerhaften Schäden an, sodass ein Neustart mit einer anderen, funktionierenden Version einen zum laufenden System zurückführt.
Dem mündigen Leser seien jedoch drei Hinweise mitgegeben:
- Kernel-Versionen, die ein »-rc« in der Versionsbezeichnung tragen, sind Entwickler-Kernel und ausschließlich zum Testen und Fehlersuchen gedacht.
- Ein Eigenkompilat muss nicht immer besser laufen als der Kernel von der Stange. Die Distributoren wissen in der Regel, was sie tun!
- Bei der ganzen Kompiliererei werden externe Treiber nicht berücksichtigt. Das betrifft proprietäre Treiber wie z.B. für VirtualBox, fglrx (AMD/ATI-Grafik) oder nvidia (Nvidia-Grafik). Diese müssen nach dem Kernel-Bau gegebenenfalls nach den jeweiligen Vorgaben neu erstellt und konfiguriert werden.
Als Beispiel findet die zur Fertigstellung des Beitrags aktuelle Kernel-Version 3.3.2 und deren Nachfolger Verwendung, bei anderen Kernel-Versionen ändern sich dann Bezeichnungen, URLs und Befehle eben entsprechend der jeweiligen Versionsnummer. Um mit dieser Anleitung den Einstieg in die Kernel-Kompilierung zu finden, wird zuerst einmal eine virtuelle Umgebung empfohlen; Ubuntu in einer VirtualBox käme dem in diesem Artikel verwendeten Aufbau am nächsten. Des Weiteren wird hier ausschließlich auf der Text-Konsole gearbeitet, was allerdings eher den Vorlieben des Autors geschuldet ist und der Tatsache, dass sich Konsolenbefehle leichter zu Papier bringen lassen als Mausklicks auf der grafischen Oberfläche.
Beim Bau eines Kernels sollte darauf geachtet werden, dass genug Platz auf dem Datenträger vorhanden ist. Das Kompilieren bläst das genutzte Verzeichnis gerne mal von einem ursprünglich 60 MB großen Archiv über 450 MB für das entpackte Archiv bis auf mehrere Gigabyte nach dem ganzen Vorgang auf. Dazu muss noch der Platz gerechnet werden, den der später installierte Kernel (ca. 120 MB) und die fertigen Module (ca. 2 GB in der Standardkonfiguration von Linux 3.3) belegen. Eine Kontrolle im Vorfeld, zum Beispiel mittels df -h
, wieviel Platz auf /boot (mindestens 120 MB), /lib (mindestens 2 GB) und /home (mindestens 8 GB) frei sind, ist im Zweifel also angeraten.
Vorbereiten
Zuerst müssen natürlich einige Vorbereitungen getroffen werden. Es wird ein Verzeichnis zum Arbeiten benötigt und natürlich der Quellcode des Kernels. In diesem Beispiel wird ein Verzeichnis direkt im Home-Verzeichnis des Anwenders verwendet:
$ cd ~ $ mkdir Kernel $ cd Kernel
Die Kernel-Quellen können bequem als vollständiges Archiv von kernel.org heruntergeladen werden. Am kleinsten sind die mit xz
komprimierten Dateien, sie erfordern jedoch die XZ-Utils, die je nach Distribution eventuell nachinstalliert werden müssen.
$ wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.3.2.tar.xz $ tar xf linux-3.3.2.tar.xz
tar
entpackt das Archiv in das Unterverzeichnis linux-3.3.2, in dem die weitere Arbeit erfolgen wird.
Konfigurieren
Die Quellen liegen nun vor, also kann die Konfiguration des Kernels erfolgen. Am einfachsten ist es, die bereits für den aktuell laufenden Kernel vorhandene Konfiguration als Ausgangspunkt zu nutzen. Diese befindet sich im Verzeichnis /boot und wird zu den Kernelquellen kopiert. Das Kompilierwerkzeug make
erwartet die Konfiguration in der Datei .config.
$ cd linux-3.3.2 $ cp /boot/config-`uname -r` .config
$ make oldconfig
Ist man des minutenlangen Betätigens der »Enter«-Taste überdrüssig, so kann man auch den Befehl yes
zu Hilfe nehmen. Dieser simuliert das Drücken der »Enter«-Taste, bis make oldconfig
durch alle Optionen gelaufen ist:
$ yes "" | make oldconfig
In diesem Fall möchte man die Konfiguration vielleicht anschließend kontrollieren und gegebenenfalls anpassen. Zumindest ist es interessant, mal einen Blick auf die verschiedenen Optionen und Funktionen zu werfen:
$ make menuconfig
Für die Darstellung des Menüs wird das Paket »ncurses-devel« benötigt.
Nun ist die Konfiguration vollständig und der eigentliche Kernelbau kann beginnen.