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.