Linux-kjernen

Administrere Linux-kjernemoduler

Administrere Linux-kjernemoduler

Forstå Linux-kjernen

Linux-kjernen er kjernen i Linux-operativsystemet. Den inneholder hovedkomponentene for å adressere maskinvaren og tillater både kommunikasjon og interaksjon mellom brukeren og maskinvaren. Linux-kjernen er ikke et monolitisk system, men ganske fleksibelt, og kjernen utvides med såkalte kjernemoduler.

Hva er en kjernemodul?

Generelt er en kjernemodul et “stykke kode som kan lastes og lastes inn i kjernen etter behov. De utvider funksjonaliteten til kjernen uten å måtte starte systemet på nytt ”[1]. Dette fører til veldig stor fleksibilitet under drift.

Videre kan “en kjernemodul konfigureres som innebygd eller lastbar. For å laste eller fjerne en modul dynamisk, må den konfigureres som en lastbar modul i kjernekonfigurasjonen ”[1]. Dette gjøres i kjernefilen / usr / src / linux /.config [2]. Innebygde moduler er merket med “y” og lastbare moduler med “m”. Som et eksempel viser oppføring 1 dette for SCSI-modulen:

Listing 1: SCSI module use declaration

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 kommer med en rekke forskjellige kommandoer for å håndtere kjernemoduler. Dette inkluderer oppføring av modulene som for øyeblikket er lastet inn i Linux-kjernen, visning av 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 lenker til kmod.

Listen er for øyeblikket lastet inn moduler med lsmod

Vi starter med lsmod-kommandoen. lsmod forkorter "listemoduler" og viser alle modulene som er lastet inn i Linux-kjernen ved å formatere innholdet i filen / proc / modulene pent. 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.

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 lagres i katalogen / lib / modulene. Ved hjelp av finne, kombinert med kommandoen uname, kan du skrive ut en liste over disse modulene. “Uname -r” skriver bare ut versjonen av den nåværende kjørende Linux-kjernen. Oppføring 3 viser dette for en eldre 3.16.0-7 Linux
kjerne, og viser moduler for IPv6 og IRDA.

Listing 3: Vis tilgjengelige moduler (utvalg)

$ find / lib / modules / $ (uname -r) -name '*.ko '
/ lib / modules / 3.16.0-7-amd64 / kjerne / 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 / kjerne / net / irda / irlan / irlan.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
/ lib / modules / 3.16.0-7-amd64 / kjerne / nett / irda / ircomm / ircomm.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
..
$

Vis modulinformasjon ved hjelp av modinfo

Kommandoen modinfo forteller deg mer om den forespurte kjernemodulen (“modulinformasjon”). Som parameter krever modinfo enten hele modulbanen eller bare modulnavnet. Oppføring 4 viser dette for IrDA-kjernemodulen som håndterer Infrared Direct Access-protokollstakken.

Liste 4: Vis modulinformasjon

$ / sbin / modinfo irda
filnavn: / lib / modules / 3.16.0-7-amd64 / kjerne / net / irda / irda.ko
alias: net-pf-23
lisens: GPL
beskrivelse: Linux IrDA Protocol Stack
forfatter: Dag Brattli & Jean Tourrilhes
avhenger: crc-ccitt
vermagisk: 3.16.0-7-amd64 SMP mod_unload modversjoner
$

Utgangen inneholder forskjellige informasjonsfelt, for eksempel hele banen til kjernemodulen, dens aliasnavn, programvarelisens, modulbeskrivelse, forfattere, så vel som kjerneinterne. Feltet "avhenger" viser hvilke andre kjernemoduler det avhenger av.

Informasjonsfeltene varierer fra modul til modul. For å begrense utdata til et bestemt informasjonsfelt, godtar modinfo parameteren “-F” (forkortelse for “-felt”) etterfulgt av feltnavnet. I oppføring 5 er utdata begrenset til lisensinformasjonen som gjøres 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å Linux-kjerneprosjektnettstedet [4], “tillater dette økt kjernesikkerhet ved å ikke tillate lasting av usignerte moduler eller moduler
signert med en ugyldig nøkkel. Modulesignering øker sikkerheten ved å gjøre det vanskeligere å laste en ondsinnet modul inn i kjernen. Kontrollen av modulsignaturen gjøres av kjernen, slik at det ikke er nødvendig å ha "pålitelige brukerområdet bits.”Figuren nedenfor viser dette for
parport_pc-modul.

Vis modulkonfigurasjon ved hjelp av modprobe

Hver kjernemodul kommer med en spesifikk konfigurasjon. Kommandomodproben etterfulgt av alternativet “-c” (forkortelse for “-showconfig”) viser modulkonfigurasjonen. I kombinasjon med grep er denne utgangen begrenset til et bestemt symbol. Oppføring 6 viser dette for IPv6-alternativer.

Liste 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 distribueres 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.

Listing 7: Vis modulavhengigheter

$ / 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 / 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 / kernel / drivers / 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 / kjerne / drivere / gpu / drm / i915 / i915.ko
$

For å vise avhengighetene som et tre som ligner på "treet" eller "lsblk" -kommandoen, kan modtree-prosjektet [5] hjelpe (se figuren 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.

Laster moduler

Å laste en modul til en kjørende kjerne kan gjøres med to kommandoer - insmod (“insert module”) 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 smartere 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 det opp selv i modultreet for den nåværende Linux-kjernen.

Oppføring 8: Sette inn en kjernemodul

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

Laster moduler

Det siste trinnet omhandler lossing av moduler fra en kjernekjøring. Igjen er det to kommandoer tilgjengelig for denne oppgaven - modprobe og rmmod ("Fjern modul"). Begge kommandoene forventer modulnavnet som en parameter. Listing 9 viser dette for å fjerne IrDA-modulen fra den kjørende Linux-kjernen.

Listing 9: Fjerne 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 under forberedelsen av artikkelen.

Lenker og referanser

  • [1] Kjernemodul, Arch Linux wiki, https: // wiki.archlinux.org / indeks.php / Kernel_module
  • [2] Kjernekonfigurasjon, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
  • [3] kmod, https: // git.kjernen.org / pub / scm / utils / kernel / kmod / kmod.git
  • [4] Signeringsanlegg for kjernemodul, https: // www.kjernen.org / doc / html / v4.15 / admin-guide / modul-signering.html
  • [5] modtree, https: // github.com / falconindy / modtree
Hvordan vise FPS-teller i Linux-spill
Linux-spill fikk et stort press da Valve kunngjorde Linux-støtte for Steam-klient og spillene deres i 2012. Siden den gang har mange AAA- og indiespil...
Hvordan laste ned og spille Sid Meier's Civilization VI på Linux
Introduksjon til spillet Civilization 6 er et moderne syn på det klassiske konseptet som ble introdusert i serien av Age of Empires-spillene. Ideen va...
Hvordan installere og spille Doom på Linux
Introduksjon til Doom Doom-serien stammer fra 90-tallet etter utgivelsen av den originale Doom. Det ble en øyeblikkelig suksess, og fra den tiden og u...