Linux-kärna

Hantera Linux-kärnmoduler

Hantera Linux-kärnmoduler

Förstå Linux-kärnan

Linux-kärnan är kärnan i Linux-operativsystemet. Den innehåller huvudkomponenterna för att adressera hårdvaran och möjliggör både kommunikation och interaktion mellan användaren och hårdvaran. Linux-kärnan är inte ett monolitiskt system utan ganska flexibelt och kärnan utökas med så kallade kärnmoduler.

Vad är en kärnmodul?

I allmänhet är en kärnmodul en ”kod som kan laddas och lossas i kärnan på begäran. De utökar kärnans funktionalitet utan att behöva starta om systemet ”[1]. Detta leder till mycket stor flexibilitet under drift.

Dessutom kan ”en kärnmodul konfigureras som inbyggd eller laddbar. För att ladda eller ta bort en modul dynamiskt måste den konfigureras som en laddningsbar modul i kärnkonfigurationen ”[1]. Detta görs i kärnkällfilen / usr / src / linux /.config [2]. Inbyggda moduler är markerade med “y” och laddningsbara moduler med “m”. Som ett exempel visar listan 1 detta för SCSI-modulen:

Listing 1: SCSI-modulanvändningsdeklaration

CONFIG_SCSI = y # inbyggd modul
CONFIG_SCSI = m # laddningsbar modul
# CONFIG_SCSI # variabel är inte inställd

Vi rekommenderar inte redigering av konfigurationsfilen direkt, utan att använda antingen kommandot "make config", "make menuconfig" eller "make xconfig" för att definiera användningen av motsvarande modul i Linux-kärnan.

Modulkommandon

Linux-systemet levereras med ett antal olika kommandon för att hantera kärnmoduler. Detta inkluderar att lista de moduler som för närvarande är laddade i Linux-kärnan, visa modulinformation samt ladda och ladda ner kärnmoduler. Nedan kommer vi att förklara dessa kommandon mer detaljerat.

För de nuvarande Linux-kärnorna tillhandahålls följande kommandon av kmod-paketet [3]. Alla kommandon är symboliska länkar till kmod.

Listan har för närvarande laddade moduler med lsmod

Vi börjar med kommandot lsmod. lsmod förkortar "listmoduler" och visar alla moduler som för närvarande laddas i Linux-kärnan genom att formatera innehållet i filen / proc / modulerna snyggt. Listning 2 visar dess utdata som består av tre kolumner: modulnamn, storleken som används i minnet och andra kärnmoduler som använder den här specifika.

Lista 2: Använda lsmod

$ lsmod
Modulstorlek Används av
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
..
$

Hitta tillgängliga moduler för din nuvarande kärna

Det kan finnas kärnmoduler tillgängliga som du inte känner till ännu. De lagras i katalogen / lib / modulerna. Med hjälp av hitta, kombinerat med kommandot uname, kan du skriva ut en lista över dessa moduler. "Uname -r" skriver bara ut versionen av den nuvarande Linux-kärnan. Listning 3 visar detta för en äldre 3.16.0-7 Linux
kärna och visar moduler för IPv6 och IRDA.

Listing 3: Visa tillgängliga moduler (urval)

$ hitta / lib / moduler / $ (uname -r) -namn '*.ko '
/ lib / modules / 3.16.0-7-amd64 / kärna / net / ipv6 / ip6_vti.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / ipv6 / xfrm6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / ipv6 / ip6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / ipv6 / ip6_gre.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / irda / irnet / irnet.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / irda / irlan / irlan.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / irda / irda.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / irda / ircomm / ircomm.ko
/ lib / modules / 3.16.0-7-amd64 / kärna / net / irda / ircomm / ircomm-tty.ko
..
$

Visa modulinformation med modinfo

Kommandot modinfo berättar mer om den begärda kärnmodulen (“modulinformation”). Som parameter kräver modinfo antingen hela modulvägen eller helt enkelt modulnamnet. Listning 4 visar detta för IrDA-kärnmodulen som hanterar protokollstaket för infraröd direktåtkomst.

Listning 4: Visa modulinformation

$ / sbin / modinfo irda
filnamn: / lib / modules / 3.16.0-7-amd64 / kärna / net / irda / irda.ko
alias: net-pf-23
licens: GPL
beskrivning: Linux IrDA Protocol Stack
författare: Dag Brattli & Jean Tourrilhes
beror på: crc-ccitt
vermagisk: 3.16.0-7-amd64 SMP mod_unload modversioner
$

Utgången innehåller olika informationsfält, såsom hela sökvägen för kärnmodulen, dess aliasnamn, programvarulicens, modulbeskrivning, författare samt kärninterna. Fältet ”beror” visar vilka andra kärnmoduler det beror på.

Informationsfälten skiljer sig från modul till modul. För att begränsa utdata till ett specifikt informationsfält accepterar modinfo parametern "-F" (förkortning för "-fält") följt av fältnamnet. I Listing 5 är utdata begränsad till licensinformation som görs tillgänglig med licensfältet.

