Kernel Linux

Gestione dei moduli del kernel Linux

Gestione dei moduli del kernel Linux

Capire il kernel Linux

Il kernel Linux è il cuore 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.

Che 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 le funzionalità del kernel senza la necessità di riavviare il sistema” [1]. Questo porta a una grande flessibilità durante il funzionamento.

Inoltre, "un modulo del kernel può essere configurato come integrato o caricabile. Per caricare o rimuovere dinamicamente un modulo, deve essere configurato come modulo caricabile nella configurazione del kernel” [1]. Questo viene fatto nel file sorgente del kernel /usr/src/linux/.configurazione [2]. I moduli integrati sono contrassegnati con "y" e i moduli caricabili con "m". Ad esempio, il listato 1 lo dimostra per il modulo SCSI:

Listato 1: Dichiarazione sull'utilizzo del modulo SCSI

CONFIG_SCSI=y # modulo integrato
CONFIG_SCSI=m # modulo caricabile
# CONFIG_SCSI # la variabile non è impostata

Non è consigliabile modificare direttamente il file di configurazione, ma utilizzare il comando "make config", "make menuconfig" o "make xconfig" per definire l'utilizzo 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, la visualizzazione delle informazioni sui moduli, nonché il caricamento e lo scaricamento 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 dei moduli attualmente caricati con lsmod

Iniziamo con il comando lsmod. lsmod abbrevia "elenco moduli" e mostra tutti i moduli attualmente caricati nel kernel Linux formattando bene il contenuto del file /proc/modules. Il Listato 2 mostra il suo output che consiste di tre colonne: nome del modulo, la dimensione utilizzata in memoria e altri moduli del kernel che usano questo specifico.

Listato 2: Utilizzo di lsmod

$ lsmod
Dimensioni del modulo utilizzato da
ctr 12927 2
cmq 17534 2
snd_htimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

Trova i moduli disponibili per il tuo kernel attuale

Potrebbero essere disponibili moduli del kernel di cui non sei ancora a conoscenza. Sono memorizzati nella directory /lib/modules. Con l'aiuto di find, combinato con il comando uname, puoi stampare un elenco di questi moduli. "uname -r" stampa solo la versione del kernel Linux attualmente in esecuzione. Il Listato 3 lo dimostra per un 3 più vecchio.16.0-7 Linux
kernel e mostra i moduli per IPv6 e IRDA.

Listato 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 sul modulo usando modinfo

Il comando modinfo ti dice 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. Il Listato 4 lo dimostra per il modulo del kernel IrDA che si occupa dello stack del protocollo Infrared Direct Access.

Listato 4: Visualizza le informazioni sul modulo

$ /sbin/modinfo irda
nome file: /lib/modules/3.16.0-7-amd64/kernel/net/irda/irda.ko
alias: net-pf-23
licenza: GPL
descrizione: Stack del protocollo IrDA di Linux
autore: Dag Brattli & Jean Tourrilhes
dipende: crc-ccitt
vermagico: 3.16.0-7-amd64 SMP mod_unload modversions
$

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

I campi delle informazioni differiscono da modulo a modulo. Per limitare l'output ad uno specifico campo informativo, modinfo accetta il parametro “-F” (abbreviazione di “-field”) seguito dal nome del campo. Nel Listato 5, l'output è limitato alle informazioni sulla licenza rese disponibili utilizzando il campo della licenza.

Listato 5: Visualizza solo un campo specifico.

$ /sbin/modinfo -F licenza irda
GPL
$

Nei kernel Linux più recenti è disponibile un'utile funzione di sicurezza. Questo copre i moduli del kernel firmati crittograficamente. Come spiegato sul sito web del progetto del kernel Linux [4], "questo consente una maggiore sicurezza del kernel impedendo il caricamento di moduli o moduli non firmati
firmato con una chiave non valida. La firma del modulo aumenta la sicurezza rendendo più difficile il caricamento di un modulo dannoso nel kernel. Il controllo della firma del modulo viene eseguito dal kernel in modo che non sia necessario disporre di "bit di spazio utente fidati".” La figura seguente mostra questo per il
modulo parport_pc.

Mostra la configurazione del modulo usando modprobe

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

Listato 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_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
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 le funzionalità sono distribuite su un numero di moduli. Questo porta a diverse dipendenze del modulo che possono essere visualizzate usando di nuovo modprobe. Il Listato 7 utilizza l'opzione "-show-depends" per elencare le dipendenze per il modulo i915.

Listato 7: Mostra le dipendenze del modulo

$ /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/kernel/drivers/thermal/thermal_sys.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/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/kernel/drivers/acpi/video.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/acpi/pulsante.ko
insmod /lib/modules/3.16.0-7-amd64/kernel/drivers/gpu/drm/i915/i915.ko
$

Per visualizzare le dipendenze come un albero simile al comando "tree" o "lsblk", il progetto modtree [5] può aiutare (vedi figura sotto per l'albero del modulo i915). Sebbene sia disponibile gratuitamente su GitHub, richiede alcuni adattamenti per conformarsi alle regole per il software libero e per diventare parte di una distribuzione Linux come pacchetto.

Caricamento moduli

Il caricamento di un modulo su un kernel in esecuzione può essere eseguito con due comandi: insmod ("inserisci modulo") e modprobe. Tieni presente che c'è una leggera ma importante differenza tra questi due: insmod non risolve le dipendenze del modulo, ma modprobe è più intelligente e lo fa.

Il Listato 8 mostra come inserire il modulo del kernel IrDA. Nota che insmode funziona con il percorso completo del modulo, mentre modprobe è soddisfatto del nome del modulo e lo cerca da solo nell'albero dei moduli per l'attuale kernel Linux.

Listato 8: Inserimento di un modulo del kernel

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

# modprobe irda

Moduli di scarico

L'ultimo passaggio riguarda lo scaricamento dei moduli da un kernel in esecuzione. Di nuovo, ci sono due comandi disponibili per questa attività: modprobe e rmmod ("rimuovi modulo"). Entrambi i comandi prevedono il nome del modulo come parametro. Il Listato 9 mostra questo per rimuovere il modulo IrDA dal kernel Linux in esecuzione.

Listato 9: Rimozione di un modulo del kernel

# rmmod irda

# modprobe -r irda

Conclusione

Gestire i moduli del kernel Linux non è una grande magia. Pochi comandi da imparare e il maestro di cucina sei tu.

Grazie

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

Link e riferimenti

  • [1] Modulo del kernel, wiki di Arch Linux, https://wiki.archlinux.organizzazione/indice.php/Kernel_module
  • [2] Configurazione del kernel, https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html
  • [3] kmod, https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.idiota
  • [4] Funzione di firma del modulo del kernel, https://www.kernel.org/doc/html/v4.15/guida-amministratore/firma-modulo.html
  • [5] modtree, https://github.com/falconindy/modtree
SuperTuxKart per Linux
SuperTuxKart è un fantastico titolo progettato per offrirti l'esperienza di Mario Kart gratuitamente sul tuo sistema Linux. È piuttosto impegnativo e ...
Tutorial Battaglia per Wesnoth
The Battle for Wesnoth è uno dei giochi di strategia open source più popolari a cui puoi giocare in questo momento. Non solo questo gioco è in svilupp...
0 A.D. Tutorial
Tra i tanti giochi di strategia in circolazione, 0 A.D. riesce a distinguersi come un titolo completo e un gioco molto profondo e tattico nonostante s...