I moduli del kernel


Sarebbe uno “spreco” avere un kernel di GNU/Linux con tutti i driver compilati all’interno dell’immagine (vmlinuz), sopratutto se usati raramente. Ed è per questa ragione che si tende a crearla il più piccola possibile, caricando poi i moduli solo quando diventa necessario, a run-time, ed è questa è la politica utilizzata ormai da tutte le distribuzioni.

I moduli sono presenti nella cartella /lib/modules/versione_kernel

Lista moduli

Per avere la lista dei moduli attualmente caricati nel sistema possiamo utilizzare lsmod:
lsmod
Module Size Used by
michael_mic 3712 4
arc4 3200 4
ieee80211_crypt_tkip 12416 2
xt_tcpudp 4480 4
iptable_filter 4224 1
iptable_mangle 3968 0
ipt_tos 2688 0
xt_state 3328 6
xt_multiport 4608 0

o visualizzare il contenuto del file /proc/modules.
Per avere invece la lista di quelli disponibili:
modprobe -l
/lib/modules/2.6.17-11-generic/madwifi/ath_pci.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_xauth.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_wep.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_tkip.ko
/lib/modules/2.6.17-11-generic/madwifi/ath_rate_sample.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_scan_ap.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_ccmp.ko
/lib/modules/2.6.17-11-generic/madwifi/wlan_scan_sta.ko

Caricamento dei moduli

Per eseguire il caricamento dei moduli, è possibile usare in comando insmod:
sudo insmod /lib/modules/2.6.17-11-generic/kernel/drivers/acpi/battery.ko
o meglio, con modprobe, che risolve anche le dipendenze:
sudo modprobe battery

Rimozione dei moduli

Per rimuovere, o meglio scaricare un modulo dal kernel possiamo utilizzare:
sudo rmmod battery
oppure:
sudo modprobe -r battery

Le dipendenze dei moduli

Per gestire le dipendenze dei moduli, viene usato il comando depmod, che genera, nella cartella /lib/modules/versione_kernel il file modules.dep:
sudo depmod -a
oppure:
sudo depmod -a 2.6.17-11-generic

Qualche info in più…

Per avere informazioni circa un modulo, la versione, le dipendenze, i parametri, …, basta usare il seguente comando:
modinfo battery
filename: /lib/modules/2.6.17-11-generic/kernel/drivers/acpi/battery.ko
author: Paul Diefenbaugh
description: ACPI Battery Driver
license: GPL
vermagic: 2.6.17-11-generic SMP mod_unload 586 REGPARM gcc-4.1
depends:
srcversion: 9B0EDB48B9DC05A294E5ACD

Caricare i moduli all’avvio

Su distribuzioni Debian-like com Ubuntu, basta aggiungere il nome del modulo all’interno del file /etc/modules:
echo "battery" >> /etc/modules

Parametri dei moduli

Utilizzando il file /etc/modprobe.d/options è possibile specificare dei parametri da passare al modulo quando questo viene caricato dal kernel, il file è ad esempio così composto:
options hostap_pci iw_mode=2
options hostap_cs iw_mode=2
options gspca force_rgb=1

la prima “colonna” è sempre options, nella seconda viene specificato il nome del modulo e nella terza l’opzione

Blacklist

Se vogliamo non caricare un modulo, basta inserirlo in /etc/modprobe.d/blacklist, anteponendo al nome del modulo blacklist come ad esempio:
blacklist usbmouse
blacklist usbkbd

8 pensieri su “I moduli del kernel

  1. Sembrerà strano ai più, ma per quanto breve è chiarissimo: finalmente ho capito che diavolo sono i moduli e come usarli.
    Certo un approfondimento è sempre una buona cosa, ma questo articolo è un ottimo spunto iniziale.
    Complimenti e grazie.

  2. @ngel ha detto:

    Ciao, ottimo approfondimento!
    Sapresti spiegare invece dove i file (kernel Object) .ko devono trovarsi affinche /etc/modules (che contiene l’elenco dei moduli caricabili al boot) vada a reperirli??

  3. Per essere caricato con il modprobe deve trovarsi in “/lib/modules/2.6.17-11-generic” o quella corrispondete alla tua versione del kernel e devi proma lanciare un “depmod -a”, con “insmod” invece, puoi specificare un percorso a tuo piacimento 😉

  4. @ngel ha detto:

    Ciao grazie x la risposta!
    Ti spiego il mio problema:
    – Ho scaricato da kernel.org questa versione: linux-2.6.22.1
    – Devo compilarla per un target con powerpc
    Dato che ho creato un semplice modulo, vorrei provarlo.

    Quello che so è che devo creare nell’initrd (initial ram disk), l’ /etc/modules in cui elencare i moduli da caricare al boot.
    Quello che invece non so, è dove (/lib/modules/2.6.17-11-“generic” nn esiste nel kernel che compilo) andare ad inserire i file seguenti:
    – mylfb.c
    – myfb.ko
    – myfb.mod.c
    – mylfb.mod.o
    – myfb.o
    Il file .c compilandolo sulla mia machina x86 nn da errori e lanciando insmod ./myfb.ko tutto va a buon fine.
    Sapresti darmi qualche dritta?
    Grazie ugualmente.

  5. Credo che, come detto prima, basti copiare il file nella cartella /lib/modules del kernel in uso, quindi
    cp myfb.ko /lib/modules/$(uname -r)
    quindi dovresti fare
    depmod -a
    e verificare se con il modprobe il modulo viene caricato. Solo allora inserirlo in /etc/modules 😉

  6. ugaciaka ha detto:

    sarebbe anche interessante vedere un esempio con module assistant che si preccupa di creare i moduli di un pacchetto per il kernel tramite sorgenti…

Lascia un commento