Gestione dei moduli del kernel Linux

Gestione dei moduli del kernel Linux

Comprensione del kernel Linux

Il kernel Linux è il nucleo del sistema operativo Linux. Contiene i componenti principali per affrontare l'hardware e consente sia la comunicazione che l'interazione tra l'utente e l'hardware. Il kernel Linux non è un sistema monolitico ma abbastanza flessibile e il kernel è esteso dai cosiddetti moduli del kernel.

Cos'è un modulo del kernel?

In generale, un modulo del kernel è un "pezzo di codice che può essere caricato e scaricato nel kernel su richiesta. Estendono la funzionalità del kernel senza la necessità di riavviare il sistema ”[1]. Questo porta a una grande flessibilità durante il funzionamento.

Inoltre, “un modulo kernel può essere configurato come integrato o carico. Per caricare o rimuovere dinamicamente un modulo, deve essere configurato come modulo carico nella configurazione del kernel ”[1]. Questo viene fatto nel file sorgente del kernel/usr/src/linux/.config [2]. I moduli integrati sono contrassegnati con "Y" e moduli carichi con "M". Ad esempio, l'elenco 1 lo dimostra per il modulo SCSI:

Elenco 1: Dichiarazione di utilizzo del modulo SCSI

Config_scsi = y # modulo integrato
Config_scsi = m # Modulo caricatore
# Config_scsi # La variabile non è impostata

Non consigliamo di modificare direttamente il file di configurazione, ma per utilizzare il comando "Make config", "make menuconfig" o "fare xConfig" per definire l'uso del modulo corrispondente nel kernel Linux.

Comandi del modulo

Il sistema Linux viene fornito con una serie di comandi diversi per gestire i moduli del kernel. Ciò include l'elenco dei moduli attualmente caricati nel kernel Linux, visualizzando le informazioni sui moduli, nonché il caricamento e lo scarico dei moduli del kernel. Di seguito spiegheremo questi comandi in modo più dettagliato.

Per gli attuali kernel Linux, i seguenti comandi sono forniti dal pacchetto KMOD [3]. Tutti i comandi sono collegamenti simbolici a Kmod.

L'elenco attualmente è stato caricato moduli con LSMOD

Iniziamo con il comando lsmod. LSMOD abbreviano i "moduli elenca" e visualizza tutti i moduli attualmente caricati nel kernel Linux formattando bene il contenuto del file /proc /moduli. Listato 2 mostra il suo output costituito da tre colonne: nome del modulo, dimensioni utilizzate in memoria e altri moduli del kernel che usano questo specifico.

Elenco 2: usando LSMOD

$ lsmod
Dimensione del modulo utilizzato da
CTR 12927 2
CCM 17534 2
SND_HRTIMER 12604 1
SND_SEQ 57112 1
SND_SEQ_DEVICE 13132 1 SND_SEQ
..
$

Trova i moduli disponibili per il tuo kernel attuale

Potrebbero esserci moduli di kernel disponibili di cui non sei ancora a conoscenza. Sono archiviati nella directory /lib /moduli. Con l'aiuto di Find, combinato con il comando UNAME, è possibile stampare un elenco di questi moduli. "UNAME -R" stampare la versione del kernel Linux attualmente in esecuzione. La lista 3 lo dimostra per un vecchio 3.16.0-7 Linux
kernel e mostra moduli per IPv6 e IRDA.

Elenco 3: Visualizzazione dei moduli disponibili (selezione)

$ find/lib/modules/$ (uname -r) -name '*.ko '
/lib/moduli/3.16.0-7-AMD64/kernel/net/ipv6/ip6_vti.ko
/lib/moduli/3.16.0-7-AMD64/kernel/net/ipv6/xfrm6_tunnel.ko
/lib/moduli/3.16.0-7-AMD64/kernel/net/ipv6/ip6_tunnel.ko
/lib/moduli/3.16.0-7-AMD64/kernel/net/ipv6/ip6_gre.ko
/lib/moduli/3.16.0-7-AMD64/Kernel/Net/IRDA/IRNET/IRNET.ko
/lib/moduli/3.16.0-7-AMD64/kernel/net/IRDA/IRLAN/IRLAN.ko
/lib/moduli/3.16.0-7-AMD64/kernel/net/IRDA/IRDA.ko
/lib/moduli/3.16.0-7-AMD64/Kernel/Net/IRDA/IRCOMM/IRCOMM.ko
/lib/moduli/3.16.0-7-AMD64/Kernel/Net/IRDA/IRCOMM/IRCOMM-TTY.ko
..
$

Visualizza le informazioni del modulo utilizzando ModInfo

Il comando modinfo ti racconta di più sul modulo del kernel richiesto ("Informazioni sul modulo"). Come parametro, ModInfo richiede il percorso completo del modulo o semplicemente il nome del modulo. Listato 4 lo dimostra per il modulo del kernel IRDA che si occupa dello stack del protocollo di accesso diretto a infrarossi.

Elenco 4: visualizzare le informazioni del modulo

$ /SBIN /MODINFO IRDA
nome file:/lib/moduli/3.16.0-7-AMD64/kernel/net/IRDA/IRDA.ko
Alias: Net-PF-23
Licenza: GPL
Descrizione: Lo stack del protocollo IDA Linux
Autore: Dag Brattli & Jean Tourrilhes
Dipende: CRC-CCITT
Vermagic: 3.16.0-7-AMD64 SMP MOD_UNLOAD MODVERSIONS
$

