Ubuntu 16.04 Xenial Xerus
Ubuntu 12.04 Precise Pangolin
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
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:
man ist ein Kernel-Entwickler oder -Tester
man möchte den Kernel auf eine spezielle Art kompilieren (z.B. um experimentelle Funktionen zu nutzen)
man besitzt Hardware, die der offizielle Ubuntu-Kernel nicht unterstützt
man ist einfach nur neugierig
Gründe, einen eigenen Kernel nicht zu kompilieren:
Wenn man nur einen Treiber kompilieren möchte, reicht es, die entsprechenden linux-headers-Pakete zu installieren.
Man weiß nicht so recht, was man tut und braucht Hilfe, wenn etwas schief läuft. Abhängig vom gemachten Fehler kann es nötig sein, das System neu zu installieren.
Wenn man einen selbstkompilierten Kernel verwendet, ist es sehr schwierig, bei Problemen Hilfe zu bekommen. Man kann zum Beispiel keinen Fehlerbericht auf Launchpad erstellen.
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.
Notwendige Pakte installieren.
linux-source (Kernel-Quellen von Ubuntu)
build-essential (diverse Tools zum Kompilieren, ...)
kernel-package (Tool zum Erstellen von Kernel-deb-Paketen)
libssl-dev (OpenSSL Entwicklungsbibliotheken)
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 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
Folgender Befehl "baut" den Kernel und verpackt anschließend alles Notwendige in Debian-Pakete (.deb).
make-kpkg --initrd buildpackage
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. 45min 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
Folgende Erläuterung ist sehr wichtig, falls der gebaute Kernel nicht funktioniert und auf den vorherigen Kernel zurückgegriffen werden muss.
Die Installation eines neuen Kernels lässt andere, insbesondere den vor der Installation, aktuellsten Kernel unangetastet. In dem Fall, dass der neue Kernel nicht funktioniert, kann auf eine frühere Version zurückgegriffen werden.
In neueren Versionen von Ubuntu wird die Auswahl der installierten Kernel während des Bootvorgangs oft verborgen. Im Bootmenü (Grub 2) wird an erster Stelle nur der Kernel mit der höchsten Versionsnummer angezeigt. Abhängig von der Ubuntu-Version wird hierbei die konkrete Bezeichnung des Kernels (inkl. Versionsnummer) oder nur "Ubuntu" angezeigt.
Weitere installierte Kernel (also frühere Versionen) werden im zweiten Menüpunkt mit der Bezeichnung "Erweiterte Optionen für Ubuntu" oder "Frühere Kernelversionen" angezeigt.
Bei einigen Systemen wird der Bootloader Grub 2 nicht oder nur sehr kurz angezeigt. In diesem Fall sollte während des Bootvorgangs im richtigen Moment die Tasten ↑ oder ↓ gedrückt werden, um das Menü anzuzeigen.
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
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.
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 Konfiguration des aktuell laufenden Kernels als Ausgangsbasis verwenden:
cp /boot/config-`uname -r` .config
Falls die .config von einer älteren Kernelversion stammt, kann man die Konfiguration für die aktuelle Version aktualisieren. Dabei wird nach den Einstellungen für die neuen Kerneloptionen gefragt.
make oldconfig
Um im vorherigen Fall die Abfragen der neuen Kerneloptionen zu unterbinden und statt dessen die empfohlenen Antworten automatisch mit Ja zu beantworten:
yes "" | make oldconfig
Dieses Kommando (seit Kernel 2.6.32) erzeugt eine Konfiguration mit den vom System gerade verwendeten Modulen. Dabei werden alle benutzten Module als Modul erstellt.
make localmodconfig
Alternativ können auch alle Module fest in den Kernel einkompiliert werden.
make localyesconfig
Die Konfigurationsdatei manuell mit einem Texteditor zu verändern ist nicht empfehlenswert und auch wenig praktisch. Im folgenden Abschnitt wird ein bequemerer Weg beschrieben.
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 vollwertige GUI-Oberfläche | 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.
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.
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 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.
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
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.
Es empfiehlt sich, ein Backup der Konfiguration außerhalb des Quellcode-Verzeichnisses anzulegen, z.B.:
cp .config ../config.variante
Eine Liste aller verfügbaren Make-Kommandos erhält man mit
make help
Weitere Informationen über die Kommandos zum Konfigurieren des Linux Kernels findet man in den Kernel-Quellen in der Datei Documentation/kbuild/kconfig.txt.
Kernel/Compile - Original Ubuntu-Kernel mit eigenen Änderungen selbst kompilieren
CustomRestrictedModules - restricted-modules selbst bauen
KernelCustomBuild - Fragen und Antworten zur Kernel-Kompilierung
KernelGitGuide - Einführung in Git für den Kernel
Linux-Kernel maßgeschneidert - Nutzung von localmodconfig
Linux Kernel in a Nutshell - kostenloses und freies Ebook über das Konfigurieren und Kompilieren des Kernels
Kernel-Seeds.org - (unvollständige) Zusammenfassung der Kerneloptionen
Diese Revision wurde am 8. Februar 2017 22:50 von aasche erstellt.