Linux-kernel

Linux-kernelmodules beheren

Linux-kernelmodules beheren

De Linux-kernel begrijpen

De Linux-kernel is de kern van het Linux-besturingssysteem. Het bevat de belangrijkste componenten om de hardware aan te pakken en maakt zowel communicatie als interactie tussen de gebruiker en de hardware mogelijk. De Linux-kernel is geen monolithisch systeem, maar behoorlijk flexibel, en de kernel wordt uitgebreid met zogenaamde kernelmodules.

Wat is een kernelmodule??

In het algemeen is een kernelmodule een "stukje code dat op verzoek in de kernel kan worden geladen en gelost". Ze breiden de functionaliteit van de kernel uit zonder dat het systeem opnieuw hoeft te worden opgestart” [1]. Dit leidt tot een zeer grote flexibiliteit tijdens het gebruik.

Verder kan "een kernelmodule worden geconfigureerd als ingebouwd of laadbaar". Om een ​​module dynamisch te laden of te verwijderen, moet deze worden geconfigureerd als een laadbare module in de kernelconfiguratie” [1]. Dit wordt gedaan in het kernelbronbestand /usr/src/linux/.configuratie [2]. Ingebouwde modules zijn gemarkeerd met "y" en laadbare modules met "m". Lijst 1 laat dit als voorbeeld zien voor de SCSI-module:

Lijst 1: Gebruiksverklaring SCSI-module

CONFIG_SCSI=y # ingebouwde module
CONFIG_SCSI=m # laadbare module
# CONFIG_SCSI # variabele is niet ingesteld

We raden niet aan om het configuratiebestand rechtstreeks te bewerken, maar om ofwel de opdracht "make config", "make menuconfig" of "make xconfig" te gebruiken om het gebruik van de corresponderende module in de Linux-kernel te definiëren.

Module opdrachten

Het Linux-systeem wordt geleverd met een aantal verschillende opdrachten om kernelmodules te verwerken. Dit omvat het weergeven van de modules die momenteel in de Linux-kernel zijn geladen, het weergeven van module-informatie en het laden en lossen van kernelmodules. Hieronder zullen we deze commando's in meer detail uitleggen.

Voor de huidige Linux-kernels worden de volgende commando's geleverd door het kmod-pakket [3]. Alle commando's zijn symbolische links naar kmod.

De lijst die momenteel geladen modules met lsmod

We beginnen met de opdracht lsmod. lsmod verkort "lijst met modules" en geeft alle modules weer die momenteel in de Linux-kernel zijn geladen door de inhoud van het bestand /proc/modules netjes op te maken. Lijst 2 toont de uitvoer die uit drie kolommen bestaat: modulenaam, de grootte die in het geheugen wordt gebruikt en andere kernelmodules die deze specifieke gebruiken.

Lijst 2: lsmod gebruiken

$ lsmod
Modulegrootte Gebruikt door:
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

Vind beschikbare modules voor je huidige kernel

Er kunnen kernelmodules beschikbaar zijn waarvan u nog niet op de hoogte bent. Ze worden opgeslagen in de directory /lib/modules. Met behulp van find, gecombineerd met het uname-commando, kunt u een lijst van deze modules afdrukken. "uname -r" drukt gewoon de versie af van de momenteel draaiende Linux-kernel. Listing 3 toont dit aan voor een oudere 3.16.0-7 Linux
kernel, en toont modules voor IPv6 en IRDA.

Listing 3: Beschikbare modules weergeven (selectie)

$ 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

$

Module-informatie weergeven met modinfo

Het commando modinfo vertelt je meer over de gevraagde kernelmodule (“module informatie”). Als parameter vereist modinfo ofwel het volledige modulepad of gewoon de modulenaam. Lijst 4 demonstreert dit voor de IrDA-kernelmodule die te maken heeft met de Infrared Direct Access-protocolstack.

Lijst 4: Module-informatie weergeven

$ /sbin/modinfo irda
bestandsnaam: /lib/modules/3.16.0-7-amd64/kernel/net/irda/irda.ko
alias: net-pf-23
licentie: GPL
beschrijving: De Linux IrDA-protocolstack
auteur: Dag Brattli & Jean Tourrilhes
hangt af van: crc-ccitt
vermagisch: 3.16.0-7-amd64 SMP mod_unload modversions
$

De uitvoer bevat verschillende informatievelden, zoals het volledige pad voor de kernelmodule, de aliasnaam, softwarelicentie, modulebeschrijving, auteurs, evenals kernel internals. Het veld "depends" laat zien van welke andere kernelmodules het afhankelijk is.

De informatievelden verschillen van module tot module. Om de uitvoer te beperken tot een specifiek informatieveld, accepteert modinfo de parameter "-F" (afkorting van "-field") gevolgd door de veldnaam. In Listing 5 is de uitvoer beperkt tot de licentie-informatie die beschikbaar is gesteld met behulp van het licentieveld.

Lijst 5: alleen een specifiek veld weergeven.

$ /sbin/modinfo -F licentie irda
GPL
$

