18.2 Einen eigenen Kernel bauen
18.2.1 Vorbemerkungen
Die Anleitung richtet sich an fortgeschrittene Anwender. Dies bedeutet, dass Sie im Normalfall schon über einige Erfahrung verfügen sollten, bevor Sie sich an das Kernelbauen heranwagen. Sie machen hierbei eine Operation »am offenen Herzen« Ihres Systems. Nun, der erfahrene Anwender wird einwerfen, dass man doch trotzdem noch den alten Kernel starten kann, falls der neue nicht funktionieren sollte. Dies stimmt zwar, aber in GRUB den alten Kernel auszuwählen ist auch das geringste Problem bei der ganzen Sache ;-)
Zuerst sollten Sie ein paar grundsätzliche Dinge beachten:
- Behalten Sie stets eine Sicherungskopie Ihres alten und funktionierenden Kernels. Falls etwas schiefgeht, kann man das System immer noch benutzen und muss nicht mit einer Rettungs-CD arbeiten.
- Man sollte, bevor man überhaupt an das Kernelselbstbacken herangeht, herausfinden, welche Hardware im Rechner verbaut ist.
- Lesen Sie bitte die Hilfebeschreibungen zu den Kerneloptionen durch. Wenn Sie bei irgendeiner Option unsicher sind, was Sie tun sollten, dann geben Sie dies auch offen zu und tippen bei der entsprechenden Abfrage Yes.
- Alle Module und Optionen, die man nicht unbedingt benötigt, kann man abwählen. Wer z. B. keinen SCSI-Adapter hat, braucht auch keine Module dafür einzubinden.
- Alles, was Sie nicht oft benötigen werden, sollte als Modul eingebunden werden, z. B. USB-Geräte. Möchten Sie allerdings das System später von einem USB-Stick booten, so kann hier das feste Einbinden in den Kernel notwendig sein.
- Das Dateisystem für die Root-Partition ist fest in den Kernel einzubinden. Alle anderen Dateisysteme, die man sonst noch benötigt, können als Modul eingebunden werden. Das erspart einem das Erstellen einer »Initial Ramdisk«. Die zugehörige Option können Sie dann getrost abwählen.
- Wer eine USB-Tastatur und/oder Maus besitzt, sollte den Treiber für das USB-Subsystem, den Treiber für seinen USB-Baustein und die Treiber für HID-Geräte fest einbinden. Eventuell können Sie dann die Treiber für den PS/2-Anschluss weglassen. Dies hätte den Vorteil, dass ein so getunter Kernel viel weniger Platz benötigt und Hotplug viel weniger Zeit beim Starten braucht.
Wozu das Ganze?
Manchmal benötigt man einen angepassten Kernel mit zusätzlichen Features oder ein bestimmter Treiber soll fest eingebaut werden. In diesen Fällen müssen Sie sich einen eigenen Kernel aus den Quellen kompilieren. Wir werden im Folgenden den typischen Weg zum Kernelbauen unter Ubuntu für den Kernel
2.6.x beschreiten. Hierzu sind mehrere Schritte nötig, die wir nachfolgend einzeln abhaken werden.
Einen Kernel zu bauen ist nicht gerade trivial. Wenn Sie neu bei Linux sind, dann sollten Sie dies nicht in einer produktiven Umgebung tun, es können leicht Daten verloren gehen, wenn irgendetwas schiefgeht.
18.2.2 Vorbereitungen
Kontrollieren Sie bitte zuerst, ob folgende Pakete installiert sind:
- build-essential
- kernel-package
Je nachdem, in welcher Umgebung Sie die Kernelkonfiguration vornehmen möchten, sollten die folgenden Pakete installiert werden:
- libncurses5-dev
-
- für eine ncurses-basierte Oberfläche zur Konfiguration innerhalb einer Konsole.
- libgtk2.0-dev, libglib2.0-dev und libglade2-dev
-
- falls Sie eine GTK- Oberfläche zur Kernelkonfiguration bevorzugen.
- libqt3-mt-dev
-
- sollten KDE-Anwender bevorzugen. Dadurch lässt sich der Kernel in einer Qt-Oberfläche anpassen.
Wenn Ihnen eines der obigen Pakete fehlen sollte, dann installieren Sie dieses bitte per apt-get nach.
Als Nächstes werden die Quellen des Ubuntu-Kernels benötigt. Diese Quellen sind als Paket erhältlich und können mit apt-get oder Synaptic installiert werden. Sie erkennen dieses Paket an der Bezeichnung
»linux-source-x.x.x«. Die beste Basis ist das Quellpaket, dessen Versionsnummer dem derzeit benutzten Kernel entspricht. Sie erhalten die aktuelle Versionsnummer, wenn Sie im Terminal
user$ uname -r 2.6.12–9-k7-smp
eingeben. Was zählt, sind die ersten drei Zahlen, also im obigen Fall
2.6.12. Die Quellen dieses Kernels würden bei der aktuellen Version in jedem Fall installiert, wenn Sie Folgendes in einer Konsole eingeben:
user$ sudo apt-get install linux-source-2.6.12
In den Ubuntu-Quellen sind auch etliche Ubuntu-spezifische Patches enthalten. Es steht Ihnen natürlich frei, sich einen Original-(Vanilla-)Kernel von http://www.kernel.org zu beschaffen.
Optional: Kernelpatches herunterladen
Meist werden Sie den Kernel patchen wollen, um gewisse Funktionalitäten in den Kernel zu integrieren, die im Standardkernel (noch) nicht enthalten sind. In diesem Fall wissen Sie wahrscheinlich, welchen Patch Sie benötigen. Besonders komfortabel ist es natürlich, wenn der benötigte Patch in einem Repository zu bekommen ist. Einige Patches finden sich beispielsweise im Universe-Repository. Achten Sie hierbei wie bei allen Patches auf die richtige Versionsnummer. Für jeden Kernel gibt es einen passenden Patch.
Kernelquellen auspacken
Die Kernelquellen befinden sich nach der Installation als tar.bz2-Archiv im Verzeichnis /usr/src. Mit
user$ cd /usr/src user$ sudo tar -xjf linux-source-<Versionsnummer>
und
user$ cd linux-source-<Versionsnummer>
entpacken Sie die Kernelquellen und wechseln ins Quellverzeichnis.
Optional: Kernel patchen
Patches, die über das Paketmanagement installiert wurden, befinden sich in einem Unterverzeichnis von /usr/src/kernel-patches/diffs. Sie liegen üblicherweise als gz- oder bz2-komprimierte Diff-Datei vor (*.diff. gz oder *.diff.bz2). Sie lassen sich mit folgendem Befehl einbauen:
user$ gunzip -c /usr/src/kernel-patches/diffs/\ <Patchverzeichnis>/<Patchdatei> | \ sudo patch -p1
Bei bz2-Kompression ist gunzip durch bunzip2 zu ersetzen.
18.2.3 Kernel konfigurieren
Die Konfiguration des Kernels wird im aktuellen Kernelquellverzeichnis in der Datei .config gespeichert. Es ist stets ratsam, von der aktuellen Kernelkonfiguration auszugehen. Diese findet man im Verzeichnis /boot/config. Sie wird folgendermaßen kopiert:
user$ sudo cp /boot/config-<Kernelversion> .config
Alternativ kann die Konfiguration des laufenden Kernels meist auch aus einer komprimierten Datei in /proc gelesen werden. Dies ist im Standard-Kernel von Ubuntu nicht aktiviert, bei einem selbst kompilierten kann man dieses Feature aber aktivieren:
user$ sudo zcat /proc/config.gz > .config
Auf der Basis dieser Konfiguration kann man nun eigene Einstellungen vornehmen. Je nach den am Anfang installierten Bibliotheken geht das z. B. für die GTK-Umgebung mit
user$ sudo make gconfig
Die entsprechenden Aufrufe für die Konsole bzw. die QT-Oberfläche lauten:
user$ sudo make menuconfig
bzw.
user$ sudo make xconfig
Wer eine minimale Standardkonfiguration erzeugen möchte, der wählt einfach
user$ sudo make defconfig
Beim Wechsel auf eine neue Kernelversion kann die Datei .config aus dem alten Kernelverzeichnis in das neue kopiert werden. Nach dem Wechsel in dieses neue Verzeichnis kann
user$ sudo make oldconfig
aufgerufen werden, wobei dann nur die Einstellungen für die neuen Kernel-Features abgefragt werden.
Die Konfiguration des Kernels innerhalb der graphischen Oberfläche (Abbildung 18.2) erfolgt nun durch einfaches (xconfig) bzw. doppeltes (gconfig) Anklicken der entsprechenden Optionen. Nach dem Fertigstellen der Konfiguration vergessen Sie bitte nicht, die Änderungen zu sichern (Save in Abbildung 18.2).
Abbildung 18.2 Konfiguration des Kernels mit gconfig
18.2.4 Kernel kompilieren
Nach Abschluss der obigen Konfiguration muss der Kernel kompiliert werden. Mit dem folgenden Befehl erzeugen Sie auch gleich einfach installierbare .deb-Pakete für das Kernelimage, die Kernelheader, das Kernel-Doc und die Kernel-Source:
user$ sudo make-kpkg ---initrd \ ---revision <meineVersion> binary
Der Parameter binary sorgt für die Erstellung der genannten
*.deb-Pakete. Wenn Sie nur ein Kernelimage-Paket benötigen, können Sie binary durch kernel_image ersetzen. Bei Angabe
des optionalen Parameters revision ist darauf zu achten, dass die Bezeichnung sich nicht mit einem im System vorhandenen Kernel überschneidet. Weitere Möglichkeiten sind in der Manpage von make-kpkg aufgeführt.
Sollte es während des Laufs von make-kpkg zu einer Fehlermeldung kommen, so können Sie versuchen, den Kernel in folgenden einzelnen Schritten zu übersetzen, um den Fehler genauer zu lokalisieren:
user$ sudo make clean bzImage user$ sudo make-kpkg --initrd kernel_image user$ sudo make user$ sudo make-kpkg --initrd binary
Einige Anmerkungen
Eine Initial Ramdisk ist nicht notwendig, wenn man seine Hardware kennt (und das sollte man, wenn man seinen eigenen Kernel kompiliert!). In diesem Falle deaktiviert man in der Konfigurationsphase die Unterstützung für initrd und bindet die Treiber für das Root-Laufwerk (das sind meist die ATAPI/IDE-Treiber für die Festplatte) fest und nicht als Modul ein. Hilfreich ist auch das feste Einbinden von USB, wenn man eine USB-Tastatur und/oder -Maus benutzt. Möchte man eine externe Firewire-Festplatte schon beim Booten einbinden, so müssen auch die Firewire-Treiber fest in den Kernel kompiliert werden. Danach startet man das Kompilieren mit
user$ sudo make-kpkg binary
Nach einer Änderung der Konfiguration kann es nötig sein, vor einem erneuten make-kpkg einmal sudo make auszuführen. Wird der Kernel nochmals gepatcht, so sollten bereits übersetzte Teile aufgeräumt werden. Nur dann wird beim nächsten Mal alles neu kompiliert:
user$ sudo make clean
Wurde der Kernel mittels make-kpkg kompiliert, so ist es auch empfehlenswert, alle Teile mit
user$ sudo make-kpkg clean
aufzuräumen. Dadurch werden zum Beispiel auch die Stamp-Dateien gelöscht.
18.2.5 Kernel installieren und booten
Das erzeugte Kernelpaket können Sie nun ganz einfach mit dem Befehl
user$ sudo dpkg -i ../kernel-image-<neueVersion>.deb
installieren. Nach einem Neustart des Systems lässt sich der neue Kernel im Bootmenü auswählen.
Sollte sich der neue Kernel nach einer Erprobungsphase bewährt haben, können Sie den alten Kernel mit folgendem Befehl aus dem System entfernen:
user$ sudo dpkg -r kernel-image-<alteVersion>
Für den Anfang empfiehlt es sich jedoch, den alten Kernel parallel zum neuen beizubehalten, um sich nicht einer wichtigen Rettungsmöglichkeit zu berauben.