Kernelbau

Aus mborm wiki
Zur Navigation springen Zur Suche springen

Hier wird erklärt, wie man sich einen Linux-Kernel selbst kompilieren kann. Die korrekte Kompilierung des Kernels kann nur mit einem gcc der Version < 4.9 Version funktionieren. Auch die offiziellen Linux-Kernel werden mit Version < 4.9 kompiliert (siehe Torvalds "Ok, so I’m looking at the code generation and your compiler is pure and utter shit.")


Einrichten der Entwicklungsumgebung

Dieser Schritt erfolgt nur einmal zu Anfang des Kernel-Baus. Kompiliert wird im Terminal, was auch per SSH möglich ist.

Folgende Pakete müssen, mit Hilfe dieses Befehls, geholt und installiert werden: apt-get install kernel-package libncurses5-dev fakeroot

Eventuell sind weitere Pakete nötig. apt-get zeigt das an.

Laden des Kernel-Codes

Es sollte immer der aktuelleste Kernel-Code des zur Zeit laufenden Kernels verwendet werden, es sei denn es soll ein alter Kernel kompiliert werden.

Der Benutzer root begibt sich, nach /usr/src und lädt dort den Code. Das ist Standard, weil auch DKMS & Co dort arbeiten.

Der Code des Kernels wird mit folgendem Befehl geholt: apt-get source linux

Hierbei wird nicht nur der Code geladen, sondern auch die benötigten Patches, die von der Distribution (Debian, Ubuntu, ...) hinzugefügt wurden.

Vorbereitung des Quellcodes zum Kompilieren

Falls es Fehlermeldungen wegen fehlender Pakte gibt, müssen die nachinstalliert werden.

Die Vorbereitung des Codes zum Kompilieren erfolgt mit diesem Befehl: apt-get build-dep linux

Kernel-Konfiguration

Als Ausgangspunkt sollte man immer von der aktuellen Konfiguration des gerade laufenden Kernel ausgehen. Das erpart die mühsame Einstellung von tausenden Optionen, die nur ein Spezialist alle kennt. Die Konfiguration des aktuellen Kernel befindet sich im boot-Verzeichnis unter /boot/config...<Kernel-Version>

Diese Datei kopiert man in das Verzeichnis mit dem Kernelcode /usr/src/linux...<Kernel-Version> (zB /usr/src/linux/linux-3.13.0) und benennt sie in ".config" um. Eine (optionale) gleichnamige Datei wird in ".config.old" umbenannt.

Jetzt startet man als root das Konfigurationsprogramm des Kernel, dass viele Seiten mit Kerneloptionen anbietet. Das geht mit diesem Befehl: make menuconfig

Hier hat man die Qual der Wahl und man kann sehr viel falsch machen. Daher ist es wichtig eine fertige, lauffähige Konfiguration zu benutzen.

Am Schluss speichert man die Änderungen ab, die in die .config geschrieben werden.

Makefile-Konfiguration

Dann werden im Makefile folgende Zeilen verändert:

EXTRAVERSION = [irgendwas]

wird zu

EXTRAVERSION = -eigenerVersionsname


Das kann jeder für sich entscheiden.


HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89

wird zu

HOSTCFLAGS = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89 -march=native -mtune=native


und


HOSTCXXFLAGS = -O2

wird zu

HOSTCXXFLAGS = -O2 -march=native -mtune=native


Damit der Kernel explizit für die CPU kompiliert wird und die besten Optimierungen nutzt.

Kompilieren des Kernels

Vor jeder Kompilierung sollte immer aufgeräumt werden, das geht mit diesem Befehl: make clean


Jetzt geht's los: make deb-pkg


Mit make -j deb-pkg werden die Prozesse nicht limitiert (System kann abstürzen). Man kann aber auch mit make --jobs=[ANZAHL] die Anzahl der Prozesse selbst bestimmen.

root kann jetzt in Ruhe Kaffee trinken gehen. Der Computer ist für eine Weile beschäftigt. Erzeugt werden Deb-Pakete, die sich später leicht installieren und archivieren lassen.

Installation des Kernels

Installiert wird der neue Kernel im selben Verzeichnis mit: dpkg -i *.deb

Dann neu booten (Grub -> Advanced Options) und dann den eigenen Kernel auswählen.

Mit dem Befehl: uname -a kann getestet werden welcher Kernel aktuell läuft.