out-of-tree Kernelmodule mit akms
Mo, 24. April 2023, Lioh Möller
Einige Kernelmodule stehen nicht im Upstream-Kernel zur Verfügung und müssen manuell übersetzt und hinzugefügt werden. Dies ist oftmals bei proprietären WLAN-Treibern der Fall.
Im folgenden Beispiel geht es um die wl Treiber, welche für den Betrieb einiger Broadcom-Adapter benötigt werden. Dabei stehen für einige Hardwaremodelle Freie Treiber zur Verfügung, für andere jedoch nicht.
Auch die Freien Treiber benötigen üblicherweise unfreie Firmware. Zunächst sollte versucht werden, ob der brcmsmac Treiber infrage kommt. Sollte dies der Fall sein, lässt sich der Adapter standardmässig nutzen, sofern das passende Firmware Paket vorhanden ist. Unter Alpine Linux wäre dies linux-firmware-brcm, welches bereits mitinstalliert wird.
Bei Modellen welche den b43 Treiber benötigen muss die Firmware mithilfe von der Anwendung b43-fwcutter extrahiert werden.
In diesem Beispiel würde der Adapter des Typs BCM4313 zwar mit dem Freien brcmsmac Treiber funktionieren, es kommt dabei allerdings immer wieder zu Verbindungsabbrüchen.
Besser hingegen funktioniert das Gerät mit den broadcom-wl Treibern, welche nicht im offiziellen Kernel-Tree vorhanden sind.
Zur Übersetzung der Quellen müssen zunächst die passenden Kernel-Header und Werkzeuge installiert werden:
apk add alpine-sdk linux-lts-dev
Daraufhin kann das Treiber-Repository gecloned werden:
git clone https://github.com/antoineco/broadcom-wl.git /usr/src/wl
Zum manuellen Übersetzen und der Installation des Treibers, kann wie folgt vorgegangen werden:
cd /usr/src/wl
make
make install
depmod -A
modprobe wl
Allerdings müsste bei jeder Kernel-Aktualisierung der Treiber neu übersetzt und installiert werden.
Viele Linux-Distributionen bieten dazu dkms an, welches unter Alpine Linux nicht vorhanden ist. Als Alternative steht akms zur Verfügung, welches zunächst installiert werden muss:
apk add akms
Daraufhin kann eine entsprechende AKMBUILD Definition im Quellverzeichnis des Treibers erstellt werden:
vi /usr/src/wl/AKMBUILD
modname=wl
built_modules='wl.ko'
modver=6.30.223.271
build() {
touch "$builddir"/Makefile
make $MAKEFLAGS -C "$kernel_srcdir" M="$builddir" src="$srcdir" modules
Die Parameter müssen je nach zu übersetzenden Kernelmodul angepasst werden.
Daraufhin kann das Modul mithilfe von akms übersetzt und installiert werden:
akms install wl
Nun wird nach einer Kernel-Aktualisierung das Modul beim Systemstart automatisch übersetzt und in das System eingebunden.
Quelle: https://github.com/jirutka/akms/