[[Vorlage(archiviert)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren:Installation von Programmen] [:Terminal:Ein Terminal öffnen] [:Editor:Einen Editor öffnen] [:Metapakete:Linux-Metapakete: welche Version?] }}} [[Inhaltsverzeichnis(3)]] 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 [packages: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. {{{#!vorlage Warnung 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. {{{#!vorlage Paketinstallation 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 }}} 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 [#root-und-fakeroot: Tipps und Hintergrundinfos]). Damit das Kompilieren der Kernelpakete das eigene Homeverzeichnis nicht "zumüllt", empfiehlt sich das Anlegen eines neuen Unterordners namens '''kernel'''. {{{#!vorlage Befehl mkdir kernel }}} Abschließend wechselt man in das neue Unterverzeichnis {{{#!vorlage Befehl cd kernel }}} Der folgende Aufruf entpackt die Kernel-Quellen in einen eigenen Unterordner namens '''linux-source-versionXYZ''' im aktuellen Verzeichnis {{{#!vorlage Befehl tar xvjf /usr/src/linux-*tar.bz2 }}} Nun wechselt man in das neue Verzeichnis {{{#!vorlage Befehl cd linux-source* }}} == Konfiguration == Konfiguration des aktuell laufenden Kernels für den neuen Kernel übernehmen: {{{#!vorlage Befehl cp /boot/config-`uname -r` .config }}} Dieser Aufruf setzt eventuelle neuen Optionen entsprechend der Vorschläge der Kernel-Entwickler. {{{#!vorlage Befehl yes "" | make oldconfig }}} == Bauen == Folgender Befehl "baut" den Kernel und verpackt anschließend alles Notwendige in Debian-Pakete ('''.deb'''). {{{#!vorlage Befehl make-kpkg --initrd buildpackage }}} {{{#!vorlage 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. {{{#!vorlage Befehl 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. * 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 [:Bootvorgang:Bootvorgangs] im richtigen Moment die Tasten [[Vorlage(Tasten, up)]] oder [[Vorlage(Tasten, down)]] gedrückt werden, um das Menü anzuzeigen. == Kernel installieren und testen == Den Kernel installieren {{{#!vorlage Befehl 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. {{{#!vorlage 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 [wikipedia:Framebuffer:Framebuffers]) aktivieren und deaktivieren. ##Im Folgenden wird beschrieben, wie verschiedenen Varianten der Konfigurationsdatei erzeugt werden. Im Anschluss daran wird gezeigt, wie diese ##Konfigurationsdatei im Detail verändert werden kann.. == .config == Die Konfiguration ist in einer einzelnen Datei festgehalten. Normalerweise befindet sich diese Datei im Stammverzeichnis der Kernelquellen. Mit dem [#Schnell-und-Einfach 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: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl make oldconfig }}} * Um im vorherigen Fall die Abfragen der neuen Kerneloptionen zu unterbinden und statt dessen die empfohlenen Antworten automatisch mit "Ja" zu beantworten: {{{#!vorlage Befehl 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. {{{#!vorlage Befehl make localmodconfig }}} * Alternativ können auch alle Module fest in den Kernel einkompiliert werden. {{{#!vorlage Befehl 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. == 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. {{{#!vorlage Tabelle Werkzeug Beschreibung Paket +++ `make menuconfig` [wikipedia:ncurses:]-basierte Oberfläche zur Verwendung im Terminal '''libncurses-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 [wikipedia:ncurses:]-basierte Oberfläche ab Kernel 2.6.35 '''libncurses-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 [#Bauen Einführungsabschnitt] beschrieben, der `build`-Prozess angestoßen werden. Weitere Infos und Tipps zu `make` sind im Abschnitt [#Tipps-zu-make 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 [:sudo: root] oder mit `fakeroot` bauen. Für keinen der in diesem Artikel beschriebenen Schritte sind [:sudo: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 ([debianbug:704116:BugReport] {en}). 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: {{{#!vorlage Befehl lscpu }}} ## Link von https://forum.ubuntuusers.de/topic/kernel-5/11/#post-5382372 ; Dank an Lasall Mit folgendem Befehl kann man herausfinden, ob Hyperthreading genutzt wird: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl make-kpkg -j12 --append-to-version +text-zum-kernel+ --initrd buildpackage }}} == Ohne initial ramdisk == {{{#!vorlage Warnung 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 [wikipedia:initramfs:] verwendet. Ältere Linux-Varianten verwendeten noch [wikipedia: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 [:Bootvorgang: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. {{{#!vorlage Befehl 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 == * Es empfiehlt sich, ein Backup der Konfiguration außerhalb des Quellcode-Verzeichnisses anzulegen, z.B.: {{{#!vorlage Befehl cp .config ../config.variante }}} * Eine Liste aller verfügbaren Make-Kommandos erhält man mit {{{#!vorlage Befehl 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'''. = Links = * [ubuntu_doc:community/Kernel/Compile:Kernel/Compile] {en} - Original Ubuntu-Kernel mit eigenen Änderungen selbst kompilieren * [ubuntu:Kernel/BuildYourOwnKernel:BuildYourOwnKernel] {en} * [ubuntu_doc:community/CustomRestrictedModules:CustomRestrictedModules] {en} - restricted-modules selbst bauen * [ubuntu:KernelCustomBuild:KernelCustomBuild] {en} - Fragen und Antworten zur Kernel-Kompilierung * [ubuntu:KernelTeam/KernelGitGuide:KernelGitGuide] {en} - Einführung in Git für den Kernel * [https://debian-handbook.info/browse/de-DE/stable/ Das Debian Administrationshandbuch] {de} * [https://debian-handbook.info/browse/de-DE/stable/sect.kernel-compilation.html Kapitel 8.10. Einen Kernel kompilieren] {de} * [heise:-1402386:Linux-Kernel maßgeschneidert] {de} - Nutzung von localmodconfig * [https://kernel.org/ kernel.org: The Linux Kernel Archives] {en} * [https://kernelnewbies.org/ Kernelnewbies Wiki] {en} * [http://www.kroah.com/lkn/ Linux Kernel in a Nutshell] {en} - kostenloses und freies Ebook über das Konfigurieren und Kompilieren des Kernels ## "Error 503 Backend fetch failed", Beforge, 11.07.2018 * [http://kernel-seeds.org/settings-00.html Kernel-Seeds.org] {en} - (unvollständige) Zusammenfassung der Kerneloptionen #tag: System, Kernel