Razumijevanje Linux jezgre
Jezgra Linuxa jezgra je operativnog sustava Linux. Sadrži glavne komponente za rješavanje hardvera i omogućuje komunikaciju i interakciju između korisnika i hardvera. Linux kernel nije monolitni sustav, već je prilično fleksibilan, a jezgra je proširena takozvanim kernel modulima.
Što je modul jezgre?
Općenito, modul jezgre je „dio koda koji se može učitati i istovariti u kernel na zahtjev. Proširuju funkcionalnost jezgre bez potrebe za ponovnim podizanjem sustava ”[1]. To dovodi do vrlo velike fleksibilnosti tijekom rada.
Nadalje, „modul jezgre može se konfigurirati kao ugrađeni ili za učitavanje. Da bi se dinamički učitao ili uklonio modul, on mora biti konfiguriran kao modul koji se može učitati u konfiguraciji jezgre ”[1]. To se radi u izvornoj datoteci jezgre / usr / src / linux /.konfiguracija [2]. Ugrađeni moduli označeni su s "y", a moduli za učitavanje s "m". Kao primjer, popis 1 pokazuje ovo za SCSI modul:
Popis 1: Izjava o upotrebi SCSI modula
CONFIG_SCSI = y # ugrađeni modulCONFIG_SCSI = m # modul koji se može učitati
# CONFIG_SCSI # varijabla nije postavljena
Ne preporučujemo izravno uređivanje konfiguracijske datoteke, već da biste upotrijebili bilo naredbu "make config", "make menuconfig" ili "make xconfig" za definiranje upotrebe odgovarajućeg modula u Linux kernelu.
Naredbe modula
Linux sustav dolazi s nizom različitih naredbi za rukovanje modulima jezgre. To uključuje popis modula koji su trenutno učitani u jezgru Linuxa, prikaz podataka o modulima, kao i učitavanje i iskrcavanje modula jezgre. U nastavku ćemo detaljnije objasniti ove naredbe.
Za trenutne Linux jezgre, sljedeće naredbe pruža paket kmod [3]. Sve su naredbe simboličke poveznice s kmod.
Popis trenutno učitanih modula s lsmod
Počinjemo s naredbom lsmod. lsmod skraćuje "popis modula" i prikazuje sve module koji su trenutno učitani u Linux kernel lijepim formatiranjem sadržaja datoteke / proc / modules. Popis 2 prikazuje svoj izlaz koji se sastoji od tri stupca: naziv modula, veličina koja se koristi u memoriji i drugi moduli jezgre koji koriste ovaj specifični.
Popis 2: Korištenje lsmod
$ lsmodVeličina modula koji koristi
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
..
$
Pronađite dostupne module za vašu trenutnu jezgru
Možda su dostupni moduli jezgre kojih još niste svjesni. Pohranjeni su u direktorij / lib / module. Uz pomoć pronalaska, u kombinaciji s naredbom uname, možete ispisati popis tih modula. “Uname -r” samo ispisuje verziju trenutno pokrenutog Linux jezgre. Popis 3 to pokazuje za starije 3.16.0-7 Linux
kernel i prikazuje module za IPv6 i IRDA.
Popis 3: Prikaz dostupnih modula (odabir)
$ find / lib / modules / $ (uname -r) -name '*.ko '/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irnet / irnet.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irlan / irlan.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
..
$
Prikažite informacije o modulu pomoću modinfo
Naredba modinfo govori vam više o zatraženom modulu kernela ("informacije o modulu"). Kao parametar, modinfo zahtijeva puni put modula ili jednostavno ime modula. Popis 4 pokazuje to za IrDA modul jezgre koji se bavi stekom protokola infracrvenog izravnog pristupa.
Popis 4: Prikaz podataka o modulu
$ / sbin / modinfo irdanaziv datoteke: / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
alias: net-pf-23
licenca: GPL
opis: Linux IrDA protokolni stog
autor: Dag Brattli
ovisi: crc-ccitt
vermagic: 3.16.0-7-amd64 SMP mod_unload modversions
$
Izlaz sadrži različita informacijska polja poput pune staze za modul jezgre, njegovo alias ime, softversku licencu, opis modula, autore, kao i unutarnje dijelove jezgre. Polje "ovisi" pokazuje o kojim ostalim modulima jezgre ovisi.
Informacijska polja razlikuju se od modula do modula. Da bi ograničio izlaz na određeno informacijsko polje, modinfo prihvaća parametar "-F" (kratica za "-polje") iza kojeg slijedi naziv polja. Na popisu 5, izlaz je ograničen na informacije o licenci dostupne pomoću polja licence.
Popis 5: Prikažite samo određeno polje.
$ / sbin / modinfo -F licenca irdaGPL
$
U novijim Linuxovim jezgrama dostupna je korisna sigurnosna značajka. Ovo pokriva kriptografski potpisane module jezgre. Kao što je objašnjeno na web mjestu projekta Linux kernel [4], „ovo omogućuje povećanu sigurnost kernela onemogućavanjem učitavanja nepotpisanih modula ili modula
potpisan nevažećim ključem. Potpisivanje modula povećava sigurnost otežavanjem učitavanja zlonamjernog modula u jezgru. Provjeru potpisa modula vrši kernel tako da nije potrebno imati „pouzdane bitove korisničkog prostora."Donja slika to pokazuje za
modul parport_pc.
Prikažite konfiguraciju modula pomoću modprobe
Svaki modul jezgre dolazi s određenom konfiguracijom. Naredba modprobe praćena opcijom "-c" (skraćeno od "-showconfig") navodi konfiguraciju modula. U kombinaciji s grep, ovaj je izlaz ograničen na određeni simbol. Popis 6 to pokazuje za IPv6 opcije.
Popis 6: Prikaži konfiguraciju modula
$ / sbin / modprobe -c | grep ipv6alias net_pf_10_proto_0_type_6 dccp_ipv6
alias net_pf_10_proto_33_type_6 dccp_ipv6
alias nf_conntrack_10 nf_conntrack_ipv6
alias nf_nat_10 nf_nat_ipv6
alias nft_afinfo_10 nf_tables_ipv6
alias nft_chain_10_nat nft_chain_nat_ipv6
alias nft_chain_10_route nft_chain_route_ipv6
alias nft_expr_10_reject nft_reject_ipv6
alias simbol: nf_defrag_ipv6_enable nf_defrag_ipv6
alias simbol: nf_nat_icmpv6_reply_translation nf_nat_ipv6
alias simbol: nft_af_ipv6 nf_tables_ipv6
alias simbol: nft_reject_ipv6_eval nft_reject_ipv6
$
Prikaži ovisnosti modula
Linux kernel je dizajniran da bude modularan, a funkcionalnost je raspoređena na više modula. To dovodi do nekoliko ovisnosti modula koje se mogu ponovno prikazati pomoću modprobe. Popis 7 koristi opciju “-show-ovisi” kako bi se popisale ovisnosti za modul i915.
Popis 7: Prikaži ovisnosti modula
$ / sbin / modprobe --show-ovisi i915insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / i2c-core.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / algos / i2c-algo-bit.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / thermal / thermal_sys.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm_kms_helper.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / video.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / gumb.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ko
$
Kako bi se ovisnosti prikazale kao stablo slično naredbi "stablo" ili "lsblk", projekt modtree [5] može vam pomoći (pogledajte donju sliku za stablo modula i915). Iako je besplatno dostupan na GitHubu, zahtijeva neke prilagodbe kako bi se udovoljilo pravilima za besplatni softver i kako bi postao dio Linux distribucije kao paket.
Učitavanje modula
Učitavanje modula u pokrenutu jezgru može se izvršiti pomoću dvije naredbe - insmod (“insert module”) i modprobe. Imajte na umu da postoji mala, ali važna razlika između ovo dvoje: insmod ne rješava ovisnosti o modulima, ali modprobe je pametniji i to čini.
Popis 8 pokazuje kako umetnuti IrDA modul jezgre. Imajte na umu da insmode radi s punom stazom modula, dok je modprobe zadovoljan imenom modula i sam ga traži u stablu modula za trenutni Linux kernel.
Popis 8: Umetanje modula jezgre
# insmod / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko..
# modprobe irda
Istovar modula
Posljednji se korak bavi istovarom modula iz pokrenutog jezgra. Ponovno su za ovaj zadatak dostupne dvije naredbe - modprobe i rmmod ("ukloni modul"). Obje naredbe očekuju naziv modula kao parametar. Popis 9 to pokazuje za uklanjanje IrDA modula iz pokrenutog Linux kernela.
Popis 9: Uklanjanje modula jezgre
# rmmod irda..
# modprobe -r irda
..
Zaključak
Rukovanje Linux kernel modulima nije velika čarolija. Samo nekoliko naredbi za naučiti, a vi ste gospodar kuhinje.
Hvala vam
Autor se zahvaljuje Axelu Beckertu (ETH Zürich) i Saifu du Plessisu (Hothead Studio Cape Town) na pomoći tijekom pripreme članka.
Poveznice i reference
- [1] Modul jezgre, wiki Arch Linux, https: // wiki.Archlinux.org / indeks.php / modul_ Kernel
- [2] Konfiguracija jezgre, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
- [3] kmod, https: // git.zrno.org / pub / scm / utils / kernel / kmod / kmod.git
- [4] Objekt za potpisivanje modula jezgre, https: // www.zrno.org / doc / html / v4.15 / admin-vodič / potpisivanje modula.html
- [5] modtree, https: // github.com / falconindy / modtree