[[Vorlage(Howto, verdooft)]] [[Vorlage(getestet, Jammy)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Kernel: Allgemeine Informationen zum Kernel] [:Pakete installieren: Installation von Programmen] [:wget: Dateien mit wget herunterladen] [:GnuPG: Überprüfen von Signaturen per GnuPG] [:tar: Tar-Archive entpacken] [:Makefile: Umgang mit `make`], optional [:Paketinstallation_DEB: Debian-Pakete installieren] [:uname: Kernelinformationen ermitteln] [:mit Root-Rechten arbeiten: Im Terminal mit Root-Rechten arbeiten] [:GCC: Umgang mit dem C-Compiler GCC] }}} = Problembeschreibung = In manchen Fällen reicht es, bei kernelbezogenen Problemen (etwa sehr moderner oder exotischer Hardware), den aktuellen [:Mainline-Kernel:] zu verwenden. Benötigt man einen angepassten Kernel, etwa um einen Bug zu beheben, oder die Kompatibilität zu Hardwarekomponenten im Source zu verbessern, oder Optionen zu ändern, kann es sinnvoll sein, diesen aus dem Quellcode selbst zu bauen. Manchmal reicht es schon, wenn man neugierig ist, um sich dafür zu entscheiden. Verwendet man sehr alte Hardware, könnte es sein, dass der neue Kernel diese nicht mehr unterstützt. In diesem Howto wird ausschließlich auf das Kompilieren des Quellcodes von kernel.org eingegangen, es ist aber möglich, dass Teile der Anleitung auch in anderen Szenarien anwendbar sind. Zu beachten ist, dass es mit sehr aktuellen Kernelversionen zu Problemen beim Kompilieren, auch per [:DKMS:], von bestimmten Modulen kommen kann. Es wird empfohlen, den vorherigen Kernel nicht zu deinstallieren, damit mindestens ein Alternativkernel zur Verfügung steht. Das Kompilieren, inklusive Bauen der Pakete, kann - je nach verwendeter CPU, in deutlich unter einer halben Stunde abgeschlossen sein, aber auch bis zu mehreren Stunden dauern (4 Stunden auf einem älteren, mobilen Core 2 Duo System). Geht man dieses HowTo per [:SSH:] auf einem entfernten Rechner durch, ist es empfehlenswert, das in einer [:Screen:]- oder [:Tmux:]-Sitzung zu erledigen, damit der Vorgang bei einem Verbindungabbruch nicht unterbrochen wird. = Anleitung = == Installation der Voraussetzungen == {{{#!vorlage Paketinstallation build-essential, main libncurses5, universe libncurses5-dev, main libncurses-dev, main qtbase5-dev-tools, universe flex, main bison, main openssl, main libssl-dev, main dkms, main libelf-dev, main libudev-dev, main libpci-dev, main libiberty-dev, main autoconf, main debhelper, main rustc, main bc, main }}} == Sonstige Vorbereitungen == * Dateisystem vorbereiten. Es wird empfohlen, eigens dafür ein Verzeichnis zu erstellen, damit sich in diesem nach Abschluss des Baus ausschließlich Debian-Pakete des Kernels befinden. Man kann dazu folgendermaßen vorgehen:{{{#!vorlage Befehl mkdir -p ~/Downloads/custkernel cd ~/Downloads/custkernel }}} * Kernelsource herunterladen, dazu geht man auf die Seite [https://www.kernel.org/] und lädt das Quelltextarchiv der gewünschten Kernelversion im Browser oder per wget herunter:{{{#!vorlage Befehl wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.4.tar.xz }}} == Überprüfung der Signatur == * Da das tar-Archiv signiert ist, entpackt man das xz-Archiv folgendermaßen{{{#!vorlage Befehl unxz linux-6.6.4.tar.xz }}} * Download der Signatur{{{#!vorlage Befehl wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.4.tar.sign }}} * Import der Schlüssel; das ist nur einmal notwendig{{{#!vorlage Befehl gpg --locate-keys torvalds@kernel.org gregkh@kernel.org }}} * Signatur überprüfen{{{#!vorlage Befehl gpg --verify linux-6.6.4.tar.sign }}}Beispielausgabe{{{ gpg: die unterzeichneten Daten sind wohl in 'linux-6.6.4.tar' gpg: Signatur vom So 03 Dez 2023 07:34:10 CET gpg: mittels RSA-Schlüssel 647F28654894E3BD457199BE38DBBDC86092693E gpg: Korrekte Signatur von "Greg Kroah-Hartman " [unbekannt] gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur! gpg: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört. Haupt-Fingerabdruck = 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E ([https://www.kernel.org/category/signatures.html Seite mit aktuellen Fingerabdrücken]). }}} * Dem Schlüssel vertrauen; das ist nur einmal notwendig{{{#!vorlage Befehl gpg --tofu-policy good 647F28654894E3BD457199BE38DBBDC86092693E }}} * Jetzt funktioniert die Überprüfung{{{#!vorlage Befehl gpg --trust-model tofu --verify linux-6.6.4.tar.sign }}}Beispielausgabe{{{ gpg: die unterzeichneten Daten sind wohl in 'linux-6.6.4.tar' gpg: Signatur vom So 03 Dez 2023 07:34:10 CET gpg: mittels RSA-Schlüssel 647F28654894E3BD457199BE38DBBDC86092693E gpg: Korrekte Signatur von "Greg Kroah-Hartman " [vollständig] gpg: gregkh@kernel.org: Verified 8 signatures in the past 2 Monate. 0 Nachrichten verschlüsselt.}}} == Entpacken des Archives == * Entpacken{{{#!vorlage Befehl tar -xvf linux-6.6.4.tar}}}Das xz Archiv könnte man so entpacken{{{#!vorlage Befehl tar xfv linux-6.6.4.tar.xz}}} * Wechsel in das Verzeichnis{{{#!vorlage Befehl cd linux-6.6.4 }}} == Aufräumen des Quelltextverzeichnisses == * Um sicherzustellen, dass das entpackte Quelltextverzeichnis nur das notwendige enthält, führt man das aus{{{#!vorlage Befehl make mrproper}}} == Konfiguration kopieren == * Konfiguration des laufenden Kernels kopieren und alle hinzugefügten Optionen auf den Standardwert setzen:{{{#!vorlage Befehl make olddefconfig }}} * Alternativ kann man auch dieses ausführen, damit Rückfragen bei neuen Konfigurationsoptionen erfolgen{{{#!vorlage Befehl make oldconfig}}} == Konfigurationsänderungen == * Ohne die Änderung bezogen auf vertrauenswürdige Schlüssel, käme es zu einer Fehlermeldung ([https://saveriomiroddi.github.io/A-precise-guide-to-build-a-custom-linux-kernel#necessaryconvenient-changes Quelle]). Hat man die Konfiguration eines Kernels, bei dem diese Änderungen vorgenommen wurden, [#Konfiguration-kopieren kopiert], kann das Folgende übersprungen werden.{{{#!vorlage Befehl scripts/config --set-str SYSTEM_TRUSTED_KEYS "" scripts/config --set-str SYSTEM_REVOCATION_KEYS "" }}} * Debug-Variablen abstellen, ansonsten würde ein zusätzliches Paket mit Debugsymbolen erstellt werden. Hat man bereits die Konfiguration eines Kernels, bei dem diese Änderungen vorgenommen wurden, kopiert, kann das Folgende übersprungen werden.:{{{#!vorlage Befehl scripts/config --undefine DEBUG_INFO scripts/config --undefine DEBUG_INFO_COMPRESSED scripts/config --undefine DEBUG_INFO_REDUCED scripts/config --undefine DEBUG_INFO_SPLIT scripts/config --undefine GDB_SCRIPTS scripts/config --set-val DEBUG_INFO_DWARF5 n scripts/config --set-val DEBUG_INFO_NONE y }}} * Weitere Anpassungen ([https://www.kernel.org/doc/Documentation/admin-guide/README.rst Hilfe zu anderen make-Zielen] {en}, Siehe Kapitel: Configuring the kernel) sind in einer Anwendung für X11 per {{{#!vorlage Befehl make xconfig }}} oder im Terminal per{{{#!vorlage Befehl make menuconfig }}}möglich. * Jetzt kann man Patches oder sonstige Änderungen am Quellcode vornehmen == Kompilieren == Um den Vorgang des Kompilierens zu beschleunigen, kann man den Kernel mit mehreren Threads bauen. * Ermittlung der Prozessorenanzahl{{{#!vorlage Befehl grep -c processor /proc/cpuinfo }}}oder{{{#!vorlage Befehl nproc }}}liefern die Zahl der Prozessorkerne, inklusive Hyperthreading. Im Beispiel wird 16 ausgegeben. * Kompilieren{{{#!vorlage Befehl make -j 16 bindeb-pkg LOCALVERSION=-"custombuild-001" }}}Mit der Option -j verwendet man den vorher ermittelten Wert. LOCALVERSION erweitert die Versionsangabe des Kernels. Dadurch werden auch die Paketnamen für den Kernel und die Header von "...6.6.4" zu "...6.6.4-custombuild-001" geändert. == Installation und Überprüfung der Installation == * Debianpakete installieren{{{#!vorlage Befehl cd .. sudo dpkg -i *.deb }}} * Checks nach Neustart (Beispielausgaben){{{#!vorlage Befehl uname -a}}}{{{ Linux vm0a 6.6.4-custombuild-001 #1 SMP PREEMPT_DYNAMIC Thu Dec 03 09:41:53 CEST 2023 x86_64 x86_64 x86_64 GNU/Linux}}}{{{#!vorlage Befehl cat /proc/version}}}{{{Linux version 6.6.4-custombuild-001 (linux@vm0a) (gcc-13 (Ubuntu 13.1.0-8ubuntu1~22.04) 13.1.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #1 SMP PREEMPT_DYNAMIC Thu Dec 03 09:41:53 CEST 2023 }}} == Deinstallation == {{{#!vorlage Befehl sudo apt purge linux-image-6.6.4-custombuild-001 linux-headers-6.6.4-custombuild-001 }}}Dabei bleibt das Paket linux-libc-dev unberührt, es sollte keine negativen Auswirkungen haben. Erhält man während der Deinstallation eine Meldung der Art:{{{ dpkg: Warnung: Während Entfernens von linux-image-6.6.4-custombuild-001 ist Verzeichnis »/lib/modules/6.6.4-custombuild-001« nicht leer, wird daher nicht gelöscht }}}kann man das Verzeichnis mitsamt des Inhaltes so entfernen:{{{#!vorlage Befehl sudo rm -R /lib/modules/6.6.4-custombuild-001}}} == Weiterführende Optionen == === Installation von gcc und g++ Version 13 === Möchte man den Kernel mit abweichenden gcc/g++ Versionen bauen (hier Version 13), geht das so: [[Vorlage(PPA, ubuntu-toolchain-r, test)]]{{{#!vorlage Paketinstallation gcc-13, PPA g++-13, PPA }}}{{{#!vorlage Befehl make CC=/usr/bin/gcc-13 CXX=/usr/bin/g++-13 -j 16 bindeb-pkg LOCALVERSION=-"custombuild-001" }}}Es kann die Abfrage erfolgen {{{ Initialize kernel stack variables at function entry > 1. no automatic stack variable initialization (weakest) (INIT_STACK_NONE) 2. pattern-init everything (strongest) (INIT_STACK_ALL_PATTERN) (NEW) 3. zero-init everything (strongest and safest) (INIT_STACK_ALL_ZERO) (NEW) choice[1-3?]: }}}In dieser Anleitung wurde Option 1 gewählt. === Installation eines aktuelleren Rust-Compilers === [[Vorlage(PPA, savoury1, rust)]]{{{#!vorlage Paketinstallation rustc, PPA }}} = Links = ## Weiterführende Linksammlung * [https://saveriomiroddi.github.io/A-precise-guide-to-build-a-custom-linux-kernel#necessaryconvenient-changes Anleitung mit weiterführenden Informationen] {en} * [https://www.kernel.org/ Linuxkernel] {en} * [https://www.kernel.org/doc/Documentation/admin-guide/README.rst Hilfe zu anderen make-Zielen] {en}, Siehe Kapitel: Configuring the kernel * [https://www.kernel.org/category/signatures.html Signatur des Kernels überprüfen] {en} * [ubuntu_doc:community/Kernel/Compile:Kernelkompilierung in der Ubuntu-Dokumentation] {en} #tag: Howto