Sziasztok!
Raspberry Pi Zero-n szeretnék betölteni egy patch-cselt kernel modult, de sajnos eddig minden próbálkozásom kudarcot vallott.
Az USB gadget mód egyik moduljához van egy régebbi patch amit teszteni szeretnék. A patch kódját már portoltam az aktuális kernel verzióra, és szerencsére egyszerű dolgom is volt mert nem konfliktolt semmi más változással, és maga a patcs-cselt kód is tisztán fordult.
Ami a Zero-t illeti, használtam rajta az rpi-update scriptet és így most "5.4.44+"-es kernelt futtat.
Fogtam a https://github.com/raspberrypi/linux.git tárolót, leklónoztam, átváltottam az rpi-5.4.y branch-re, fogtam a Pi Zero-s default configot mivel sajnos az rpi-update-es kernelben nincs /proc/config.gz), alkalmaztam a patch-cset és leforgattam a kernelt és a modulokat.
Tesztelésképpe megpróbáltam egy modult betölteni, ami viszont már sajnos nem sikerült:
root@zero:/data/git-clean-rpi-linux# insmod ./drivers/net/usb/cdc_mbim.ko
insmod: ERROR: could not insert module ./drivers/net/usb/cdc_mbim.ko: Invalid module format
root@zero:/data/git-clean-rpi-linux# dmesg -T | tail -n 1
[Fri Jul 3 10:23:59 2020] cdc_mbim: disagrees about version of symbol module_layout
Annak ellenére, hogy a hivatalos és az általam fordított modul szinte teljesen megegyezik:
root@zero:/data/git-clean-rpi-linux# uname -a
Linux zero 5.4.44+ #1320 Wed Jun 3 16:01:17 BST 2020 armv6l GNU/Linux
root@zero:/data/git-clean-rpi-linux# modinfo ./drivers/net/usb/cdc_mbim.ko
filename: /data/git-clean-rpi-linux/./drivers/net/usb/cdc_mbim.ko
license: GPL
description: USB CDC MBIM host driver
author: Bjørn Mork <bjorn@mork.no>
author: Greg Suarez <gsuarez@smithmicro.com>
srcversion: E78127BCABE41799AC5303D
alias: usb:v*p*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v1BC7p1041d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v03F0pA31Dd*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v12D1p*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v0BDBp*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v*p*d*dc*dsc*dp*ic02isc0Dip00in*
depends: cdc_ncm,cdc-wdm
intree: Y
name: cdc_mbim
vermagic: 5.4.44+ mod_unload modversions ARMv6 p2v8
root@zero:/data/git-clean-rpi-linux# modinfo /lib/modules/5.4.44+/kernel/drivers/net/usb/cdc_mbim.ko
filename: /lib/modules/5.4.44+/kernel/drivers/net/usb/cdc_mbim.ko
license: GPL
description: USB CDC MBIM host driver
author: Bjørn Mork <bjorn@mork.no>
author: Greg Suarez <gsuarez@smithmicro.com>
srcversion: E78127BCABE41799AC5303D
alias: usb:v*p*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v1BC7p1041d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v03F0pA31Dd*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v12D1p*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v0BDBp*d*dc*dsc*dp*ic02isc0Eip00in*
alias: usb:v*p*d*dc*dsc*dp*ic02isc0Dip00in*
depends: cdc_ncm,cdc-wdm
intree: Y
name: cdc_mbim
vermagic: 5.4.44+ mod_unload modversions ARMv6 p2v8
root@zero:/data/git-clean-rpi-linux#
Több problémamegoldási módszert is próbáltam a helyzet feloldására, mivel pár hibát én is elkövettem a munkám során:
- egy Raspberry Pi 2-n forgattam le a kernelt és a modulokat először. Most már magán a Zero-n forgatom
- a kernel header-ökből először a korábbi (rendszer által szállított) verzió headerjei voltak fent, de ezt lecseréltem azokra amik a git-es kernelforráshoz tartoztak, és rebuildeltem a kernelt és a modulokat
A fentiek ellenére továbbra sem tudom betölteni a frissen forgatott modulokat a futó rpi-update-es kernel mellé.
Van esetlek valamelyőtöknek ötlete, hogy mit felejthettem el, illetve mit próbálhatnék még meg?
Hozzászólások
elvileg azzal a kernel-header-rel kell lefordítani a modult, ami ahhoz a kernelhez tartozik, amelyikkel a modult használni akarjuk. (ugyebár, ha saját modult használunk, kernel frissítés után nem elég a .ko fájlt bemásolni a modulokhoz, hanem újra kell fordítani a modult is, és csak utána bemásolni)
-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
Ahogy láthattad, a verziók stimmelnek.
Az rpi-update-es kernel pedig elvileg abból a forrásból fordul, amivel én is dolgozom.
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
Az egyezó verzió és forrás kevés. A konkrét .config-nak és a compilernek is ugyanannak kell lennie. Ezt leginkább úgy lehet elérni, ha konkrétan ott fordítod a kernelt is, meg hozzá a modult is, és aztán őket együtt használod.
B) variáns, hogy a modulopcióknál kikapcsolod a kernel symbol versioninget, és amikor az eltérésekből így nem betöltési hiba, hanem crash lesz, akkor annak örülsz...
nem tudom működik-e még ez a scriptem, ezer éve nem néztem meg. Ha működik, akkor az eredményeképp elvileg ott lesz a "gyári" kernel forrás úgy felparaméterezve, ahogy fordították.
https://gist.github.com/azbesthu/3893319
Talán van benne pár dolog, ami segíthet.
Ja és közben meglett, be kell tölteni egy modult, hogy elérhető legyen a config.gz
sudo modprobe configs
Köszönöm, megnézem és visszajelzek. A kernel forgatása kb. 1 nap, úgyhogy lehet, hogy lesz egy kis delay.
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
ha csak egy adott modul kell neked akkor nemkell az egesz kernelt ujraforgatni (felteve hogy a patch csak a modul kodba nyult bele), csak a maket kell megfeleloen parameterezni. most igy elsore ezt talaltam: https://yoursunny.com/t/2018/one-kernel-module/ (6-os pont), https://itectec.com/ubuntu/ubuntu-how-recipe-to-build-only-one-kernel-module/, vagy megcsinalhatod hogy a kivant modul forrasat kimasolod egy dirbe a kernelsrc-bol, es ott forditod le: https://qnaplus.com/how-to-compile-linux-kernel-module/, vagy igy: https://stackoverflow.com/questions/34379013/insmod-error-inserting-hello-ko-1-invalid-module-format
szerintem ez megoldja az invalid module format hibadat is, mert igy a jo kernel-headerrel lesz buildelve
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
Ezt a guide-ot próbáltam meg követni szinte szó szerint, de az eredmény nem változott:
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
Guide:
- letöltöd és telepíted a bináris kernelt modulokkal
- letöltöd a kernel forrást
- bekapcsolod pont ugyanazokat a kapcsolókat (.config)
- lefordítod a modulodat ebben a környezetben
- telepíted a lefordított modulodat
Ez elvileg működhet, feltéve, hogy ugyanazt a környezetet sikerül előállítanod (ugyanaz a forrás, ugyanaz a compiler, ugyanaz a .config).
Az, ami viszont egészen biztosan működik:
- letöltöd a kernel forrást
- bekapcsolod azokat a kapcsolókat, amiket szeretnél
- lefordítod a kernel és a modulokat
- telepíted a lefordított kernelt és a modulokat
- lefordítod a modulodat ebben a környezetben
- telepíted a lefordított modulodat
A következő próbálkozás valószínűleg az lesz, hogy lecserélem a gyári kernelt saját fordításúra, és akkor úgy biztosan be fogja tudni tölteni a saját fordítású modulokat.
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
Nos igen, végül az lett a kicsit brute force megoldás, hogy a kernelt is leforgattam és telepítettem.
Eredetileg az lett volna a célom, hogy USB gadget mode-dal emulálok a Pi Zero-n egy soros portot, egy ethernet csatolót és egy DVD-ROM meghajtót.
A nagy koncepció az volt, hogy "Milyen menő lenne ha egy pendrive-szerű eszközről tudnék iso fájlokból DVD-olvasót emulálni... Adott esetben a bebootolt live rendszer alól módosítva, hogy a legközelebbi bootkor milyen iso-t mutasson a Pi Zero.". Sajnos ez annyiban nem jött össze, hogy az USB gadget mode mass_storage üzemmódja csak az CD-ROM formátum által megengedett maximális méretig kezeli az iso-kat. Ez azt hiszem kb 2.4 GB. Az ennél nagyobb DVD iso-kat nem szereti. Ehhez találtam egy patch-készletet, ami elvileg engedi a nagyobb DVD iso-k használatát. A patch-et nem olvasztották be a mainline kernelbe és a RPi alapítvány is visszautasította az arra vonatkozó kérést, hogy ők tartsák karban, szóval ez jelenleg in the wild kering csupán. Megpróbáltam átportolni a mostani aktuális kernelbe, ami sikerült is, legalábbis annyiban, hogy warning nélkül fordul. A belső működéséhez nem teljesen értek sajnos. A tesztjeim során kiderül, hogy a modul crash-selt, amikor egy 11 GB-os CentOS iso-t próbáltam kiajánlani. A crash így néz ki:
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
Mivel az rpi-update-es kernellel (5.4.44+) próbálkoztam eredetileg, és azzal nem sikerült, így fogtam magam és egy friss telepítésű raspbian-nal próbálkoztam újra.
Az alapértelmezett kernel forrását sikeresen lehúztam a github-os scripted segítségével, de a forgatás után a modulokat továbbra sem sikerült betöltenem sajnos.
A következő próbálkozás valószínűleg az lesz, hogy lecserélem a gyári kernelt saját fordításúra, és akkor úgy biztosan be fogja tudni tölteni a saját fordítású modulokat.
... The vision and the mission lost,
For those with corporate souls ...
Slackware Linux current | 5.10.38-janos
A kernel git hash-nek ugyan annak kell lennie, meg a confignak is. Amúgy nem fog betöltődni.
Amúgy meg nincs kernel source csomag a distródban? Azt szedd le, ne a gitről húzd le. /usr/src/kernel-ben szépen ott lesz egy forrás amiben 'make modules_prepare' után azt forgatsz amit akarsz.