Kernel kompilieren für Anfänger

In meiner (über) 10-jährigen Karriere als Linux-Anfänger kam ich mittlerweile häufiger in die Situation einen Kernel selbst kompilieren zu müssen. Es kam vor, dass Hardware erst ab einer neueren Version, als in den Distributions-Quellen vorhanden, unterstützt wurde, oder dass im Upstream-Kernel bestimmte Patches noch nicht integriert wurden (wie z.B. beim Touchpad für das Acer C720).
Anleitungen gibt es zwar viele, aber häufig bekam ich trotzdem keinen bootbaren Kernel heraus. Das Kompilieren eines eigenen Kernels war für mich ein Buch mit sieben Siegeln. Irgendwann fand ich dann ein paar Befehle, mit deren Hilfe sich ein Kernel für Debian ganz einfach kompilieren lässt.
Natürlich kann man viel auf die eigene Hardware optimieren, wenn man einen Kernel baut, aber dieser Eintrag soll die einfachste Möglichkeit beschreiben einen funktionierenden Kernel auf Basis der Distributionskonfiguration zu erstellen.

Vorbereitungen

Um unter Debian einen Kernel kompilieren zu können installiert man (als root) die folgenden (Meta-)Pakete:

    apt-get install build-essential kernel-package

Dann benötigt man natürlich den Quellcode des Kernels, den man kompilieren möchte z.B.:

    wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.3.tar.xz

Danach entpackt man diesen und wechselt in das Verzeichnis:

    tar -xvf linux-3.17.3.tar.xz
    cd linux-3.17.3
Konfiguration und Kernelbau

Am einfachsten ist es die funktionierende Konfiguration des Distributionskernels als Basis zu nehmen:

    make oldconfig

Ist der zu kompilierende Kernel neuer als der aktuell verwendete erhält man nun einige Fragen zu neuen Kernel-Modulen. Im Normalfall ist es empfehlenswert die Vorgabe per Return zu übernehmen. Sollte man den Kernel wegen eines neuen Moduls bauen, so sollte man dies natürlich auswählen (y zum fest einkompilieren, m um ein nachladbares Modul zu bauen).
Nun existiert im Verzeichnis eine Datei .config. Möchte man bei bestimmten Modulen eine andere Auswahl als im Distributionskernel treffen muss man diese Datei editieren.

Nun ist man schon beim letzten Schritt angelangt, dem Kompilieren des Kernels. Theoretisch soll dieser Schritt auch als normaler Benutzer funktionieren, aber ich musste vor diesem Schritt bisher zu root werden.

    make-kpkg --initrd --revision=20141120 -j4 --append-to-version=-eigenbau kernel_image

Per --revision legt man eine Nummer fest, die an die Kernel-Version angehängt wird um eine Unterscheidung zwischen verschiedenen Builds zu ermöglichen. Man könnte auch einfach von 1 ab hochzählen, wenn man den gleichen Kernel häufiger kompiliert. -j4 bewirkt, dass 4 Prozesse parallel ausgeführt werden. Das beschleunigt den Vorgang, sofern man über genug (virtuelle) Prozessoren verfügt. Auf einem Single-Core würde ich empfehlen diese Option wegzulassen, auf einem Dualcore zu -j2 raten und auf einem aktuellen Prozessor wie i3/i5/i7 stellt -j4 kein Problem dar. Mit --append-to-version= kann man einen String anhängen, der in GRUB angezeigt wird. Somit kann man leicht erkennen, welches der selbstkompilierte Kernel ist. kernel_image ist letzten Endes nur die Anweisung ein Kernelpaket zu generieren. Benötigt man auch die Kernel-Header (z.B. um selbst Kernel-Module zu kompilieren) hängt man noch kernel_headers an.

Mit diesem Workflow baue ich seit Jahren erfolgreich Debianpakete aus den Kernelquellen und weiß mittlerweile gar nicht mehr warum das jemals ein Problem für mich darstellte.

Inhalt

Teilen: E-Mail

Hinterlasse einen Kommentar oder diskutiere im OSBN-Chat.


In den Kommentaren können folgende Formatierungen genutzt werden.