Kernel kompilieren Vorgang Debian

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Voraussetzungen

Plattenplatz

Mit der unveränderten Debian-Konfiguration braucht der Bau rund 50 GByte und mehrere Stunden. Der Grund sind die Debug-Informationen, die Debian für seine eigenen Pakete einschaltet. Werden sie abgeschaltet – siehe unten –, sinkt der Bedarf auf etwa 3 GByte und die Bauzeit auf einen Bruchteil.

Rechenzeit

Der Bau ist der einzige Vorgang im Kurs, der einen Rechner über längere Zeit voll auslastet. Je mehr Kerne die Maschine hat, desto kürzer dauert es.

Benötigte Pakete

  • apt install build-essential fakeroot libncurses-dev libssl-dev libelf-dev flex bison bc xz-utils rsync cpio kmod zstd pahole

Wozu die wichtigsten dienen:

Paket Zweck
build-essential Compiler, Binutils, make
libncurses-dev Textoberfläche von make menuconfig
libssl-dev Signieren der Module
libelf-dev, pahole BTF-Informationen für eBPF
flex, bison Parser des Konfigurationssystems
rsync, cpio, kmod, zstd Installation von Headern, Modulen und Initramfs

Auf älteren Debian-Versionen heißt pahole noch dwarves.

Vorbereitungen

  • sudo -i
  • cd /usr/src

Quellcode herunterladen

Die gepflegten Versionen stehen auf https://www.kernel.org/ unter longterm. Aktuell sind das die Reihen 6.18, 6.12, 6.6 und 6.1. Die Version 6.2 aus älteren Anleitungen wird seit 2023 nicht mehr gepflegt und sollte nicht mehr verwendet werden.

Verzeichnisübersicht: https://mirrors.edge.kernel.org/pub/linux/kernel/

Die Nummer nach dem zweiten Punkt ändert sich laufend – vorher auf kernel.org nachsehen, welche die aktuelle ist.

  • tar -xJf linux-6.18*.tar.xz
  • cd linux-6.18*/

Das Archiv im Format .tar.xz ist deutlich kleiner als .tar.gz; entpackt wird es mit -J statt -z.

Alte Konfiguration übernehmen

Als Ausgangspunkt dient die Konfiguration des laufenden Debian-Kernels. So laufen alle Treiber weiter, die die Maschine bisher gebraucht hat.

  • cp /boot/config-$(uname -r) .config

Der neue Kernel kennt Optionen, die es im alten noch nicht gab. olddefconfig setzt diese auf ihren Vorgabewert, ohne für jede einzelne nachzufragen:

  • make olddefconfig

Die Debian-Besonderheiten abschalten

Debians Konfiguration verweist auf Zertifikatsdateien, die nur im Debian-Paketbau existieren. Ohne diese Änderung bricht der Bau ab. Die Optionen werden auf einen leeren Wert gesetzt – Auskommentieren genügt nicht, weil dann der Vorgabewert greift.

  • scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
  • scripts/config --set-str MODULE_SIG_KEY ""

Debug-Informationen abschalten. Das ist der Unterschied zwischen 50 und 3 GByte:

  • scripts/config --disable DEBUG_INFO
  • scripts/config --disable DEBUG_INFO_BTF

Einen eigenen Namen vergeben

Ohne eigene Kennung heißt der neue Kernel fast genauso wie der alte und ist im GRUB-Menü kaum zu unterscheiden.

  • scripts/config --set-str LOCALVERSION "-xinux"

Aus 6.18.38 wird damit 6.18.38-xinux.

Kernel konfigurieren

  • make menuconfig

Bedienung: Pfeiltasten zum Navigieren, Leertaste schaltet zwischen * (fest eingebaut), M (als Modul) und leer (nicht enthalten), / sucht nach einer Option, ? zeigt die Hilfe zur markierten Zeile.

Achtung: make menuconfig kann die vorher gesetzten Optionen wieder verändern, wenn man an den betreffenden Stellen etwas umstellt. Nach dem Verlassen kontrollieren:

  • grep -E 'SYSTEM_TRUSTED_KEYS|MODULE_SIG_KEY|DEBUG_INFO=' .config

