ubuntuusers.de

Kernel kompilieren

Hinweis:

Dieses Howto wurde von verdooft erstellt. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich gegebenenfalls zusätzlich an den/die Verfasser des Howtos.

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


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

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

  • 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)

Befehl zum Installieren der Pakete:

sudo apt-get install build-essential libncurses5 libncurses5-dev libncurses-dev qtbase5-dev-tools flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf debhelper rustc bc 

Oder mit apturl installieren, Link: apt://build-essential,libncurses5,libncurses5-dev,libncurses-dev,qtbase5-dev-tools,flex,bison,openssl,libssl-dev,dkms,libelf-dev,libudev-dev,libpci-dev,libiberty-dev,autoconf,debhelper,rustc,bc

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:

    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:

    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

    unxz linux-6.6.4.tar.xz 
  • Download der Signatur

    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

    gpg --locate-keys torvalds@kernel.org gregkh@kernel.org 
  • Signatur überprüfen

    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 <gregkh@kernel.org>" [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

    gpg --tofu-policy good 647F28654894E3BD457199BE38DBBDC86092693E 
  • Jetzt funktioniert die Überprüfung

    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 <gregkh@kernel.org>" [vollständig]
    gpg: gregkh@kernel.org: Verified 8 signatures in the past 2 Monate.  0
         Nachrichten verschlüsselt.

Entpacken des Archives

  • Entpacken

    tar -xvf linux-6.6.4.tar 

    Das xz Archiv könnte man so entpacken

    tar xfv linux-6.6.4.tar.xz 
  • Wechsel in das Verzeichnis

    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

    make mrproper 

Konfiguration kopieren

  • Konfiguration des laufenden Kernels kopieren und alle hinzugefügten Optionen auf den Standardwert setzen:

    make olddefconfig 
  • Alternativ kann man auch dieses ausführen, damit Rückfragen bei neuen Konfigurationsoptionen erfolgen

    make oldconfig 

Konfigurationsänderungen

  • Ohne die Änderung bezogen auf vertrauenswürdige Schlüssel, käme es zu einer Fehlermeldung (Quelle). Hat man die Konfiguration eines Kernels, bei dem diese Änderungen vorgenommen wurden, kopiert, kann das Folgende übersprungen werden.

    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.:

    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 (Hilfe zu anderen make-Zielen 🇬🇧, Siehe Kapitel: Configuring the kernel) sind in einer Anwendung für X11 per

    make xconfig 

    oder im Terminal per

    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

    grep -c processor /proc/cpuinfo 

    oder

    nproc 

    liefern die Zahl der Prozessorkerne, inklusive Hyperthreading. Im Beispiel wird 16 ausgegeben.

  • Kompilieren

    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

    cd ..
    sudo dpkg -i *.deb 

  • Checks nach Neustart (Beispielausgaben)

    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
    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

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:

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:

Adresszeile zum Hinzufügen des PPAs:

  • ppa:ubuntu-toolchain-r/test

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.


Ein PPA unterstützt nicht zwangsläufig alle Ubuntu-Versionen. Weitere Informationen sind der Wiki/Vorlagen/PPA/ppa.png PPA-Beschreibung des Eigentümers/Teams ubuntu-toolchain-r zu entnehmen.

  • gcc-13 (PPA)

  • g++-13 (PPA)

Befehl zum Installieren der Pakete:

sudo apt-get install gcc-13 g++-13 

Oder mit apturl installieren, Link: apt://gcc-13,g++-13

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

Adresszeile zum Hinzufügen des PPAs:

  • ppa:savoury1/rust

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.


Ein PPA unterstützt nicht zwangsläufig alle Ubuntu-Versionen. Weitere Informationen sind der Wiki/Vorlagen/PPA/ppa.png PPA-Beschreibung des Eigentümers/Teams savoury1 zu entnehmen.

  • rustc (PPA)

Befehl zum Installieren der Pakete:

sudo apt-get install rustc 

Oder mit apturl installieren, Link: apt://rustc

Diese Revision wurde am 7. April 2024 12:57 von SaschaU erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Howto