Pochopenie jadra systému Linux
Linuxové jadro je jadrom operačného systému Linux. Obsahuje hlavné komponenty určené na hardvér a umožňuje komunikáciu aj interakciu medzi používateľom a hardvérom. Linuxové jadro nie je monolitický systém, ale je dosť flexibilné a jadro je rozšírené o takzvané moduly jadra.
Čo je to modul jadra?
Všeobecne platí, že modul jadra je „časť kódu, ktorú je možné na požiadanie načítať a vyložiť do jadra. Rozširujú funkčnosť jadra bez nutnosti reštartovania systému “[1]. To vedie k veľmi veľkej flexibilite počas prevádzky.
Ďalej „modul jadra môže byť nakonfigurovaný ako zabudovaný alebo načítateľný. Ak chcete modul dynamicky načítať alebo odstrániť, musí byť nakonfigurovaný ako načítateľný modul v konfigurácii jadra “[1]. To sa deje v zdrojovom súbore jadra / usr / src / linux /.konfigurácia [2]. Vstavané moduly sú označené „y“ a načítateľné moduly „m“. Ako príklad to ukazuje zoznam 1 pre modul SCSI:
Výpis 1: Vyhlásenie o použití modulu SCSI
CONFIG_SCSI = y # vstavaný modulCONFIG_SCSI = m # načítateľný modul
Premenná # CONFIG_SCSI # nie je nastavená
Neodporúčame upravovať konfiguračný súbor priamo, ale na definíciu použitia príslušného modulu v jadre Linuxu použite príkaz „make config“, „make menuconfig“ alebo „make xconfig“.
Príkazy modulu
Systém Linux je dodávaný s množstvom rôznych príkazov na prácu s modulmi jadra. Zahŕňa to zoznam modulov aktuálne načítaných do jadra systému Linux, zobrazovanie informácií o moduloch a tiež načítanie a vykladanie modulov jadra. Ďalej tieto príkazy vysvetlíme podrobnejšie.
Pre súčasné jadrá Linuxu poskytuje balík kmod nasledujúce príkazy [3]. Všetky príkazy sú symbolickými odkazmi na kmod.
Zoznam aktuálne načítaných modulov s lsmod
Začíname príkazom lsmod. lsmod skracuje „zoznam modulov“ a zobrazuje všetky moduly práve načítané do jadra Linuxu pekným formátovaním obsahu súboru / proc / modules. Výpis 2 zobrazuje jeho výstup, ktorý sa skladá z troch stĺpcov: názov modulu, veľkosť použitá v pamäti a ďalšie moduly jadra, ktoré používajú tento konkrétny.
Výpis 2: Používanie lsmod
$ lsmodVeľkosť modulu používa
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
…
$
Nájdite dostupné moduly pre vaše súčasné jadro
Môžu byť k dispozícii moduly jadra, o ktorých ešte neviete. Sú uložené v adresári / lib / modules. Pomocou nástroja find v kombinácii s príkazom uname môžete vytlačiť zoznam týchto modulov. “Uname -r” iba vypíše verziu aktuálne bežiaceho jadra Linuxu. Zoznam 3 to dokazuje pre staršiu verziu 3.16.0-7 Linux
jadra a zobrazuje moduly pre IPv6 a IRDA.
Výpis 3: Zobrazenie dostupných modulov (výber)
$ find / lib / modules / $ (uname -r) -name '*.ko '/ lib / moduly / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / irda / irnet / irnet.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / irda / irlan / irlan.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ko
/ lib / moduly / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
…
$
Zobraziť informácie o module pomocou modinfo
Príkaz modinfo vám povie viac o požadovanom module jadra („informácie o module“). Ako parameter vyžaduje modinfo buď úplnú cestu k modulu, alebo iba názov modulu. Výpis 4 to demonštruje pre jadrový modul IrDA, ktorý pracuje so zásobníkom protokolu Infrared Direct Access.
Výpis 4: Zobrazenie informácií o module
$ / sbin / modinfo irdanázov súboru: / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
alias: net-pf-23
licencia: GPL
description: The Linux IrDA Protocol Stack
autor: Dag Brattli
záleží: crc-ccitt
vermagic: 3.16.Modifikácie 0-7-amd64 SMP mod_unload
$
Výstup obsahuje rôzne informačné polia, ako je úplná cesta k modulu jadra, jeho alias, softvérová licencia, popis modulu, autori a interné prvky jadra. Pole „závisí“ zobrazuje, na ktorých ďalších moduloch jadra závisí.
Informačné polia sa líšia modul od modulu. Aby sa výstup obmedzil na konkrétne informačné pole, modinfo akceptuje parameter „-F“ (skratka pre „-field“), za ktorým nasleduje názov poľa. V zozname 5 je výstup obmedzený na licenčné informácie sprístupnené pomocou poľa licencie.
Výpis 5: Zobraziť iba konkrétne pole.
$ / sbin / modinfo -F licencia irdaGPL
$
V novších jadrách Linuxu je k dispozícii užitočná bezpečnostná funkcia. Toto sa týka kryptograficky podpísaných modulov jadra. Ako je vysvetlené na webovej stránke projektu Linux kernel [4], „toto umožňuje zvýšenú bezpečnosť jadra tým, že zakazuje načítanie nepodpísaných modulov alebo modulov
podpísané neplatným kľúčom. Podpisovanie modulov zvyšuje bezpečnosť tým, že sťažuje načítanie škodlivého modulu do jadra. Kontrolu podpisu modulu vykonáva jadro, takže nie je potrebné mať „dôveryhodné bity užívateľského priestoru.”Obrázok dole ukazuje toto pre
modul parport_pc.
Zobraziť konfiguráciu modulu pomocou modprobe
Každý modul jadra má konkrétnu konfiguráciu. Príkaz modprobe nasledovaný voľbou „-c“ (skratka pre „-showconfig“) vypíše konfiguráciu modulu. V kombinácii s grep je tento výstup obmedzený na konkrétny symbol. Zoznam 6 to demonštruje pre možnosti protokolu IPv6.
Výpis 6: Zobraziť konfiguráciu modulu
$ / 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 symbol: nf_defrag_ipv6_enable nf_defrag_ipv6
alias symbol: nf_nat_icmpv6_reply_translation nf_nat_ipv6
alias symbol: nft_af_ipv6 nf_tables_ipv6
alias symbol: nft_reject_ipv6_eval nft_reject_ipv6
$
Zobraziť závislosti modulu
Jadro Linuxu je navrhnuté modulárne a funkcionalita je distribuovaná do niekoľkých modulov. To vedie k niekoľkým závislostiam modulov, ktoré je možné znova zobraziť pomocou modprobe. Zoznam 7 používa možnosť „-show-depends“, aby vypísal zoznam závislostí pre modul i915.
Výpis 7: Zobraziť závislosti modulov
$ / sbin / modprobe --show-závisí na 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 / tlačidlo.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ko
$
Ak chcete zobraziť závislosti ako strom podobný príkazu „strom“ alebo „lsblk“, môže vám pomôcť projekt modtree [5] (strom modulov i915 nájdete na obrázku nižšie). Aj keď je voľne dostupný na GitHub, vyžaduje určité úpravy, aby vyhovoval pravidlám slobodného softvéru a stal sa súčasťou distribúcie Linuxu ako balík.
Načítavajú sa moduly
Načítanie modulu do bežiaceho jadra je možné vykonať pomocou dvoch príkazov - insmod („vložiť modul“) a modprobe. Uvedomte si, že medzi týmito dvoma je malý, ale dôležitý rozdiel: insmod nerieši závislosti modulu, ale modprobe je šikovnejší a robí to.
Výpis 8 ukazuje, ako vložiť modul jadra IrDA. Upozorňujeme, že insmode pracuje s úplnou cestou k modulu, zatiaľ čo modprobe je s menom modulu spokojný a vyhľadá ho v strome modulov aktuálneho jadra systému Linux.
Výpis 8: Vloženie modulu jadra
# insmod / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko…
# modprobe irda
Vykladanie modulov
Posledný krok sa týka vyloženia modulov z bežiaceho jadra. Pre túto úlohu sú opäť k dispozícii dva príkazy - modprobe a rmmod („odstrániť modul“). Oba príkazy očakávajú názov modulu ako parameter. Výpis 9 to ukazuje na odstránenie modulu IrDA z bežiaceho jadra Linuxu.
Výpis 9: Odstránenie modulu jadra
# rmmod irda…
# modprobe -r irda
…
Záver
Zaobchádzať s modulmi jadra Linuxu nie je veľké kúzlo. Stačí sa naučiť niekoľko príkazov a ste pánom kuchyne.
Ďakujem
Autor by chcel poďakovať Axelovi Beckertovi (ETH Zürich) a Saif du Plessis (Hothead Studio Cape Town) za pomoc pri príprave článku.
Odkazy a referencie
- [1] Modul jadra, Arch Linux wiki, https: // wiki.archlinux.org / index.php / Kernel_module
- [2] Konfigurácia jadra, https: // tldp.org / AKO / SCSI-2.4-AKO / kconfig.html
- [3] kmod, https: // git.jadro.org / pub / scm / utils / kernel / kmod / kmod.git
- [4] Podpisovacie zariadenie modulu jadra, https: // www.jadro.org / doc / html / v4.15 / príručka správcu / podpisovanie modulov.html
- [5] modtree, https: // github.com / falconindy / modtree