L'output contiene diversi campi di informazione come il percorso completo per il modulo del kernel, il suo nome alias, la licenza software, la descrizione del modulo, gli autori e gli interni del kernel. Il campo "dipende" mostra su quali altri moduli del kernel dipendono.

I campi informativi differiscono da un modulo a modulo. Al fine di limitare l'output a un campo informativo specifico, ModInfo accetta il parametro "-f" (abbreviazione di "-field") seguito dal nome del campo. Nell'elenco 5, l'output è limitato alle informazioni di licenza rese disponibili utilizzando il campo della licenza.

Elenco 5: visualizzare solo un campo specifico.

$ /sbin /modinfo -f licenza IRDA
GPL
$

Nei nuovi kernel Linux, è disponibile un'utile funzionalità di sicurezza. Questo copre i moduli del kernel firmati crittograficamente. Come spiegato nel sito Web del progetto del kernel Linux [4], “Ciò consente una maggiore sicurezza del kernel non consentire il carico di moduli o moduli non firmati
Firmato con una chiave non valida. La firma del modulo aumenta la sicurezza rendendo più difficile caricare un modulo dannoso nel kernel. Il controllo della firma del modulo viene eseguito dal kernel in modo che non sia necessario avere "bit di spazio utenti di fiducia."La figura seguente mostra questo per il
modulo parport_pc.

Mostra la configurazione del modulo utilizzando ModProbe

Ogni modulo del kernel viene fornito con una configurazione specifica. Il ModProbe di comando seguito dall'opzione "-c" (abbreviazione di "-showconfig") elenca la configurazione del modulo. In combinazione con Grep, questo output è limitato a un simbolo specifico. Listato 6 lo dimostra per le opzioni IPv6.

Elenco 6: mostra la configurazione del modulo

$ /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_TABLS_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
Simbolo alias: NF_DEFRAG_IPV6_ENABLE NF_DEFRAG_IPV6
Simbolo alias: NF_NAT_ICMPV6_Reply_Translation NF_NAT_IPV6
Simbolo alias: nft_af_ipv6 nf_tables_ipv6
Simbolo alias: nft_reject_ipv6_eval nft_reject_ipv6
$

Mostra le dipendenze del modulo

Il kernel Linux è progettato per essere modulare e la funzionalità è distribuita su una serie di moduli. Questo porta a diverse dipendenze del modulo che possono essere visualizzate utilizzando di nuovo ModProbe. Listato 7 utilizza l'opzione "-show-dipende" per elencare le dipendenze per il modulo I915.

Elenco 7: mostra le dipendenze dei moduli

$ /sbin /modprobe-show-dipende i915
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/i2c/i2c-core.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/i2c/algos/i2c-algo-bit.ko
insmod/lib/moduli/3.16.0-7-AMD64/Kernel/Driver/Thermal/Thermal_Sys.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/GPU/DRM/DRM.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/gpu/drm/drm_kms_helper.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/ACPI/video.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/ACPI/pulsante.ko
insmod/lib/moduli/3.16.0-7-AMD64/kernel/driver/gpu/drm/i915/i915.ko
$

Per visualizzare le dipendenze come un albero simile al comando "albero" o "lsblk", il progetto Modtree [5] può aiutare (vedere la figura sotto per l'albero del modulo I915). Sebbene sia liberamente disponibile su GitHub, richiede alcuni adattamenti per rispettare le regole per il software gratuito e per diventare parte di una distribuzione Linux come pacchetto.

Moduli di caricamento

Il caricamento di un modulo su un kernel in esecuzione può essere eseguito con due comandi: insmod ("inserisci modulo") e modprobe. Sii consapevole che esiste una leggera ma importante differenza tra questi due: Insmod non risolve le dipendenze dei moduli, ma ModProbe è più intelligente e lo fa.

La lista 8 mostra come inserire il modulo del kernel IRDA. Si prega di notare che Insmode funziona con il percorso del modulo completo, mentre ModProbe è felice con il nome del modulo e lo guarda nell'albero del modulo per il kernel Linux corrente.

Elenco 8: inserimento di un modulo del kernel

# insmod/lib/moduli/3.16.0-7-AMD64/kernel/net/IRDA/IRDA.ko
..
# MODPROBE IRDA

Moduli di scarico

L'ultimo passo tratta i moduli di scarico da un kernel in esecuzione. Ancora una volta, ci sono due comandi disponibili per questa attività: ModProbe e RMMOD ("Rimuovi modulo"). Entrambi i comandi si aspettano il nome del modulo come parametro. La lista 9 mostra questo per la rimozione del modulo IRDA dal kernel Linux in esecuzione.

Elenco 9: Rimozione di un modulo del kernel

# RMMOD IRDA
..
# modprobe -r IRDA
..

Conclusione

Gestire i moduli del kernel Linux non è una grande magia. Solo alcuni comandi da imparare e sei il maestro della cucina.

Grazie

L'autore desidera ringraziare Axel Beckert (ETH ZURICH) e Saif du Plessis (Hothead Studio Cape Town) per il loro aiuto durante la preparazione dell'articolo.

Collegamenti e riferimenti

  • [1] Modulo kernel, Wiki Arch Linux, https: // wiki.Archlinux.org/indice.php/kernel_module
  • [2] Configurazione del kernel, https: // tldp.Org/Howto/SCSI-2.4-howto/kconfig.html
  • [3] Kmod, https: // git.nocciolo.Org/Pub/SCM/utils/kernel/kmod/kmod.idiota
  • [4] Facili di firma del modulo kernel, https: // www.nocciolo.org/doc/html/v4.15/amministratore/miniatura del modulo.html
  • [5] Modtree, https: // github.com/falconindy/modtree