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 modulCONFIG_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
$ lsmodModulstorlek 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 irdafilnamn: / 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
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 irdaGPL
$
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 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
$
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 i915insmod / 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