Kernel und Module übersetzen

-j gibt an, wie viele Übersetzungsvorgänge gleichzeitig laufen. $(nproc) setzt automatisch die Zahl der vorhandenen Kerne ein.

  • make -j$(nproc)

Nur den Kernel und die Module, ohne die übrigen Ziele:

  • make -j$(nproc) bzImage modules

Installieren

  • make modules_install install

Was dabei geschieht:

  • Die Module landen unter /lib/modules/6.18.38-xinux/
  • Der Kernel wird als /boot/vmlinuz-6.18.38-xinux abgelegt
  • update-initramfs erzeugt die passende Initramfs
  • update-grub nimmt den Kernel ins Bootmenü auf

Die beiden letzten Schritte ruft make install auf Debian selbst auf – ein zusätzliches update-grub ist nicht nötig, schadet aber nicht.

Kontrolle:

  • ls -l /boot/
  • grep menuentry /boot/grub/grub.cfg

Neu starten und prüfen

  • reboot

Nach dem Start:

  • uname -r
6.18.38-xinux

Startet der neue Kernel nicht, wählt man im GRUB-Menü unter Advanced options for Debian den alten Eintrag aus. Der bisherige Kernel bleibt vollständig erhalten – deshalb ist der Vorgang gefahrlos.

Wieder entfernen

make install legt Dateien am Paketmanagement vorbei ab; sie müssen von Hand entfernt werden.

  • rm -rf /lib/modules/6.18.38-xinux
  • rm -f /boot/vmlinuz-6.18.38-xinux /boot/initrd.img-6.18.38-xinux /boot/System.map-6.18.38-xinux /boot/config-6.18.38-xinux
  • update-grub

Nur einen Kernel entfernen, unter dem man nicht gerade läuft – vorher mit uname -r prüfen.

Troubleshooting

Fehler
No rule to make target 'debian/certs/debian-uefi-certs.pem'

Die Zertifikatsoptionen wurden nicht geleert. Siehe oben:

  • scripts/config --set-str SYSTEM_TRUSTED_KEYS ""
  • scripts/config --set-str MODULE_SIG_KEY ""
Die Platte läuft voll

Debug-Informationen sind noch eingeschaltet:

  • scripts/config --disable DEBUG_INFO
  • scripts/config --disable DEBUG_INFO_BTF
  • make -j$(nproc)

Bereits erzeugte Dateien aufräumen – clean behält die Konfiguration, mrproper löscht auch sie:

  • make clean
Fehler
pahole version too old / BTF
  • scripts/config --disable DEBUG_INFO_BTF
Der neue Kernel bootet nicht

Im GRUB-Menü unter Advanced options den alten Kernel starten, dann die Konfiguration prüfen. Häufigste Ursache ist ein Treiber, der für die Systemplatte gebraucht wird und versehentlich als Modul statt fest eingebaut konfiguriert wurde.

Aufgaben

  • Installieren Sie die für den Kernelbau benötigten Pakete.
  • Laden Sie die aktuelle longterm-Version aus der Reihe 6.18 herunter und entpacken Sie sie unter /usr/src.
  • Übernehmen Sie die Konfiguration des laufenden Kernels und bringen Sie sie auf den neuen Stand.
  • Leeren Sie die beiden Zertifikatsoptionen. Warum genügt Auskommentieren nicht?
  • Schalten Sie die Debug-Informationen ab und begründen Sie, warum.
  • Geben Sie dem Kernel eine eigene Kennung.
  • Sehen Sie sich die Konfiguration in der Textoberfläche an und suchen Sie die Option für das ext4-Dateisystem.
  • Übersetzen Sie Kernel und Module mit allen verfügbaren Kernen.
  • Installieren Sie das Ergebnis und kontrollieren Sie, was in /boot gelandet ist.
  • Starten Sie neu und prüfen Sie, welcher Kernel läuft.
  • Wie kommen Sie zurück auf den alten Kernel, falls der neue nicht startet?