Compile kernel module (Bosanski)
Nekad možda poželiš kompajlirati Linux kernel modul bez da rekompajliras cijeli kernel.
Build okruženje
Prvo moraš instalirati potrebne build dependency-e poput kompajlera(base-devel) i linux-headers.
Sljedeće moraš preuzeti source code kernela kojeg koristiš. Možeš pokušati noviji kernel nego što koristiš ali su velike šanse da se module neće loadati.
Pronađi kernel verziju sa
$ uname -r
Onda preuzmi potrebne source codove, vidi Kernels/Traditional compilation#Download the kernel source. Ukoliko skineš zadnji source koristeći Git, potrebno je checkout potrebnu verziju koristeći tag (npr. v4.1).
Source konfiguracija
Kada imaš source code, uđi u taj folder i clean ga sa (pobrisat će .config.old i promijeniti naziv .config u .config.old)
$ make mrproper
Zatim je potrebno kopirati .config trenutnog kernel u ovaj folder koristeći
$ cp /usr/lib/modules/$(uname -r)/build/.config ./ $ cp /usr/lib/modules/$(uname -r)/build/Module.symvers ./
Zatim, pobrini se da je konfiguracija podešena za kernel source-ove (ako koristiš kernel source za tačnu verziju, onda ne bi trebalo ništa da pita, ali noviji source-ovi nego trenutni kernel mogu pitati za nove opcije)
Također, ukoliko modul koji želiš da kompajliraš ima neke kompilacijske opcije poput debug build možeš ih podesiti sa bilo kojim alatom od make config/menuconfig/xconfig (vidi README)
$ make oldconfig
Kompajliranje module
Da bi se modul učitao propisno, morate naći tačnu verziju EXTRAVERSION komponente trenutne verzije kernela da biste mogli matchati tačne verzije u kernel source-u. EXTRAVERSION je variabla koja je smještena na vrhu Makefile, ali Makefile u vanilla kernelu će EXTRAVERSION biti prazna; podešena je u dijelu Arch kernel build procesa. Vrijednost EXTRAVERSION trenutnog kernela (obično -1
) može se naći na jedan od dva načina:
- Na vrhu
/usr/lib/modules/$(uname -r)/build/Makefile
fajla - Ukucaj
uname -r
i pogledaj između trećeg broja verzije i-ARCH
(Arch specifično podešenje LOCALVERSION podešeno u .config fajlu). Npr, sa kernel verzijom4.9.65-1-ARCH
, EXTRAVERSION je-1
.
Nakon što je EXTRAVERSION poznat, pripremimo source za kompajlirano modula:
$ make EXTRAVERSION=<TVOJA EXTRAVERSION OVDJE> modules_prepare
Primjer:
$ make EXTRAVERSION=-1 modules_prepare
Alternativno, ako sretni da učitate module sa modprobe koristeći --force-vermagic
opciju da se ignoriše nepoklapanje u verziji kernela, možete jednostavno pokrenuti:
$make modules_prepare
/usr/lib/modules/$(uname -r)/build/Makefile
se može kopirati preko Makefile u kernel source da se izbjegne manuelna specifikacija EXTRAVERSION na cli, to može prouzrokovati da se dogodi nepoklapanje kernel verzije. Ako je kernel source dobijen koristeći version control alat, poput git-a, jednostavno kopiranje Makefile-a bi učinilo da working kopija bude dirty, koji će kernel build proces prepoznati, te će appendati +
u LOCALVERSION konfiguracijsku varijablue. Npr. 4.9.65-1-ARCH+
.Na kraju, kompajlirajte željeni module time što navedete njegov folder. (Možete pronaći lokaciju modula koristeći modinfo ili find)
$ make M=fs/btrfs
out-of-tree kompajliranje module
preuzmi oficijalni source code trenutnog linux kernela kao što je opisano u Kernel/Arch build system:
$ cd && mkdir build $ pkgctl repo clone linux
zatim usmjeri na checkirani source prilikom kompajliranja modula:
$ cd build/mymod $ make -C ~/build/linux/src/archlinux-linux M=$PWD modules
Instaliranje module
Sada, nakon uspješnog kompajliranja module samo morate gzip i kopirati u svoj trenutni kernel.
Ukoliko zamjenjujete neki već postojeći module, morate ga prepisati (zapamtite da reinstaliranje linux će ga zamijeniti sa defaultnim modulom)
$ xz fs/btrfs/btrfs.ko # cp -f fs/btrfs/btrfs.ko.xz /usr/lib/modules/$(uname -r)/kernel/fs/btrfs/
Alternativno, možete staviti update-ovani module u updates folder (kreirajte ga ukoliko ne postoji).
$ cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/$(uname -r)/updates
Ako dodajete novi modul, možete ga samo kopirati u extramodules (note, ovo je samo primjer jer se btrfs neće loadati odavde)
# cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/$(uname -r)/extramodules/
Ako kompajlirate module za rani boot (npr. updated modul) koji je kopirati u Initramfs onda morate regenerisati sa njim (u suprotnom, module se neće loadati). Dalje, ukoliko koristite "updates" folder metodu, možda ćete morati rebuildati modul dependency tree sa "depmod" prije regenerisanja Initramfs.
# mkinitcpio -p linux
mogući errori
Ako EXTRAVERSION nije ispravno podešena, sljedeći error se mogu pojaviti
# insmod mymod.ko insmod: ERROR: could not insert module mymod.ko: Invalid module format # modprobe mymod modprobe: ERROR: could not insert 'mymod': Exec format error
dodavanje force-vermagic ignoriše mismatch verzije
modprobe mymod --force-vermagic