Update: 04.01.2019

Eigener (Custom-)Kernel mit Debian 9 Stretch Linux

Einführung

Reicht der Kernel, der mit der Distribution mitgeliefert wird, nicht aus, erzeugt man sich einen eigenen.

Die Methode mit kernel-package ist - ohne Einbindung von Unstable - bei Stretch hinfällig. Aufgrund von Bugs, welche nicht rechtzeitig behoben wurde, wurde entschieden das Package kernel-package nicht ins Repository aufzunehmen.

Von Debian angepasste Sourcen holt man sich mit apt-get. Die Original-Sourcen erhält man auf kernel.org. Optional liest man sich das Thema Kernel-Signatur durch.
Eine oft genutzte Methode findet sich im Debian Linux Kernel Handbook. Weitere Anleitungen finden sich oftmals auf Hilfeseiten zu den jeweiligen Distributionen.

Schritt für Schritt

Als erstes als root alle erforderlichen Packages installieren

# apt-get install build-essential fakeroot
# apt-get build-dep linux

Bei Nutzung der Sourcen aus dem Debian-Repository die aktuellen Sourcen downloaden und ins Sourcen-Verzeichnis wechseln

# apt-get source linux
# cd linux-4.12.65

Sollen alternativ die nicht von Debian veränderten Sourcen von kernel.org benutzt werden, entpackt man diese und wechselt ins Sourcen-Verzeichnis

# tar -xJf linux-4.20.tar.xz
# cd linux-4.20

Optional wird eine bestehende Konfigurationsdatei ins Sourcen-Verzeichnis kopiert

# cp /boot/config-4.19.9 .config

Dem Kernel werden laufend neue Features hinzugefügt oder alte entfernt. Um die alte Konfigurationsdatei anzupassen, läßt man sich die neuen Kernel-Optionen anzeigen und mit der gewünschten Auswahl versehen.

# make oldconfig

Ein reines ENTER wählt die Default-Auswahl.

Für nconfig wird ncurses installiert

# apt-get install libncurses5-dev

Mit nconfig lassen sich danach bei Bedarf die Kernel-Optionen einfacher anpassen

# make nconfig

Mit F6 speichern und mit F9 beenden.

Die meisten Nutzer werden den Kernel nicht debuggen, somit lässt sich Speicherplatz und Zeit einsparen, indem das Debug-Package nicht erstellt wird

# scripts/config --disable DEBUG_INFO

Nun kann der Kernel erzeugt werden

# make clean
# make deb-pkg

Zur parallelen Nutzung mehrerer CPU-Cores/-Kerne den Parameter -X verwenden (X steht für die Anzahl der Cores + 1; somit bei Dual-Core -j3, bei Quad-Core -j5, ...)

# make clean
# make -j3 deb-pkg

Mit einem vorangestellten time läßt sich die Kompilierungszeit verschiedener Systeme testen.

# make clean
# time make -j3 deb-pkg

Resultat:

dpkg-deb: Paket »linux-headers-4.20.0« wird in »../linux-headers-4.20.0_4.20.0-1_amd64.deb« gebaut.
dpkg-deb: Paket »linux-libc-dev« wird in »../linux-libc-dev_4.20.0-1_amd64.deb« gebaut.
dpkg-deb: Paket »linux-image-4.20.0« wird in »../linux-image-4.20.0_4.20.0-1_amd64.deb« gebaut.
dpkg-genbuildinfo
dpkg-genchanges >../linux-4.20.0_4.20.0-1_amd64.changes
dpkg-genchanges: Warnung: Paket linux-image-4.20.0-dbg in Steuerdatei, aber nicht in Dateiliste
dpkg-genchanges: Information: kompletter Quellcode beim Hochladen hinzufügen
dpkg-source -i.git --after-build linux-4.20
dpkg-buildpackage: Information: Alles hochzuladen (Originalquellen enthalten)
real 69m29,780s user 111m22,412s sys 10m29,769s

Abschließend das gebaute Kernel-Image installieren und den PC neustarten.

# dpkg -i linux-headers-4.20.0_4.20.0-1_amd64.deb
# dpkg -i linux-libc-dev_4.20.0-1_amd64.deb
# dpkg -i linux-image-4.20.0_4.20.0-1_amd64.deb

Alternativ zur Installation aller generierten Kernel-Debs

# dpkg -i *.deb

Hinweise

Kernel-Version eruieren

Die aktuell genutzte Kernel-Version lässt sich mit uname -a herausfinden

# uname -a
Linux debian 4.19.9 #1 SMP Sun Dec 16 18:42:00 CET 2018 x86_64 GNU/Linux

.config neu erstellen

Sollte man keine config haben, lässt sich eine neue erzeugen. Damit fällt jedoch die von Debian-Maintainern getroffene Default-Auswahl weg und es wird die der Kernel-Maintainer genommen. Entweder erzeugt man eine durch Aufruf von make menuconfig und anschließendem Speichern (Save) oder durch automatische Auswahl der empfohlenen Einstellungen mit yes "" | make oldconfig:

# make menuconfig

oder

# yes "" | make oldconfig

BumbleBee / NVIDIA

Nach einem Kernel-Update wird man eventuell Kernelmodule neu erstellen müssen, falls der Package-Manager diesen Vorgang nicht von selbst startet. Bei Nutzung eines NVIDIA-DKMS-Moduls bei z.B. BumbleBee stößt man - vorausgesetzt DKMS-Sourcen-Package nvidia-kernel-dkms ist installiert - den Bau der NVIDIA-DKMS-Module neu an. Als root

# dpkg-reconfigure nvidia-kernel-dkms

Es werden jedoch nur Kernel unterstützt zu denen die DKMS-Sourcen kompatibel sind. Bei den anderen wird mit einer Fehlermeldung abgebrochen. Somit primär für Kernel nützlich, die auch im Repository angeboten werden. Bei Nutzung eines Kernels ohne passendes DKMS-Modul wird bei Aufruf von optirun die Fehlermeldung Cannot access secondary GPU - error: Could not load GPU driver aufgerufen, weil kein passender binärer Treiber kompiliert und geladen werden konnte.