Kernel/Kompilierung

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

  3. Einen Editor öffnen

  4. Linux-Metapakete: welche Version?

Inhaltsverzeichnis
  1. Kurzanleitung für einen einfachen Standard...
    1. Vorbereitung
    2. Konfiguration
    3. Bauen
    4. Exkurs - Bootmenü
    5. Kernel installieren und testen
  2. Kernel-Konfiguration verändern
    1. .config
    2. Konfigurations-Werkzeuge
  3. Tipps und Hintergrundinfos
    1. root und fakeroot
    2. Schnelleres Bauen
    3. Ohne initial ramdisk
    4. Kernelbezeichnung erweitern
    5. Kernelgröße prüfen
    6. Tipps zu make
  4. Links

Manchmal benötigt man einen angepassten Kernel mit zusätzlichen Funktionen, oder ein normalerweise dynamisch zu ladender Treiber soll fest eingebaut werden. Dann kann man sich einen eigenen Kernel aus den Quellcode kompilieren.

Gründe, einen eigenen Kernel zu kompilieren:

Gründe, einen eigenen Kernel nicht zu kompilieren:

Achtung!

Wenn man einen selbstkompilierten Kernel verwendet, ist es sehr schwierig, bei Problemen Hilfe zu bekommen. Man kann zum Beispiel keinen Fehlerbericht auf Launchpad erstellen.

Kurzanleitung für einen einfachen Standardkernel

Es werden die von Ubuntu bereitgestellten Kernel-Quellen verwendet, ein .deb-Paket gebaut und installiert. Detaillierte Erklärungen und weiterführende Möglichkeiten werden in späteren Abschnitten aufgezeigt.

Vorbereitung

Notwendige Pakte installieren.

Wiki/Vorlagen/Installbutton/button.png mit apturl

Paketliste zum Kopieren:

sudo apt-get install linux-source build-essential kernel-package libssl-dev 

sudo aptitude install linux-source build-essential kernel-package libssl-dev 

Nach der Installation befinden sich die Kernelquellen im Verzeichnis /usr/src, z.B.:

drwxr-xr-x 4 root root 4096 Mär 22 13:54 /usr/src/linux-source-ver3.2.1
lrwxrwxrwx 1 root root   45 Mär 20 01:07 /usr/src/linux-source-ver3.2.1.tar.bz2 -> linux-source-3.2.1/linux-source-3.2.1.tar.bz2

Alle weiteren Befehlseingaben im gesamten Artikel werden als normaler Benutzer im eigenen HOME-Verzeichnis getätigt und bedürfen nicht dem vorangestellten sudo-Befehl (siehe auch Tipps und Hintergrundinfos).

Damit das Kompilieren der Kernelpakete das eigene Homeverzeichnis nicht "zumüllt", empfiehlt sich das Anlegen eines neuen Unterordners namens kernel.

mkdir kernel 

Abschließend wechselt man in das neue Unterverzeichnis

cd kernel 

Der folgende Aufruf entpackt die Kernel-Quellen in einen eigenen Unterordner namens linux-source-versionXYZ im aktuellen Verzeichnis

tar xvjf /usr/src/linux-*tar.bz2 

Nun wechselt man in das neue Verzeichnis

cd linux-source* 

Konfiguration

Konfiguration des aktuell laufenden Kernels für den neuen Kernel übernehmen:

cp /boot/config-`uname -r` .config 

Dieser Aufruf setzt eventuelle neuen Optionen entsprechend der Vorschläge der Kernel-Entwickler.

yes "" | make oldconfig 

Bauen

Folgender Befehl "baut" den Kernel und verpackt anschließend alles Notwendige in Debian-Pakete (.deb).

make-kpkg --initrd buildpackage 

Hinweis:

Die Ausführung von make-kpkg kann mehrere Stunden in Anspruch nehmen und nimmt in der normalen Konfiguration ca. 5 GiB Festplattenplatz in Anspruch. Eine schnellere Festplatte (SSD ist zu bevorzugen) kann den Kompiliervorgang deutlich beschleunigen. Aktuelle Prozessoren ab 1,5 GHz aufwärts sind ausreichend. Für den aktuellen Standardkernel (3.8.xx) braucht der Kompiliervorgang auf einem Intel Core i5 Prozessor mit der Standardkonfiguration ca. 45 min und ca. 4,8 GiB Festplattenspeicher.

Nun sollten im übergeordneten Verzeichnis folgende Dateien (Versionsnummern variieren natürlich) vorhanden sein.

