Linux-Kernel maßgeschneidert

Das Make-Target "localmodconfig" des Linux-Kernels spart Zeit und Arbeit, wenn man einen eigenen Kernel kompilieren will.

In Pocket speichern vorlesen Druckansicht 25 Kommentare lesen
Linux-Kernel maßgeschneidert
Lesezeit: 6 Min.
Von
  • Thorsten Leemhuis
Inhaltsverzeichnis

Die universellen Kernel von Linux-Distributionen sind für die meisten Systeme eine gute Wahl. Um neue Treiber auszuprobieren oder Fehlern nachzujagen, muss man manchmal aber doch einen Kernel selbst kompilieren. Die dazu benötigte Konfigurationsdatei komplett selbst zu erstellen ist zeitraubend und fehlerträchtig. Das umgeht man, wenn man von der Kernel-Konfiguration des Distributionskernels ausgeht – bei den werden aber Tausende nicht benötigter Treiber als Module kompiliert, was lange dauert.

Das bei Linux 2.6.32 eingeführte und maßgeblich von Steven Rostedt entwickelte Make-Target localmodconfig weist einen Ausweg aus diesem Dilemma, denn es greift sich die Konfigurationsdatei des Distributionskernels als Basis und deaktiviert die Konfigurationseinträge für Module, die das jeweilige System nicht benötigt; den Rest der Konfigurationsdatei lässt es unverändert.

Ein "make localmodconfig" erzeugt eine gut zum eigenen System passende Kernel-Konfiguration, die deutlich schneller compiliert als die Konfiguration des Distributions-Kernels.

Innerhalb von Sekunden entsteht so eine gut zur eigenen Hardware und der eingesetzten Linux-Distribution passende Konfiguration, bei der der Compiler nur das anfasst, was höchstwahrscheinlich benötigt wird. Ein System mit Intel Core i5-750 kompilierte solch eine Konfiguration in knapp fünfeinhalb Minuten und war damit ungefähr zehn Minuten früher fertig als beim Übersetzen mit der Konfigurationsdatei des Distributionskernels.

Die als Basis verwendete Konfigurationsdatei des Distributionskernels findet Localmodconfig typischerweise automatisch, da alle großen Distributoren sie nach dem Schema

/boot/config-$(uname -r)

ablegen. Soll eine andere Datei als Starthilfe dienen, kopiert man sie als .config in das oberste Verzeichnis der entpackten Kernel-Quellen.

Bevor man das Makefile-Target zur Konfiguration aufruft, sollte man alle per USB, FireWire und Co. angebundenen Geräte anschließen und einschalten. Der aktuell laufende Kernel lädt dadurch die zugehörigen Treiber, sodass Localmodconfig die Konfigurationseinträge für diese Treiber eingeschaltet lässt; alle anderen werden deaktiviert. Daher wird möglicherweise selbst der für USB- Datenträger benötigte USB-Storage-Treiber lahm gelegt, wenn dieser Treiber beim Make-Aufruf nicht geladen ist, weil kein USB-Datenträger angeschlossen war.

Der folgende Befehl erstellt die zugeschnittene Konfiguration:

make localmodconfig 

Ähnlich wie beim "make oldconfig" fragt "make localmodconfig" nicht festgelegte Optionen ab.

Ähnlich wie beim Make-Target oldconfig fragt das Programm dabei alle Optionen ab, die in der als Basis genutzten Konfigurationsdatei nicht festgelegt sind. Wer sich damit nicht aufhalten will, drückt bei jeder Frage einfach die Enter-Taste, um die vorgegebene Antwort zu übernehmen – das ist in fast allen Fällen eine sinnvolle Einstellung. Wer die Parameter der von Localmodconfig angelegten Konfigurationsdatei noch beeinflussen will, der ruft nach dem Make-Aufruf noch eines der regulären Konfigurationsprogramme auf – etwa über die Make-Targets menuconfig oder xconfig.

Die weiteren Schritte zum Übersetzen und Installieren des so konfigurierten Kernels unterscheiden sich nicht von denen, die beim manuellen Konfigurieren eines Linux-Kernels nötig sind. Bei aktuellen Versionen von Fedora und OpenSuse reichen bereits die beiden folgenden Befehle; durch das -j 8 startet Make dabei bis zu acht Compiler-Jobs parallel und nutzt dadurch ebenso viele Prozessorkerne:

make -j 8 bzImage modules
sudo make modules_install install

Einen Teil der Kernel-Installation überlässt das Make-Target install dabei dem Distributions-spezifischen Skript /sbin/installkernel, das bei den beiden erwähnten Distributionen auch gleich eine zum eigenen Kernel passende Initial-Ramdisk (Initrd) und einen Eintrag in der Grub-Konfiguration anlegt. Bei Ubuntu muss man beides manuell erledigen.

Alternativ kann man alle für das eigene Systeme benötigten Treiber auch direkt in den Kernel einbauen, statt sie als Modul zu kompilieren. Auch eine solche Konfiguration können neuere Kernel halbautomatisch erstellen – statt localmodconfig muss man nur das Make-Target localyesconfig verwenden. Auch hier werden alle nicht benötigten Treiber deaktiviert.

Über beide Make-Targets kann man auch Kernel-Konfigurationen erstellen, die zu anderen Systemen passen – etwa weil diese so schwachbrüstig sind, dass sie Stunden zum Kompilieren eines Kernels bräuchten. Dazu schreibt man die Liste der auf dem Zielsystem geladenen Module in eine Datei:

lsmod > module_ziel 

Die Datei überträgt man auf den Rechner, der den Kernel kompilieren soll. Falls der eine andere Kernel-Version nutzt als das Zielsystem, sollte man auch die Datei mit dessen Kernelkonfiguration vom Zielsystem mitbringen und als .config im verzeichnis mit den Kernelquellen ablegen. Anschließend ruft man Localmodconfig wie folgt auf, damit es die Liste der auf dem Zielsystem genutzten Module verwendet:

make LSMOD=${HOME}/module_ziel localmodconfig 

Die zum Kompilieren eingesetzte Distribution muss für die gleiche CPU-Architektur ausgelegt sein; bei Vorhandensein der passenden Cross-Compiler kann man den Kernel für eine andere CPU-Architektur übersetzen, wenn man beim Make-Aufruf ARCH=<target-arch> mit angibt.

Nach dem Kompilieren muss man Kernel-Image und Module auf den Zielrechner übertragen – etwa indem man den kompletten Quellcodebaum überträgt und die Make-Targets modules_install und install erst auf dem Zielrechner anstößt.

Mit Version 2.6.36 hat der Linux-Kernel noch weitere Make-Targets gelernt, die bei der Kernel-Konfiguration hilfreich sein können. Der Aufruf von

make oldnoconfig 

deaktiviert in der Kernel-Konfigurationsdatei alle Optionen, die zuvor nicht gesetzt waren. Eine Liste von Optionen, die in .config nicht gesetzt sind, zeigt das Make-Target listnewconfig an. Über alldefconfig lässt sich eine Konfigurationsdatei anlegen, bei der alle Optionen die Einstellungen erhalten, wie sie die Kconfig-Dateien als Standard vorgeben. Einen Überblick und eine Kurzerklärung zu diesen und anderen Targets liefert Make, wenn man im Verzeichnis der Linux-Quellen make help eingibt. (thl)

Bei dem Text handelt es sich um eine leicht angepasste Variante des in c't 5/2011, Seite 182 publizierten Artikels "Flotter Zuschnitt". (thl)