A Linux kernel megértése
A Linux kernel a Linux operációs rendszer magja. Ez tartalmazza a hardver kezelésének fő összetevőit, és lehetővé teszi mind a kommunikációt, mind az interakciót a felhasználó és a hardver között. A Linux kernel nem monolit rendszer, de meglehetősen rugalmas, és a kernt kibővítik úgynevezett kernelmodulok.
Mi az a kernelmodul?
Általában a kernelmodul egy „kóddarab, amelyet igény szerint be lehet tölteni és kirakni a kernelbe. Kiterjesztik a kernel funkcionalitását a rendszer újraindítása nélkül ”[1]. Ez nagyon nagy rugalmassághoz vezet működés közben.
Továbbá „egy kernelmodul beépítettként vagy betölthetőként konfigurálható. A modul dinamikus betöltéséhez vagy eltávolításához be kell állítani betölthető modulként a kernel konfigurációjában ”[1]. Ez a kernel forrásfájljában történik / usr / src / linux /.konfiguráció [2]. A beépített modulokat "y", a betölthető modulokat "m" jelöli. Például az 1. felsorolás bemutatja ezt az SCSI modul esetében:
1. lista: SCSI modul használati nyilatkozata
CONFIG_SCSI = y # beépített modulCONFIG_SCSI = m # betölthető modul
A # CONFIG_SCSI # változó nincs beállítva
Nem javasoljuk a konfigurációs fájl közvetlen szerkesztését, hanem a „make config”, a „make menuconfig” vagy a „make xconfig” parancs használatával határozhatja meg a megfelelő modul használatát a Linux kernelben.
Modulparancsok
A Linux rendszer számos különféle parancsot tartalmaz a kernelmodulok kezelésére. Ez magában foglalja a jelenleg a Linux kernelbe töltött modulok felsorolását, a modul információk megjelenítését, valamint a kernel modulok be- és kirakodását. Az alábbiakban részletesebben elmagyarázzuk ezeket a parancsokat.
A jelenlegi Linux kernelek esetében a következő parancsokat a kmod csomag biztosítja [3]. Az összes parancs szimbolikus hivatkozás a kmod-ra.
Az aktuálisan betöltött modulok listája az lsmod paranccsal
Az lsmod paranccsal indulunk. Az lsmod rövidíti a „list modulokat”, és megjeleníti az összes jelenleg a Linux kernelbe töltött modult a fájl / proc / modules tartalmának szép formázásával. A 2. lista a kimenetét mutatja, amely három oszlopból áll: a modul nevéből, a memóriában használt méretből és más ezt a kernelt tartalmazó modulokból.
2. lista: Az lsmod használata
$ lsmodA modul mérete
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
…
$
Keresse meg az aktuális kernel számára elérhető modulokat
Előfordulhat, hogy olyan kernelmodulok állnak rendelkezésre, amelyekről még nem tudott. A / lib / modules könyvtárban vannak tárolva. A find segítségével az uname paranccsal kombinálva kinyomtathatja ezeknek a moduloknak a listáját. Az „uname -r” csak kinyomtatja a jelenleg futó Linux kernel verzióját. A 3. felsorolás ezt bizonyítja egy idősebb 3 esetében.16.0-7 Linux
kernel, és megmutatja az IPv6 és az IRDA moduljait.
3. lista: A rendelkezésre álló modulok megjelenítése (kiválasztás)
$ 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
…
$
Modulinformációk megjelenítése a modinfo segítségével
A modinfo parancs többet megtud a kért kernelmodulról („modulinformációk”). Paraméterként a modinfo vagy a teljes modul elérési útját, vagy egyszerűen a modul nevét igényli. A 4. lista ezt mutatja az IrDA kernelmodul esetében, amely az infravörös közvetlen hozzáférés protokoll veremével foglalkozik.
4. lista: A modul adatainak megjelenítése
$ / sbin / modinfo irdafájlnév: / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
álnév: net-pf-23
licenc: GPL
leírás: A Linux IrDA protokoll verem
szerző: Dag Brattli
függ: crc-ccitt
vermágikus: 3.16.0-7-amd64 SMP mod_unload modversions
$
A kimenet különböző információs mezőket tartalmaz, például a kernel modul teljes elérési útját, annak álnevét, szoftverlicencét, modulleírását, szerzőit, valamint a kernel belső részét. A „függ” mező megmutatja, hogy mely más kernelmoduloktól függ.
Az információs mezők modulonként eltérőek. Annak érdekében, hogy a kimenetet egy adott információmezőre korlátozza, a modinfo elfogadja a „-F” (rövidítve: -field) paramétert, amelyet a mező neve követ. Az 5. listában a kimenet a licencmező használatával elérhető licencinformációkra korlátozódik.
5. lista: Csak egy adott mező megjelenítése.
$ / sbin / modinfo -F licenc irdaGPL
$
Az újabb Linux kernelekben hasznos biztonsági funkció érhető el. Ez magában foglalja a kriptográfia aláírású kernelmodulokat. Amint azt a Linux kernel projekt webhelyén [4] kifejtették, „ez lehetővé teszi a kernel fokozott biztonságát azáltal, hogy tiltja az aláíratlan modulok vagy modulok betöltését
érvénytelen kulccsal írták alá. A modul aláírása növeli a biztonságot, mivel megnehezíti egy rosszindulatú modul betöltését a kernelbe. A modul aláírásának ellenőrzését a kern végzi, így nincs szükség „megbízható felhasználói tér bitekre.”Az alábbi ábra ezt mutatja a
parport_pc modul.
Modulkonfiguráció megjelenítése a modprobe segítségével
Minden kernelmodul sajátos konfigurációval rendelkezik. A modprobe parancs, majd a „-c” opció (röviden a „-showconfig”) felsorolja a modul konfigurációját. A grep-kel kombinálva ez a kimenet egy adott szimbólumra korlátozódik. A 6. lista ezt demonstrálja az IPv6 opcióknál.
6. lista: A modul konfigurációjának megjelenítése
$ / 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
álnév szimbólum: nf_defrag_ipv6_enable nf_defrag_ipv6
álnév szimbólum: nf_nat_icmpv6_reply_translation nf_nat_ipv6
álnév szimbólum: nft_af_ipv6 nf_tables_ipv6
álnév szimbólum: nft_reject_ipv6_eval nft_reject_ipv6
$
Modulfüggőségek megjelenítése
A Linux kernelt modulárisra tervezték, és a funkcionalitás számos modulra oszlik. Ez több modulfüggőséghez vezet, amelyek a modprobe használatával ismét megjeleníthetők. A 7. lista a „-show-depend” opciót használja az i915 modul függőségeinek felsorolásához.
7. lista: Modulfüggőségek megjelenítése
$ / sbin / modprobe --show-i915 függinsmod / 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 / meghajtók / termikus / termikus_sys.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / driverek / 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 / driverek / acpi / video.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / meghajtók / acpi / gomb.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ko
$
Annak érdekében, hogy a függőségeket a „tree” vagy „lsblk” parancshoz hasonló faként jelenítsük meg, a modtree projekt [5] segíthet (lásd az i915 modulfa alábbi ábráját). Annak ellenére, hogy szabadon elérhető a GitHubon, némi kiigazítást igényel, hogy megfeleljen az ingyenes szoftver szabályainak, és csomagként egy Linux disztribúció részévé váljon.
Modulok betöltése
Modul betöltése egy futó kernelbe két paranccsal történhet - insmod („insert module”) és modprobe. Ne feledje, hogy van egy kicsi, de fontos különbség e kettő között: az insmod nem oldja meg a modulfüggőségeket, de a modprobe okosabb és ezt teszi.
A 8. lista megmutatja, hogyan kell beilleszteni az IrDA kernelmodult. Felhívjuk figyelmét, hogy az insmode a teljes modul elérési útjával működik, míg a modprobe elégedett a modul nevével, és maga keresi meg a jelenlegi Linux kernel modulfájában.
8. lista: Kernelmodul beszúrása
# insmod / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko…
# modprobe irda
Modulok kirakása
Az utolsó lépés a modulok futtatásáról szól egy futó kernelből. Ismét két parancs áll rendelkezésre ehhez a feladathoz - a modprobe és az rmmod („modul eltávolítása”). Mindkét parancs a modul nevét várja paraméterként. A 9. lista ezt mutatja az IrDA modul eltávolításához a futó Linux kernelből.
9. lista: A kernelmodul eltávolítása
# rmmod irda…
# modprobe -r irda
…
Következtetés
A Linux kernelmodulok kezelése nem nagy varázslat. Csak néhány parancs a megtanulásra, és te vagy a konyha ura.
Köszönöm
A szerző köszönetet mond Axel Beckertnek (ETH Zürich) és Saif du Plessisnek (Hothead Studio Cape Town) a cikk elkészítése során nyújtott segítségükért.
Linkek és hivatkozások
- [1] Kernel modul, Arch Linux wiki, https: // wiki.archlinux.org / index.php / Kernel_module
- [2] Kernel konfigurációja, https: // tldp.org / HOGYAN / SCSI-2.4-HOGYAN / kconfig.html
- [3] kmod, https: // git.kernel.org / pub / scm / utils / kernel / kmod / kmod.git
- [4] Kernel modul aláírási lehetőség, https: // www.kernel.org / doc / html / v4.15 / admin-útmutató / modul-aláírás.html
- [5] modfa, https: // github.com / falconindy / modtree