cd ..
ls -l 

-rw-r--r--  1 user user   7121212 Apr  3 08:41 linux-doc-3.5.7.7_3.5.7.7-10.00.Custom_all.deb
-rw-r--r--  1 user user   8091536 Apr  3 06:09 linux-headers-3.5.7.7_3.5.7.7-10.00.Custom_i386.deb
-rw-r--r--  1 user user  43954508 Apr  3 07:07 linux-image-3.5.7.7_3.5.7.7-10.00.Custom_i386.deb
-rw-r--r--  1 user user 717180814 Apr  3 08:05 linux-image-3.5.7.7-dbg_3.5.7.7-10.00.Custom_i386.deb
-rw-r--r--  1 user user      2134 Apr  3 08:42 linux-manual-3.5.7.7_3.5.7.7-10.00.Custom_all.deb
drwxrwxr-x 26 user user      4096 Apr  3 08:41 linux-source-3.5.0
-rw-r--r--  1 user user  84241398 Apr  3 08:41 linux-source-3.5.7.7_3.5.7.7-10.00.Custom_all.deb
-rw-rw-r--  1 user user      1070 Apr  2 10:27 linux-source-3.5.7.7_3.5.7.7-10.00.Custom.dsc
-rw-rw-r--  1 user user      3957 Apr  3 08:43 linux-source-3.5.7.7_3.5.7.7-10.00.Custom_i386.changes
-rw-rw-r--  1 user user 107826129 Apr  2 10:26 linux-source-3.5.7.7_3.5.7.7-10.00.Custom.tar.gz

Exkurs - Bootmenü

Folgende Erläuterung ist sehr wichtig, falls der gebaute Kernel nicht funktioniert und auf den vorherigen Kernel zurückgegriffen werden muss.

Kernel installieren und testen

Den Kernel installieren

sudo dpkg -i linux-image-3.5.7.7_3.5.7.7-10.00.Custom_i386.deb 

Nun muss das System neu gestartet werden. Im Normalfall sollte beim nächsten Bootvorgang der Bootmanager selbstständig den selbstgebauten Kernel auswählen.

Um zu überprüfen welcher Kernel gerade (z.B. vor und nach dem Neustart) aktiv ist, dient folgender Befehl.

uname -a 

Kernel-Konfiguration verändern

Die "Konfiguration" des Kernels sind Einstellungen, die das Bauen bzw. die Zusammensetzung des Kernels beeinflussen. Es ist möglich Kernelmodule (z.B. Treiber) zu entfernen, hinzuzufügen oder fest einzubauen. Außerdem lassen sich bestimmte Funktionalitäten und Fähigkeiten (z.B. das Rotieren des Framebuffers) aktivieren und deaktivieren.

.config

Die Konfiguration ist in einer einzelnen Datei festgehalten. Normalerweise befindet sich diese Datei im Stammverzeichnis der Kernelquellen. Mit dem obigen Einführungsbeispiel also im Pfad: /usr/src/linux-source*/.config

Verschiedene Varianten dieser Datei können für den Bau des eigenen Kernels auf folgende Arten erzeugt werden. Die Kommandos müssen alle im Stammverzeichnis der Kernelquellen ausgeführt werden, weil sich an diesem Ort die Datei .config befindet und modifiziert bzw. angelegt wird.

Die Konfigurationsdatei manuell mit einem Texteditor zu verändern ist nicht empfehlenswert und auch wenig praktisch. Im folgenden Abschnitt wird ein bequemerer Weg beschrieben.

Konfigurations-Werkzeuge

Um die Konfiguration (also die Datei .config) im Detail zu verändern, existieren verschiedene Werkzeuge, welche sich in ihrer grundlegenden Funktion nicht unterscheiden, sondern nur in der Darstellung und der Handhabung der Konfigurationsdatei.

Die einzelnen Werkzeuge nutzen verschiedene Zusatzbibliotheken welche ggf. mit der Paketverwaltung noch installiert werden müssen. Im Folgenden eine Auflistung der Werkzeuge mit kurzer Erläuterung und den notwendigen Paketen.

Werkzeug Beschreibung Paket
make menuconfig ncurses-basierte Oberfläche zur Verwendung im Terminal libncurses5-dev
make gconfig GTK-Oberfläche libglade2-dev
make xconfig Qt-Oberfläche, komfortabler als gconfig, da es sich um eine vollwertige GUI-Oberfläche handelt libqt4-dev
make nconfig komfortablere ncurses-basierte Oberfläche ab Kernel 2.6.35 libncurses5-dev
make config Zeilen-orientierte Oberfläche für die Konsole, welche ohne zusätzliche Abhängigkeiten auskommt

