Forstå Linux -kjernen
Linux -kjernen er kjernen i Linux -operativsystemet. Den inneholder hovedkomponentene for å adressere maskinvaren og tillater både kommunikasjon og samhandling mellom brukeren og maskinvaren. Linux-kjernen er ikke et monolitisk system, men ganske fleksibel, og kjernen utvides med såkalte kjernemoduler.
Hva er en kjernemodul?
Generelt sett er en kjernemodul et "kode som kan lastes og lastes inn i kjernen på forespørsel. De utvider funksjonaliteten til kjernen uten behov for å starte systemet på nytt ”[1]. Dette fører til veldig stor fleksibilitet under drift.
Videre kan en kjernemodul konfigureres som innebygd eller lastbar. For å dynamisk laste inn eller fjerne en modul, må den konfigureres som en lastbar modul i kjernekonfigurasjonen ”[1]. Dette gjøres i Kernel -kildefilen/usr/src/linux/.konfigurasjon [2]. Innebygde moduler er merket med "y" og lastbare moduler med "M". Som et eksempel demonstrerer Listing 1 dette for SCSI -modulen:
Oppføring 1: SCSI -modulbruksdeklarasjon
Config_scsi = y # innebygd modul
Config_scsi = m # lastbar modul
# Config_scsi # variabel er ikke angitt
Vi anbefaler ikke å redigere konfigurasjonsfilen direkte, men å bruke enten kommandoen "Make Config", "Make Menuconfig" eller "Make Xconfig" for å definere bruken av den tilsvarende modulen i Linux -kjernen.
Modulkommandoer
Linux -systemet har en rekke forskjellige kommandoer for å håndtere kjernemoduler. Dette inkluderer liste over modulene som for øyeblikket er lastet inn i Linux -kjernen, viser modulinformasjon, samt lasting og lossing av kjernemoduler. Nedenfor vil vi forklare disse kommandoene mer detaljert.
For de nåværende Linux -kjernene er følgende kommandoer gitt av KMOD -pakken [3]. Alle kommandoene er symbolske koblinger til Kmod.
Listen for øyeblikket lastet moduler med LSMOD
Vi starter med LSMOD -kommandoen. LSMOD forkortes “Listemoduler” og viser alle moduler som for øyeblikket er lastet inn i Linux -kjernen ved å formatere innholdet i filen /Proc /Modules pent å formatere innholdet i filen /Proc /Modulene. Oppføring 2 viser utdataene som består av tre kolonner: modulnavn, størrelsen som brukes i minnet og andre kjernemoduler som bruker denne spesifikke en.
Oppføring 2: Bruke LSMOD
$ lsmod
Modulstørrelse brukt av
CTR 12927 2
CCM 17534 2
SND_HRTIMER 12604 1
SND_SEQ 57112 1
SND_SEQ_DEVICE 13132 1 SND_SEQ
..
$
Finn tilgjengelige moduler for din nåværende kjerne
Det kan være kjernemoduler tilgjengelig som du ikke er klar over ennå. De er lagret i katalogen /lib /modulene. Ved hjelp av å finne, kombinert med Uname -kommandoen, kan du skrive ut en liste over disse modulene. “UNAME -R” skriver bare ut versjonen av den for øyeblikket Running Linux -kjernen. Oppføring 3 demonstrerer dette for en eldre 3.16.0-7 Linux
kjerne, og viser moduler for IPv6 og IRDA.
Oppføring 3: Viser tilgjengelige moduler (valg)
$ finn/lib/modules/$ (uname -r) -name '*.ko '
/lib/moduler/3.16.0-7-amd64/kjerne/nett/ipv6/ip6_vti.ko
/lib/moduler/3.16.0-7-amd64/kjerne/nett/ipv6/xfrm6_tunnel.ko
/lib/moduler/3.16.0-7-amd64/kjerne/nett/ipv6/ip6_tunnel.ko
/lib/moduler/3.16.0-7-amd64/kjerne/net/ipv6/ip6_gre.ko
/lib/moduler/3.16.0-7-AMD64/Kernel/Net/IRDA/IRNET/IRNET.ko
/lib/moduler/3.16.0-7-amd64/kjerne/nett/irda/irlan/irlan.ko
/lib/moduler/3.16.0-7-amd64/kjerne/nett/irda/irda.ko
/lib/moduler/3.16.0-7-AMD64/Kernel/Net/IRDA/IRCOMM/IRCOMM.ko
/lib/moduler/3.16.0-7-AMD64/Kernel/Net/IRDA/IRCOMM/IRCOMM-TTY.ko
..
$
Informasjon om visningsmodul ved hjelp av modinfo
Kommandomodinfo forteller deg mer om den forespurte kjernemodulen ("Modulinformasjon"). Som parameter krever Modinfo enten hele modulbanen eller bare modulnavnet. Listing 4 demonstrerer dette for IRDA -kjernemodulen som omhandler den infrarøde direkte tilgangsprotokollstabelen.
Oppføring 4: Informasjon om visningsmodul
$ /sbin /modinfo irda
filnavn:/lib/modules/3.16.0-7-amd64/kjerne/nett/irda/irda.ko
Alias: Net-PF-23
Lisens: GPL
Beskrivelse: Linux Irda Protocol Stack
Forfatter: Dag Brattli& Jean Tourrilhes
Avhenger: CRC-CCITT
Vermagic: 3.16.0-7-AMD64 SMP MOD_UNLOAD Modversions
$
Utgangen inneholder forskjellige informasjonsfelt som hele banen for kjernemodulen, dens aliasnavn, programvarelisens, modulbeskrivelse, forfattere, samt kjerneinternals. Feltet "avhenger" viser hvilke andre kjernemoduler det avhenger av.
Informasjonsfeltene avviker fra modul til modul. For å begrense utdataene til et spesifikt informasjonsfelt, godtar Modinfo parameteren "-f" (forkortelse for "-felt") etterfulgt av feltnavnet. I oppføring 5 er utdataene begrenset til lisensinformasjonen som er gjort tilgjengelig ved hjelp av lisensfeltet.
Oppføring 5: Vis bare et bestemt felt.
$ /sbin /modinfo -f lisens irda
Gpl
$
I nyere Linux -kjerner er en nyttig sikkerhetsfunksjon tilgjengelig. Dette dekker kryptografisk signerte kjernemoduler. Som forklart på nettstedet Linux Kernel Project [4], “Dette tillater økt kjernesikkerhet ved å ikke tillate lasting av usignerte moduler eller moduler
signert med en ugyldig nøkkel. Modulsignering øker sikkerheten ved å gjøre det vanskeligere å laste en ondsinnet modul i kjernen. Modulsignaturkontrollen gjøres av kjernen, slik at det ikke er nødvendig å ha “Trusted UserPace Bits.”Figuren nedenfor viser dette for
PARPORT_PC -modul.
Vis modulkonfigurasjon ved hjelp av modprobe
Hver kjernemodul har en spesifikk konfigurasjon. Kommandoen Modprobe etterfulgt av alternativet “-C” (forkortelse for “-ShowConfig”) viser modulkonfigurasjonen. I kombinasjon med grep er denne utgangen begrenset til et spesifikt symbol. Oppføring 6 demonstrerer dette for IPv6 -alternativer.
Oppføring 6: Vis modulkonfigurasjon
$ /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
$
Vis modulavhengigheter
Linux -kjernen er designet for å være modulær, og funksjonalitet er fordelt over en rekke moduler. Dette fører til flere modulavhengigheter som kan vises ved hjelp av modprobe igjen. Oppføring 7 bruker alternativet “-show-Depends” for å liste opp avhengighetene for i915-modulen.
Oppføring 7: Vis modulavhengigheter
$ /SBIN /MODPROBE-SHOW-AVEPENTS I915
Insmod/lib/modules/3.16.0-7-AMD64/kjerne/drivere/i2c/i2c-core.ko
Insmod/lib/modules/3.16.0-7-AMD64/Kernel/drivere/I2C/Algos/I2C-Algo-bit.ko
Insmod/lib/modules/3.16.0-7-AMD64/kjerne/drivere/termisk/termisk_sys.ko
Insmod/lib/modules/3.16.0-7-AMD64/kjerne/drivere/GPU/DRM/DRM.ko
Insmod/lib/modules/3.16.0-7-amd64/kjerne/drivere/gpu/drm/drm_kms_helper.ko
Insmod/lib/modules/3.16.0-7-AMD64/kjerne/drivere/ACPI/video.ko
Insmod/lib/modules/3.16.0-7-AMD64/kjerne/drivere/ACPI/-knapp.ko
Insmod/lib/modules/3.16.0-7-AMD64/Kernel/drivere/GPU/DRM/I915/I915.ko
$
For å vise avhengighetene som et tre som ligner på “Tree” eller “LSBLK” -kommandoen, kan Modtree -prosjektet [5] hjelpe (se figur nedenfor for I915 -modultreet). Selv om det er fritt tilgjengelig på Github, krever det noen tilpasninger for å overholde reglene for gratis programvare og for å bli en del av en Linux -distribusjon som en pakke.
Lastingsmoduler
Lasting av en modul til en løpekjerne kan gjøres med to kommandoer - InsMod (“Sett inn modul”) og modprobe. Vær oppmerksom på at det er en liten, men viktig forskjell mellom disse to: InsMod løser ikke modulavhengigheter, men Modprobe er smart og gjør det.
Oppføring 8 viser hvordan du setter inn IRDA -kjernemodulen. Vær oppmerksom på at Insmode fungerer med hele modulbanen, mens Modprobe er fornøyd med navnet på modulen og ser den opp i seg selv i modultreet for den nåværende Linux -kjernen.
Oppføring 8: Å sette inn en kjernemodul
# INSMOD/LIB/MODULER/3.16.0-7-amd64/kjerne/nett/irda/irda.ko
..
# modprobe irda
Lossing av moduler
Det siste trinnet omhandler lossemoduler fra en løpende kjerne. Igjen, det er to kommandoer tilgjengelig for denne oppgaven - Modprobe og RMMOD (“Fjern modul”). Begge kommandoer forventer modulnavnet som en parameter. Oppføring 9 viser dette for å fjerne IRDA -modulen fra den løpende Linux -kjernen.
Oppføring 9: Fjerning av en kjernemodul
# RMMOD IRDA
..
# modprobe -r irda
..
Konklusjon
Håndtering av Linux -kjernemoduler er ikke stor magi. Bare noen få kommandoer å lære, og du er mesteren på kjøkkenet.
Takk skal du ha
Forfatteren vil takke Axel Beckert (ETH Zürich) og Saif du Plessis (Hothead Studio Cape Town) for deres hjelp mens du forbereder artikkelen.
Lenker og referanser