Listning 5: Visa endast ett specifikt fält.

$ / sbin / modinfo -F licens irda
GPL
$

I nyare Linux-kärnor finns en användbar säkerhetsfunktion tillgänglig. Detta täcker kryptografiskt signerade kärnmoduler. Som förklaras på webbplatsen för Linux-kärnprojekt [4] “tillåter detta ökad kärnsäkerhet genom att inte tillåta laddning av osignerade moduler eller moduler
signerad med en ogiltig nyckel. Modulsignering ökar säkerheten genom att göra det svårare att ladda en skadlig modul i kärnan. Kontrollen av modulsignaturen görs av kärnan så att det inte är nödvändigt att ha "betrodda användarutrymme bitar.”Figuren nedan visar detta för
parport_pc-modul.

Visa modulkonfiguration med modprobe

Varje kärnmodul har en specifik konfiguration. Kommandot modprobe följt av alternativet “-c” (förkortning för “-showconfig”) visar modulkonfigurationen. I kombination med grep är denna utgång begränsad till en specifik symbol. Listning 6 visar detta för IPv6-alternativ.

Listning 6: Visa modulkonfiguration

$ / 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-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
$

Visa modulberoende

Linux-kärnan är utformad för att vara modulär och funktionaliteten distribueras över ett antal moduler. Detta leder till flera modulberoende som kan visas med modprobe igen. Listning 7 använder alternativet "-show-depends" för att lista beroenden för i915-modulen.

Lista 7: Visa modulberoende

$ / sbin / modprobe --show-depends i915
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / i2c / i2c-kärna.ko
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / 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 / kärna / drivrutiner / gpu / drm / drm.ko
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / gpu / drm / drm_kms_helper.ko
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / acpi / video.ko
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / acpi / knapp.ko
insmod / lib / modules / 3.16.0-7-amd64 / kärna / drivrutiner / gpu / drm / i915 / i915.ko
$

För att visa beroenden som ett träd som liknar kommandot “träd” eller “lsblk” kan modtree-projektet [5] hjälpa till (se figuren nedan för i915-modulträdet). Även om det är fritt tillgängligt på GitHub, kräver det vissa anpassningar för att följa reglerna för fri programvara och för att bli en del av en Linux-distribution som ett paket.

Laddar moduler

Att ladda en modul till en löpande kärna kan göras med två kommandon - insmod (“insert module”) och modprobe. Var medveten om att det finns en liten men viktig skillnad mellan dessa två: insmod löser inte modulberoende, men modprobe är smartare och gör det.

Listning 8 visar hur man sätter in IrDA-kärnmodulen. Observera att insmode fungerar med hela modulvägen, medan modprobe är nöjd med namnet på modulen och letar upp den själv i modulträdet för den nuvarande Linux-kärnan.

Lista 8: Infoga en kärnmodul

# insmod / lib / modules / 3.16.0-7-amd64 / kärna / net / irda / irda.ko
..
# modprobe irda

Lossar moduler

Det sista steget handlar om att ladda ner moduler från en löpande kärna. Återigen finns det två kommandon tillgängliga för denna uppgift - modprobe och rmmod (“ta bort modul”). Båda kommandona förväntar sig modulnamnet som en parameter. Listning 9 visar detta för att ta bort IrDA-modulen från den körande Linux-kärnan.

Lista 9: Ta bort en kärnmodul

# rmmod irda
..
# modprobe -r irda
..

Slutsats

Att hantera Linux-kärnmoduler är ingen stor magi. Bara några kommandon att lära sig, och du är köksmästaren.

Tack

Författaren vill tacka Axel Beckert (ETH Zürich) och Saif du Plessis (Hothead Studio Cape Town) för deras hjälp när de förbereder artikeln.

Länkar och referenser

  • [1] Kärnmodul, Arch Linux wiki, https: // wiki.archlinux.org / index.php / Kernel_module
  • [2] Kärnkonfiguration, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
  • [3] kmod, https: // git.kärna.org / pub / scm / utils / kernel / kmod / kmod.git
  • [4] Kärnmodulens signeringsanläggning, https: // www.kärna.org / doc / html / v4.15 / admin-guide / modul-signering.html
  • [5] modtree, https: // github.com / falconindy / modtree
Battle for Wesnoth Tutorial
Slaget om Wesnoth är ett av de mest populära open source-strategispel som du kan spela just nu. Det här spelet har inte bara utvecklats under mycket l...
0 A.D. Handledning
Av de många strategispelen där ute, 0 A.D. lyckas framstå som en omfattande titel och ett mycket djupt, taktiskt spel trots att det är öppen källkod. ...
Unity3D självstudie
Introduktion till Unity 3D Unity 3D är en kraftfull spelutvecklingsmotor. Det är tvärplattform som gör att du kan skapa spel för mobil, webb, skrivbor...