Nach dem Beenden der Konfiguration kann, wie im Einführungsabschnitt beschrieben, der build-Prozess angestoßen werden.

Weitere Infos und Tipps zu make sind im Abschnitt Tipps zu make zu finden.

Tipps und Hintergrundinfos

root und fakeroot

In Foren und einigen Kernelbau-Anleitungen hält sich immer noch die Meinung, man müsse den Kernel als root oder mit fakeroot bauen. Für keinen der in diesem Artikel beschriebenen Schritte sind root-Rechte erforderlich! Bei Ausnahmen wird dieses explizit erwähnt. Auch die Verwendung des Kommandos fakeroot oder der make-kpkg-Option --rootcmd ist für diese Schritte nicht erforderlich. Die manpage zu make-kpkg ist hierzu leider nicht mehr aktuell (BugReport 🇬🇧).

Nur zur Installation des selbstgebauten Kernels als deb-Paket werden root-Rechte benötigt. Aus Sicherheitsgründen sollte der Kernel immer als einfacher Benutzer ohne root-Rechte gebaut werden.

Schnelleres Bauen

Auf Multikern- und Multiprozessorsystemen kann make-kpkg die Option -j und einer folgenden Nummer mitgegeben werden. Diese Option legt fest, wie viele Jobs make-kpkg gleichzeitig laufen lässt. Als Wert wird hier die Anzahl der Prozessorkerne bzw. bei Hyperthreading-Systemen die zweifache Anzahl empfohlen.

Die Anzahl der vorhandenen CPUs lässt sich mit folgendem Befehl ermitteln:

lscpu 

Mit folgendem Befehl kann man herausfinden, ob Hyperthreading genutzt wird:

if [ "$(grep -c processor /proc/cpuinfo)" -gt "$(grep "cores" /proc/cpuinfo | grep -o "[[:digit:]]" | uniq)" ]; then echo "Hyperthreading aktiviert"; else echo "Kein Hyperthreading"; fi 

Hat man zum Beispiel einen Computer mit 6 Kernen und Hyperthreading (= 12 parallele Jobs), so kann der Befehl wie folgt lauten:

make-kpkg -j12 --append-to-version +text-zum-kernel+ --initrd buildpackage 

Ohne initial ramdisk

Achtung!

Ohne "initial ramdisk" wird das System unter Umständen nicht mehr starten und sollte daher nur unter ganz bestimmten Umständen weggelassen werden.

Der Begriff "initrd" wird im Bereich der aktuellen Linux-Varianten als Synonym für initramfs verwendet. Ältere Linux-Varianten verwendeten noch initrd. Bei beiden Techniken handelt es sich um eine sogenannte "Inital RAM-Disc". Es ist ein temporäres Dateisystem im Arbeitsspeicher und beinhaltet Treiber und Dienstprogramme, welche während des Bootprozess benötigt werden, um den eigentlichen Kernel zu laden.

Um diesen Schritt auszulassen, ist es notwendig, die Treiber bzw. Module für das Root-Dateisystem und den eigenen Festplattenkontroller fest in den Kernel einzukompilieren. Dann kann die Option --initrd beim Aufruf von make-kpkg weggelassen werden. Herauszufinden, welche Module hier notwendig sind, ist sehr komplex und wird daher an dieser Stelle nicht weiter erläutert.

Kernelbezeichnung erweitern

Mit der make-kpkg-Option --append-to-version ist es möglich der Bezeichnung des selbstgebauten Kernels eine eigene Information hinzuzufügen.

make-kpkg --append-to-version +12+ --initrd buildpackage 

Diese Bezeichnung wirkt sich beispielsweise auf die erzeugten .deb-Pakete und die Einträge im Boot-Menü aus.

linux-image-3.5.7.7_3.5.7.7-10.00.Custom_i386.deb

wird zu

linux-image-3.5.7.7+12+_3.5.7.7-10.00.Custom_i386.deb

Kernelgröße prüfen

Um zu überprüfen, ob der selbstgebaute Kernel größer oder kleiner als der alte ist, schaut man sich im Verzeichnis /boot/ die installierten Kernel-Abbilder an. Diese Dateien beginnen mit vmlinuz.

Tipps zu make