Kernel kompilieren Vorgang Debian: Unterschied zwischen den Versionen
| Zeile 61: | Zeile 61: | ||
*scripts/config --set-str MODULE_SIG_KEY "" | *scripts/config --set-str MODULE_SIG_KEY "" | ||
| − | Debug-Informationen abschalten. Das ist der Unterschied zwischen 50 und 3 GByte: | + | Debug-Informationen abschalten. Das ist der Unterschied zwischen 50 und 3 GByte. |
| − | *scripts/config --disable | + | |
| − | *scripts/config -- | + | Hier liegt eine Falle: <code>DEBUG_INFO</code> ist kein eigener Schalter, sondern wird von einer '''Auswahlgruppe''' gesetzt, in der genau ein Eintrag aktiv sein darf. <code>scripts/config</code> kennt diese Gruppen nicht und schaltet die Geschwister nicht ab – deshalb muss der bisher aktive Eintrag ausdrücklich mit deaktiviert werden. In Debians Konfiguration ist das <code>DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT</code>. |
| + | |||
| + | *scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT | ||
| + | *scripts/config --enable DEBUG_INFO_NONE | ||
| + | *make olddefconfig | ||
| + | |||
| + | <code>DEBUG_INFO_BTF</code> fällt dabei von selbst weg, weil es Debug-Informationen voraussetzt. | ||
| + | |||
| + | Kontrolle – es darf nur noch <code>CONFIG_DEBUG_INFO_NONE=y</code> übrig bleiben: | ||
| + | *grep -E 'DEBUG_INFO' .config | grep -v '^#' | ||
==Einen eigenen Namen vergeben== | ==Einen eigenen Namen vergeben== | ||
| Zeile 77: | Zeile 86: | ||
'''Achtung:''' <code>make menuconfig</code> kann die vorher gesetzten Optionen wieder verändern, wenn man an den betreffenden Stellen etwas umstellt. Nach dem Verlassen kontrollieren: | '''Achtung:''' <code>make menuconfig</code> 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| | + | *grep -E 'SYSTEM_TRUSTED_KEYS|MODULE_SIG_KEY|DEBUG_INFO_NONE' .config |
| + | |||
| + | Alternativ lässt sich die Debug-Information auch direkt in der Oberfläche einstellen: ''Kernel hacking → Compile-time checks and compiler options → Debug information → None''. Die Oberfläche kennt die Auswahlgruppe und räumt die übrigen Einträge selbst ab – das ist der zuverlässigere Weg. | ||
=Kernel und Module übersetzen= | =Kernel und Module übersetzen= | ||
| Zeile 129: | Zeile 140: | ||
;Die Platte läuft voll | ;Die Platte läuft voll | ||
| − | Debug-Informationen sind noch eingeschaltet: | + | Debug-Informationen sind noch eingeschaltet. Prüfen: |
| − | *scripts/config --disable | + | *grep -E 'DEBUG_INFO' .config | grep -v '^#' |
| − | *scripts/config -- | + | |
| − | *make | + | Steht dort <code>CONFIG_DEBUG_INFO=y</code>, ist noch ein anderer Eintrag der Auswahlgruppe aktiv – meist <code>DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT</code>. Er muss mit abgeschaltet werden: |
| + | *scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT | ||
| + | *scripts/config --enable DEBUG_INFO_NONE | ||
| + | *make olddefconfig | ||
Bereits erzeugte Dateien aufräumen – <code>clean</code> behält die Konfiguration, <code>mrproper</code> löscht auch sie: | Bereits erzeugte Dateien aufräumen – <code>clean</code> behält die Konfiguration, <code>mrproper</code> löscht auch sie: | ||
| Zeile 158: | Zeile 172: | ||
* Schalten Sie die Debug-Informationen ab und begründen Sie, warum. | * Schalten Sie die Debug-Informationen ab und begründen Sie, warum. | ||
| − | <!-- Lösung: scripts/config --disable | + | <!-- Lösung: scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT; scripts/config --enable DEBUG_INFO_NONE; make olddefconfig -- reduziert den Platzbedarf von rund 50 auf rund 3 GByte und verkürzt die Bauzeit erheblich --> |
| + | |||
| + | * Kontrollieren Sie das Ergebnis. Warum genügt es nicht, DEBUG_INFO einfach zu deaktivieren? | ||
| + | <!-- Lösung: grep -E 'DEBUG_INFO' .config | grep -v '^#' -- DEBUG_INFO wird von einer Auswahlgruppe gesetzt; solange ein anderer Eintrag der Gruppe aktiv ist, stellt make olddefconfig den Wert wieder her --> | ||
* Geben Sie dem Kernel eine eigene Kennung. | * Geben Sie dem Kernel eine eigene Kennung. | ||
Version vom 24. August 2026, 17:09 Uhr
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.
Hier liegt eine Falle: DEBUG_INFO ist kein eigener Schalter, sondern wird von einer Auswahlgruppe gesetzt, in der genau ein Eintrag aktiv sein darf. scripts/config kennt diese Gruppen nicht und schaltet die Geschwister nicht ab – deshalb muss der bisher aktive Eintrag ausdrücklich mit deaktiviert werden. In Debians Konfiguration ist das DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT.
- scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
- scripts/config --enable DEBUG_INFO_NONE
- make olddefconfig
DEBUG_INFO_BTF fällt dabei von selbst weg, weil es Debug-Informationen voraussetzt.
Kontrolle – es darf nur noch CONFIG_DEBUG_INFO_NONE=y übrig bleiben:
- grep -E 'DEBUG_INFO' .config | grep -v '^#'
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_NONE' .config
Alternativ lässt sich die Debug-Information auch direkt in der Oberfläche einstellen: Kernel hacking → Compile-time checks and compiler options → Debug information → None. Die Oberfläche kennt die Auswahlgruppe und räumt die übrigen Einträge selbst ab – das ist der zuverlässigere Weg.
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-xinuxabgelegt update-initramfserzeugt die passende Initramfsupdate-grubnimmt 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. Prüfen:
- grep -E 'DEBUG_INFO' .config | grep -v '^#'
Steht dort CONFIG_DEBUG_INFO=y, ist noch ein anderer Eintrag der Auswahlgruppe aktiv – meist DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT. Er muss mit abgeschaltet werden:
- scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
- scripts/config --enable DEBUG_INFO_NONE
- make olddefconfig
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.
- Kontrollieren Sie das Ergebnis. Warum genügt es nicht, DEBUG_INFO einfach zu deaktivieren?
- 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?