Die Konfiguration
Die Konfiguration fängt, wie bereits beschrieben, mit dem Großreinemachen an – Meister Proper lässt grüßen:
$ make mrproper
Wer tatsächlich Kernel-Code entwickelt, verzichtet bei jedem weiteren Durchlauf auf das Aufräumen, denn die Intelligenz der Makefiles stellt sicher, dass sie nur geänderte Dateien neu übersetzen – das verkürzt den Prozess erheblich.
Nach dem Aufräumen erstellen Sie die Datei src/linux/.config, die alle Konfigurationseinstellungen für den Kernel enthält. Sie besteht aus sehr vielen Zeilen, manuell bekommt das niemand hin. Als Vorlage dient deshalb die .config aus einem aktuell laufenden Raspbian-System. Nach der Anmeldung am Pi erzeugen Sie diese Vorlage mit folgendem Befehl:
$ zcat /proc/config.gz > .config
Nun übertragen Sie die so erstellte Datei auf das Build-System ins Verzeichnis src/linux/. Da die Kernel-Quellen wahrscheinlich eine neuere Version enthalten als der laufende Pi-Kernel, müssen Sie noch einige wenige Anpassungen vornehmen. Am einfachsten klappt das über das folgende Kommando:
$ make ARCH=arm CROSS_COMPILE=$CCPREFIX olddefconfig
Mit den Parametern ARCH= und CROSS_COMPILE= teilen Sie beim Make-Aufruf dem Build-System die Zielarchitektur und das Cross-Compiler-Präfix mit. Das sogenannte Target olddefconfig verwendet dabei die vorhandene .config-Datei als Basis. Bei neuen Konfigurationsparametern setzt der Befehl die Vorgabewerte ein. Alternativ verwenden Sie das Target silentoldconfig: Damit erscheint bei neuen Konfigurationsparametern eine Nachfrage. Wenn Sie das Target olddefconfig durch menuconfig ersetzen, erscheint ein Ncurses-basiertes Menü (Abbildung 2).

Abbildung 2: Die auf Ncurses basierende Kernel-Konfigurationsoberfläche erleichtert es Ihnen, die richtigen Komponenten in den Quellen zu finden.
Ist gerade kein Raspbian-System zur Hand, gibt es auch eine zweite Möglichkeit für das Erstellen einer .config-Vorlage. Dazu rufen Sie den folgenden Befehl auf:
$ make ARCH=arm bcmrpi_defconfig
Der so erstellte Kernel unterscheidet sich von dem per RasPi-Vorlage erstellten, die genauen Auswirkungen muss jeder selbst überprüfen. Bei umfassenden Änderungen und Optimierungen spielen die Unterschiede in der Vorlage allerdings nur eine kleine Rolle.
Der eigentliche Build
Nach den Vorarbeiten, die zumindest im Fall des Targets olddefconfig nur wenige Minuten dauern, geht es mit dem eigentlichen Kernel-Bau weiter (Listing 7, erste Zeile). Die Laufzeit hängt stark vom Entwicklungssystem ab. Auf Multiprozessorsystemen geben Sie dem make noch die Option -j 2 mit, wobei Sie die 2 durch die Anzahl der verfügbaren Prozessoren ersetzen. Das parallelisiert den Ablauf.
Auf einem modernen Quad-Core-System dauerte das Kompilieren etwa 5 Minuten, in einer virtualisierten Maschine mit einer 2,5-GHz-Single-Core-CPU rund 75 Minuten. Der etwa 5,8 MByte große Kernel landet in der Datei arch/arm/boot/Image. Die kompilierten Module gilt es noch zusammenzusammeln (Listing 7, zweite und dritte Zeile). Sie umfassen zusammen etwa 36 MByte.
Listing 7
$ make ARCH=arm CROSS_COMPILE=$CCPREFIX $ mkdir /tmp/modules $ make ARCH=arm CROSS_COMPILE=$CCPREFIX INSTALL_MOD_PATH=/tmp/modules modules_install
Interessanterweise ergeben sich in dieser Konstellation deutlich mehr Module als bei einer Standardinstallation von Raspbian – ein Hinweis darauf, dass die Kernel-Konfiguration dieser Distribution noch Optimierungspotenzial besitzt. Die Maintainer von Raspbian packen also nicht alle erzeugten Module in ihre Distribution.
Installation und Neustart
Nach dem erfolgreichen Kernel-Build kommt die Stunde der Wahrheit. Zuerst übertragen Sie den Kernel und die Module auf den laufenden RasPi. Dazu gibt es zwar mehrere Möglichkeiten, am einfachsten verwenden Sie aber das Kommando Rsync. Dazu vergeben Sie zunächst ein Root-Passwort (Listing 8, Zeile 2 und 3). Anschließend übertragen Sie vom Entwicklungssystem den Kernel und die Module mit den zwei Befehlen (Zeile 5 und 6 aus Listing 8).
Listing 8
[... auf dem RasPi ...] $ sudo su - # passwd [... auf dem PC ...] $ rsync arch/arm/boot/Image root@raspi:/boot/kernel_3.10.37+.img $ rsync -avz /tmp/modules/ root@raspi:/