In nieuwere Linux-kernels is een handige beveiligingsfunctie beschikbaar. Dit omvat cryptografisch ondertekende kernelmodules. Zoals uitgelegd op de website van het Linux-kernelproject [4], "maakt dit een verhoogde kernelbeveiliging mogelijk door het laden van niet-ondertekende modules of modules
ondertekend met een ongeldige sleutel. Ondertekening van modules verhoogt de beveiliging door het moeilijker te maken om een ​​kwaadaardige module in de kernel te laden. Het controleren van de modulehandtekening wordt gedaan door de kernel, zodat het niet nodig is om "vertrouwde gebruikersruimtebits" te hebben.” Onderstaande figuur laat dit zien voor de
parport_pc-module.

Moduleconfiguratie weergeven met modprobe

Elke kernelmodule wordt geleverd met een specifieke configuratie. Het commando modprobe gevolgd door de optie "-c" (afkorting van "-showconfig") geeft de moduleconfiguratie weer. In combinatie met grep is deze uitvoer beperkt tot een specifiek symbool. Lijst 6 demonstreert dit voor IPv6-opties.

Lijst 6: Toon moduleconfiguratie Show

$ /sbin/modprobe -c | grep ipv6
alias 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 symbool:nf_defrag_ipv6_enable nf_defrag_ipv6
alias symbool:nf_nat_icmpv6_reply_translation nf_nat_ipv6
alias symbool:nft_af_ipv6 nf_tables_ipv6
alias symbool:nft_reject_ipv6_eval nft_reject_ipv6
$

Moduleafhankelijkheden weergeven Show

De Linux-kernel is ontworpen om modulair te zijn en de functionaliteit is verdeeld over een aantal modules. Dit leidt tot verschillende module-afhankelijkheden die opnieuw kunnen worden weergegeven met modprobe. Listing 7 gebruikt de optie "-show-depends" om de afhankelijkheden voor de i915-module weer te geven.

Lijst 7: Toon moduleafhankelijkheden

$ /sbin/modprobe --show-depends i915
insmod /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/knop.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/i915/i915.ko
$

Om de afhankelijkheden als een boomstructuur weer te geven, vergelijkbaar met de opdracht "tree" of "lsblk", kan het modtree-project [5] helpen (zie onderstaande afbeelding voor de i915-moduleboom). Hoewel het vrij beschikbaar is op GitHub, vereist het enkele aanpassingen om te voldoen aan de regels voor vrije software en om als pakket onderdeel te worden van een Linux-distributie.

Modules laden

Het laden van een module in een draaiende kernel kan met twee commando's - insmod ("insert module") en modprobe. Houd er rekening mee dat er een klein maar belangrijk verschil is tussen deze twee: insmod lost geen module-afhankelijkheden op, maar modprobe is slimmer en doet dat.

Lijst 8 laat zien hoe u de IrDA-kernelmodule invoegt. Houd er rekening mee dat insmode werkt met het volledige modulepad, terwijl modprobe tevreden is met de naam van de module en deze zelf opzoekt in de modulestructuur voor de huidige Linux-kernel.

Listing 8: Een kernelmodule invoegen

# insmod /lib/modules/3.16.0-7-amd64/kernel/net/irda/irda.ko

# modprobe irda

Modules lossen

De laatste stap behandelt het lossen van modules uit een draaiende kernel. Nogmaals, er zijn twee commando's beschikbaar voor deze taak - modprobe en rmmod ("module verwijderen"). Beide commando's verwachten de modulenaam als parameter. Lijst 9 toont dit voor het verwijderen van de IrDA-module uit de draaiende Linux-kernel.

Listing 9: Een kernelmodule verwijderen

# rmmod irda

# modprobe -r irda

Conclusie

Het omgaan met Linux-kernelmodules is geen grote magie. Slechts een paar commando's om te leren, en je bent de meester van de keuken.

Dank u

De auteur dankt Axel Beckert (ETH Zürich) en Saif du Plessis (Hothead Studio Cape Town) voor hun hulp bij het opstellen van het artikel.

Links en referenties

  • [1] Kernelmodule, Arch Linux-wiki, https://wiki.archlinux.org/index.php/Kernel_module
  • [2] Kernelconfiguratie, https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html
  • [3] kmod, https://git.kern.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Ondertekeningsfaciliteit voor kernelmodules, https://www.kern.org/doc/html/v4.15/admin-gids/module-ondertekening.html
  • [5] modtree, https://github.com/falconindy/modtree
Hoe AutoKey te gebruiken om Linux-spellen te automatiseren
AutoKey is een hulpprogramma voor desktopautomatisering voor Linux en X11, geprogrammeerd in Python 3, GTK en Qt. Met behulp van de scripting- en MACR...
Hoe FPS-teller in Linux-games te tonen
Linux-gaming kreeg een grote duw toen Valve in 2012 Linux-ondersteuning voor Steam-client en hun games aankondigde. Sindsdien hebben veel AAA- en indi...
Sid Meier's Civilization VI downloaden en spelen op Linux and
Inleiding tot het spel Civilization 6 is een moderne versie van het klassieke concept dat werd geïntroduceerd in de serie Age of Empires-games. Het id...