Difference between revisions of "Kernel modules (Italiano)"

From ArchWiki
Jump to: navigation, search
(Esempio d'uso in GRUB: update)
(Funzione bash per elencare i parametri dei moduli: update translation)
(31 intermediate revisions by 7 users not shown)
Line 2: Line 2:
 
[[Category:Hardware detection and troubleshooting (Italiano)]]
 
[[Category:Hardware detection and troubleshooting (Italiano)]]
 
[[Category:Boot process (Italiano)]]
 
[[Category:Boot process (Italiano)]]
{{i18n|Kernel modules}}
+
[[en:Kernel modules]]
{{expansion}}
+
[[es:Kernel modules]]
 +
[[fr:Kernel modules]]
 +
[[ja:Kernel modules]]
 +
[[zh-CN:Kernel modules]]
 +
{{Article summary start|Sommario}}
 +
{{Article summary text|Questo articolo tratta i vari metodi per gestire i moduli del kernel.}}
 +
{{Article summary heading|Correlati}}
 +
{{Article summary wiki|Boot Debugging (Italiano)}}
 +
{{Article summary wiki|Kernels (Italiano)}}
 +
{{Article summary wiki|Kernel parameters}}
 +
{{Article summary heading|Risorse}}
 +
{{Article summary link|modprobe man page|http://linuxmanpages.com/man5/modprobe.conf.5.php}}
 +
{{Article summary end}}
  
In questo articolo saranno approfonditi i metodi per la gestione dei [[Wikipedia:Loadable_kernel_module|moduli del kernel]].
+
I moduli del [[Wikipedia:it:Kernel|kernel]] sono file di codice che possono essere caricati e rimossi dal kernel su richiesta. Essi estendono le funzionalità del kernel senza bisogno di riavviare il sistema. In questo articolo saranno approfonditi i metodi per la gestione dei moduli del kernel.
  
==Informazioni==
+
==Panoramica==
Affinché un modulo sia riconosciuto come tale, deve essere compilato come modulo nella configurazione del proprio kernel (nella riga relativa al modulo deve quindi comparire la lettera '''M''').
+
La creazione di un modulo del kernel è descritta in [http://tldp.org/LDP/lkmpg/2.6/html/index.html questa guida]. Un modulo può essere configurato per essere ''build-in'' (incluso nel kernel) o ''loadable'' (caricabile a richiesta). Per caricare o rimuovere dinamicamente un modulo, esso deve essere configurato come ''loadable'' nella configurazione del kernel (la riga relativa al modulo mostrerà perciò la lettera {{ic|M}}).
  
Questi moduli vengono archiviati nel percorso {{Filename|/lib/modules/'''nome_del_kernel'''}} (per ottenere il nome del kernel usare il comando {{Codeline|uname -r}}).
+
I moduli vengono archiviati nel percorso {{ic|/usr/lib/modules/''versione_del_kernel''}} (per ottenere la versione del kernel usare il comando {{ic|uname -r}}).
  
Il comando {{Codeline|/sbin/modprobe}} gestisce il caricamento o la rimozione dei moduli.
+
{{Nota|Nella nomenclatura dei moduli spesso compare il simbolo di ''underscore'' ({{ic|_}}) o il ''dash'' ({{ic|-}}), però nell'uso del comando {{ic|modprobe}} oppure all'interno dei file di configurazione nella cartella {{ic|/etc/modprobe.d/}} questi simboli sono perfettamente intercambiabili.}}
  
La cartella {{Filename|/etc/modprobe.d/}} può essere usata per passare le impostazioni relative ai moduli ad [[Udev (Italiano)|udev]] il quale utilzzerà {{Codeline|modprobe}} per gestire il caricamento dei moduli durante l'avvio del sistema. Si possono usare file di configurazione con qualsiasi nome all'interno di questa carella, purché abbiano l'estensione {{Filename|.conf}}. È sconsigliato utilizzare il file {{Filename|/etc/modprobe.conf}}, in quanto sarà deprecato in futuro (leggere {{Codeline|man modprobe.d}}).
+
== Ottenere informazioni ==
 +
Per mostrare quali moduli sono attualmente caricati:
 +
$ lsmod
  
{{Nota|Nella nomenclatura dei moduli spesso compare il simbolo di ''underscore'' ("_") o il ''dash'' ("-"), però nell'uso del comando {{Codeline|modprobe}} oppure all'interno dei file di configurazione nella cartella {{Filename|/etc/modprobe.d/}} questi simboli sono perfettamente intercambiabili.}}
+
Per ottenere informazioni riguardo ad un modulo:
 +
$ modinfo ''nome_modulo''
  
==Caricamento==
+
Per elencare le opzioni configurate per un modulo caricato:
Per effettuare il caricamento manuale di un modulo utilizzare il comando:
+
  $ systool -v -m ''nome_modulo''
  # modprobe ''nomemodulo''
+
  
Per maggiori informazioni sul caricamento automatico dei moduli durante l'avvio del sistema, consultare [[rc.conf (Italiano)|rc.conf]].
+
Per controllare la configurazione di tutti i moduli:
 +
$ modprobe -c | less
  
==Rimozione==
+
Per controllare la configurazione di uno specifico modulo:
Talvolta potrà essere necessario rimuovere un modulo dalla memoria; in questo caso utilizzare il comando:
+
$ modprobe -c | grep ''nome_modulo''
  
# modprobe -r ''nomemodulo''
+
Per elencare le dipendenze di un modulo (o un alias), incluso il modulo stesso:
 
+
  $ modprobe --show-depends ''nome_modulo''
O, in alternativa:
+
 
+
  # rmmod ''nomemodulo''
+
  
 
==Configurazione==
 
==Configurazione==
Se si vuole controllare la configurazione di tutti i moduli è possibile utilizzare il comando:
+
Ad oggi, tutti i moduli necessari da caricare sono gestiti automaticamente da [[udev (Italiano)|udev]], cosicché, se non si vuole usare qualcuno dei moduli fuori dal kernel, non c'è bisogno di mettere i moduli che dovrebbero essere caricati al boot in nessun file di configurazione. Tuttavia, ci sono casi in cui si vuole caricare un modulo extra durante il processo di avvio oppure evitare il caricamento di un altro perché il computer funzioni correttamente.
  
$ modprobe -c
+
===Caricamento===
 +
I moduli extra al kernel da caricare durante il boot sono configurati in una lista statica in {{ic|/etc/modules-load.d/}}. Ogni file di configurazione ha il nome nello stile di {{ic|/etc/modules-load.d/''programma''.conf/}}. I files di configurazione dovrebbero semplicemente contenere una lista con i nomi dei moduli da caricare, separati da ritorni a capo. Le linee vuote o quelle il cui primo carattere non è né uno spazio né {{ic|#}} né {{ic|;}} sono ignorate. Ad esempio:
  
Dato che l'output di questo comando risulterà molto lungo è consigliato impaginarlo con:
+
{{hc|/etc/modules-load.d/virtio-net.conf|
 +
# Carica virtio-net.ko al boot
 +
virtio-net}}
  
$ modprobe -c | less
+
vedere {{ic|man 5 modules-load.d}} per maggiori dettagli.
 
+
Per controllare la configurazione di uno specifico modulo, usare:
+
 
+
$ modprobe -c | grep ''nomemodulo''
+
  
==Opzioni==
+
===Impostazione delle opzioni===
 
Per passare parametri al modulo del kernel è possibile utilizzare un file di configurazione oppure la linea di comando del kernel.
 
Per passare parametri al modulo del kernel è possibile utilizzare un file di configurazione oppure la linea di comando del kernel.
  
===Usando i file in {{Filename|/etc/modprobe.d/}}===
+
====Usando i file in /etc/modprobe.d/====
Per passare parametri al modulo del kernel usando i file di configurazione di modprobe, un file con estenzione {{Codeline|.conf}} ed avente un qualsiasi nome(è possibile usare anche {{Filename|modprobe.conf}}), deve essere posizionato in {{Filename|/etc/modprobe.d/}} ed avere la seguente sintassi:
+
La directory {{ic|/etc/modprobe.d/}} può essere usata per passare la configurazione dei moduli a [[udev (Italiano)|udev]], il quale utilizza {{ic|modprobe}} per gestire il caricamento dei moduli durante l'avvio del sistema. È possibile usare file di configurazione con qualunque nome in tale directory, purché terminino con l'estensione {{ic|.conf}}. La sintassi è:
  
{{File|name/etc/modprobe.d/mionomefile.conf|content=options nomemodulo nomeparametro=valoreparametro}}
+
{{hc|/etc/modprobe.d/mionomefile.conf|2=<nowiki>options nomemodulo nomeparametro=valoreparametro</nowiki>}}
  
ad esempio:
+
Ad esempio:
  
{{File|name=/etc/modprobe.d/thinkfan.conf|content=# Per far si che sui thinkpad, sia il demone thinkfan a controllare la velocità delle ventole
+
{{hc|/etc/modprobe.d/thinkfan.conf|2=#Sui Thinkpad, questo permette al demone 'thinkfan' di controllare la velocità delle ventole.
 
options thinkpad_acpi fan_control=1}}
 
options thinkpad_acpi fan_control=1}}
  
===Uso della riga di comando del kernel===
+
{{Nota|Se qualcuno dei moduli coinvolti è caricato dal ramdisk di init, si dovranno aggiungere i necessari file ''.conf'' all'array {{ic|FILES}} in [[mkinitcpio (Italiano)|mkinitcpio.conf]], in maniera che i moduli siano inclusi nel ramdisk.}}
Se il modulo e compilato nel kernel è possibile passare le opzioni al modulo utilizzando la linea di comando del kernel (ad esempio in [[GRUB (Italiano)|GRUB]], [[LILO]] or [[Syslinux]]) usando la seguente sintassi:
+
 
 +
====Usando la riga di comando del kernel====
 +
Se il modulo è compilato nel kernel è possibile passare le opzioni al modulo utilizzando la linea di comando del kernel. Tutti i bootloader più comuni supportano la seguente sintassi:
  
 
  nomemodulo.nomeparametro=valoreparametro
 
  nomemodulo.nomeparametro=valoreparametro
  
ad esempio:
+
Ad esempio:
  
 
  thinkpad_acpi.fan_control=1
 
  thinkpad_acpi.fan_control=1
  
==Alias==
+
Basta semplicemente aggiungere queste opzioni alla linea del kernel per il proprio bootloader come descritto in [[Kernel parameters]].
{{File|name=/etc/modprobe.d/myalias.conf|content=# Per poter usare il nome 'mymod' nell'array MODULES, invece di 'un_nome_molto_lungo_del_modulo'
+
alias mymod un_nome_molto_lungo_del_modulo}}
+
  
Alcuni moduli hanno alias che vengono utilizzati per il loro caricamento automatico quando vengono richiesti da una applicazione. Disabilitando questi alias verrà impedito il caricamento automatico, ma sarà comunque possibile caricarli manualmente.
+
===Alias===
 +
Gli alias sono nomi alternativi per un modulo. Ad esempio {{ic|alias mio-mod lunghissimo_nome_modulo}} permette di usare {{ic|modprobe mio-mod}} invece di {{ic|modprobe lunghissimo_nome_modulo}}. Si possono anche usare wildcard come nella shell, per cui {{ic|alias mio-mod* lunghissimo_nome_modulo}} permette di usare {{ic|modprobe mio-mod-qualcosa}} con il medesimo risultato. Creare un alias:
  
{{File|name=/etc/modprobe.d/modprobe.conf|content=# Impedisce il caricamente automatico del modulo necessario al bluetooth
+
{{hc|/etc/modprobe.d/myalias.conf|
alias net-pf-31 off
+
alias mio-mod lunghissimo_nome_modulo}}
  
# Impedisce il caricamento automatico del modulo necessario per il protocollo ipv6
+
Alcuni moduli hanno alias che vengono utilizzati per il loro caricamento automatico quando vengono richiesti da una applicazione. Disabilitando questi alias verrà impedito il caricamento automatico, ma sarà comunque possibile caricarli manualmente.
alias net-pf-10 off}}
+
  
==Blacklist==
+
{{hc|/etc/modprobe.d/modprobe.conf|
Con l'espressione "mettere un modulo in blacklist" si intende il meccanismo che impedisce al kernel di caricare tale modulo. Questo può essere usato anche quando la periferica hardware associata al modulo non viene utilizzata e non si desidera farla funzionare, oppure perchè il caricamento del modulo crea problemi: ad esempio potrebbe verificarsi il caricamento contemporaneo di due moduli che cercano di controllare la stessa periferica o componente hardwrare, creando quindi un conflitto.
+
#Impedisci il caricamento automatico di Bluetooth.
  
Alcuni moduli vengono caricati in quanto parte dell'[[mkinitcpio (Italiano)|initramfs]]. Usando il comando {{Codeline|mkinitcpio -M}} verranno mostrati tutti i moduli caricati dal hook {{Codeline|autodetect}}: per impedire all'initramfs di caricare alcuni di quei moduli, sarà necessario inserirli in blacklist tramite il file {{Filename|/etc/modprobe.d/modprobe.conf}}. Utilizzando il comando {{Codeline|mkinitcpio -v}} verranno elencati tutti i moduli inseriti nell'initramfs da tutti gli hook (ad esempio dal hook filesystem, dal hook SCSI eccetera). Ricordarsi di rigenerare l'initramfs una volta inseriti i moduli in blacklist.
+
alias net-pf-31 off}}
  
{{Attenzione|L'uso dell'array {{Codeline|MODULES}} nel file {{Filename|rc.conf}} per impedire il caricamento dei moduli è un metodo deprecato a partire dalla versione  2011.06.1-1 del pacchetto {{Package Official|initscripts}}, sarà quindi necessario utilizzare uno dei seguenti metodi.}}
+
===Blacklist===
 +
Con l'espressione "mettere un modulo in blacklist" si intende il meccanismo che impedisce al kernel di caricare tale modulo. Questo può essere usato anche quando la periferica hardware associata al modulo non viene utilizzata e non si desidera farla funzionare, oppure perché il caricamento del modulo crea problemi: ad esempio potrebbe verificarsi il caricamento contemporaneo di due moduli che cercano di controllare la stessa periferica o componente hardware, creando quindi un conflitto.
  
===Usando i file in {{Filename|/etc/modprobe.d/}}===
+
Alcuni moduli vengono caricati in quanto parte dell'[[mkinitcpio (Italiano)|initramfs]]. Usando il comando {{ic|mkinitcpio -M}} verranno mostrati tutti i moduli caricati dal hook {{ic|autodetect}}: per impedire all'initramfs di caricare alcuni di quei moduli, sarà necessario inserirli in blacklist tramite il file {{ic|/etc/modprobe.d/modprobe.conf}}. Utilizzando il comando {{ic|mkinitcpio -v}} verranno elencati tutti i moduli inseriti nell'initramfs da tutti gli hook (ad esempio dal hook filesystem, dal hook SCSI eccetera). Ricordarsi di rigenerare l'initramfs una volta inseriti i moduli in blacklist.
Creare un file {{Filename|.conf}} all'interno della cartella {{Filename|/etc/modprobe.d/}} ed inserire all'interno una riga per ogni modulo che si desidera mettere in blacklist, usando la parola chiave {{Codeline|blacklist}}. Ad esempio se si desidera impedire il caricamento del modulo {{Codeline|pcspkr}}:
+
  
{{File|/etc/modprobe.d/nobeep.conf|content=<nowiki>#Impedisce il caricamento del modulo pcspkr che controlla la speaker della scheda madre
+
====Usando i file in /etc/modprobe.d/====
 +
Creare un file {{ic|.conf}} all'interno della cartella {{ic|/etc/modprobe.d/}} ed inserire all'interno una riga per ogni modulo che si desidera mettere in blacklist, usando la parola chiave {{ic|blacklist}}. Ad esempio se si desidera impedire il caricamento del modulo {{ic|pcspkr}}:
 +
 
 +
{{hc|/etc/modprobe.d/nobeep.conf|2=<nowiki># Non caricare il modulo pcspkr all'avvio
 
blacklist pcspkr</nowiki>}}
 
blacklist pcspkr</nowiki>}}
  
{{Nota| L'uso dell'opzione {{Codeline|blacklist}} impedisce il caricamento automatico del modulo, potrebbe però essere caricato nel caso in cui un secondo modulo che necessita del primo come dipendenza, se quindi questo fosse caricato anche il primo verrebbe caricato.
+
{{Nota| L'uso dell'opzione {{ic|blacklist}} impedisce il caricamento automatico del modulo. Questo potrebbe però essere caricato nel caso in cui fosse dipendenza di un secondo modulo. E quindi, nel momento in cui quest'ultimo venisse caricato, verrebbe fatto lo stesso anche per il primo, nonostante il blacklist.
  
Esiste comunque un modo di evitare questo inconveniente; utilizzando l'opzione {{Codeline|install}} sarà possibile eseguire un comando personalizzato invece di inserire il comando in memoria, si potrà quindi forzare il fallimento nel carcamento del modulo usando:
+
Esiste comunque un modo di evitare questo inconveniente; utilizzando l'opzione {{ic|install}} sarà possibile eseguire un comando personalizzato invece di inserire il modulo in memoria, si potrà quindi forzare il fallimento nel caricamento del modulo usando:
{{File|name=etc/modprobe.d/blacklist.conf|content=.....
+
{{hc|etc/modprobe.d/blacklist.conf|...
install MODULE /bin/false
+
install ''nome_modulo'' /bin/false
.....}}
+
...}}
Questo impedirà il caricamento del modulo e di tutti quelli da cui dipende.}}
+
Questo impedirà il caricamento del modulo e di tutti quelli che da esso dipendono.}}
  
===Uso della riga di comando del kernel===
+
====Uso della riga di comando del kernel====
{{Tip|Questo metodo è utile nel caso in cui un modulo malfunzionante impedisce il corretto avvio del sistema.}}
+
{{Tip|Questo metodo è utile nel caso in cui un modulo mal funzionante impedisce il corretto avvio del sistema.}}
Si può inoltre impedire il caricamento dei moduli tramite la linea di comando del kernel(ad esempio usando [[GRUB (Italiano)|GRUB]], [[Lilo(Italiano)|LILO]] o [[Syslinux (Italiano)|Syslinux]]) usando la seguente sintassi:
+
Si può inoltre impedire il caricamento dei moduli tramite il bootloader. Aggiungere {{ic|1=modprobe.blacklist=modname1,modname2,modname3}} ai parametri del kernel. Leggere [[kernel parameters]] per maggiori informazioni.
modprobe.blacklist=modname1,modname2,modname3
+
  
In alternativa:
+
{{Nota|Quando si mette in blacklist più di un modulo, fare attenzione a separarli solamente con virgole. Spazi o altri caratteri potrebbero infrangere la sintassi.}}
  
modname1.disable=1
+
==Gestione manuale dei moduli==
 +
I moduli del kernel sono gestiti per mezzo di applicazioni fornite dal pacchetto {{Pkg|kmod}}. Queste possono anche essere utilizzate manualmente.
  
====Esempio d'uso in GRUB====
+
Per caricare un modulo:
  
{{File|name=/boot/grub/menu.lst|content=.....
+
# modprobe ''nome_modulo''
kernel /vmlinuz-linux root=/dev/sda1 modprobe.blacklist=pcspkr,ipv6 ro
+
.....}}
+
  
{{File|name=/boot/grub/menu.lst|content=.....
+
Per rimuovere un modulo:
kernel /vmlinuz-linux root=/dev/sda1 pcspkr.disable=1 ipv6.disable=1 ro
+
.....}}
+
  
== Dipendenze ==
+
# modprobe -r ''nome_modulo''
I seguenti comandi possono aiutare a determinare le dipendenze di un modulo dal modulo stesso.
+
  
* Analizzando il contenuto di {{Filename|/proc/modules}} verifichiamo quali moduli sono attualmente caricati:
+
O, in alternativa:
  
  $ lsmod
+
  # rmmod ''nome_modulo''
 +
 
 +
==Trucchi e Consigli==
 +
 
 +
===Funzione bash per elencare i parametri dei moduli===
 +
Qui sotto è presentata una funzione bash, da usare come root, che mostra una lista di tutti i moduli attualmente caricati insieme a tutti i loro parametri, compreso il loro valore corrente. Utilizza {{ic|/proc/modules}} per recuperare la lista dei moduli caricati, quindi accede al file del modulo direttamente con modinfo per ottenere una descrizione del modulo e le descrizioni per ogni parametro (se disponibile), ed infine accede al filesystem sysfs per ottenere i nomi dei parametri ed i loro valori.
 +
 
 +
{{bc|<nowiki>function aa_mod_parameters ()
 +
{
 +
    N=/dev/null;
 +
    C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
 +
    for mod in $(cat /proc/modules|cut -d" " -f1);
 +
    do
 +
        md=/sys/module/$mod/parameters;
 +
        [[ ! -d $md ]] && continue;
 +
        m=$mod;
 +
        d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
 +
        echo -en "$O$m$C";
 +
        [[ ${#d} -gt 0 ]] && echo -n " - $d";
 +
        echo;
 +
        for mc in $(cd $md; echo *);
 +
        do
 +
            de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
 +
            echo -en "\t$mc=`cat $md/$mc 2>$N`";
 +
            [[ ${#de} -gt 1 ]] && echo -en " - $de";
 +
            echo;
 +
        done;
 +
    done
 +
}</nowiki>}}
 +
 
 +
Ed ecco un esempio di output:
 +
 
 +
{{hc|# aa_mod_parameters|<nowiki>>>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver
 +
        hird=0 - hird:host initiated resume duration, +1 for each 75us (int)
 +
        ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool)
 +
        log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int)
 +
        park=0 - park:park setting; 1-3 back-to-back async packets (uint)
 +
 
 +
>>> processor - ACPI Processor Driver
 +
        ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int)
 +
        ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int)
 +
        latency_factor=2 - latency_factor: (uint)
 +
 
 +
>>> usb_storage - USB Mass Storage driver for Linux
 +
        delay_use=1 - delay_use:seconds to delay before using a new device (uint)
 +
        option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
 +
        quirks= - quirks:supplemental list of device IDs and their quirks (string)
 +
        swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)
 +
 
 +
>>> video - ACPI Video Driver
 +
        allow_duplicates=N - allow_duplicates: (bool)
 +
        brightness_switch_enabled=Y - brightness_switch_enabled: (bool)
 +
        use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)</nowiki>}}
 +
 
 +
Di seguito è riportata una variazione della funzione precedente che include una descrizione completa per ogni parametro. L'output è formattato in maniera leggermente diversa ed usa più colori.
 +
{{bc|<nowiki>
 +
function show_mod_parameter_info ()
 +
{
 +
  if tty -s <&1
 +
  then
 +
    green="\e[1;32m"
 +
    yellow="\e[1;33m"
 +
    cyan="\e[1;36m"
 +
    reset="\e[0m"
 +
  else
 +
    green=
 +
    yellow=
 +
    cyan=
 +
    reset=
 +
  fi
 +
  newline="
 +
"
  
* Usare {{Codeline|modinfo}} per ottenere informazioni riguardo a {{Codeline|MODULO_1}}:
+
  while read mod
$ modinfo MODULO_1
+
  do
 +
    md=/sys/module/$mod/parameters
 +
    [[ ! -d $md ]] && continue
 +
    d="$(modinfo -d $mod 2>/dev/null | tr "\n" "\t")"
 +
    echo -en "$green$mod$reset"
 +
    [[ ${#d} -gt 0 ]] && echo -n " - $d"
 +
    echo
 +
    pnames=()
 +
    pdescs=()
 +
    pvals=()
 +
    pdesc=
 +
    add_desc=false
 +
    while IFS="$newline" read p
 +
    do
 +
      if [[ $p =~ ^[[:space:]] ]]
 +
      then
 +
        pdesc+="$newline    $p"
 +
      else
 +
        $add_desc && pdescs+=("$pdesc")
 +
        pname="${p%%:*}"
 +
        pnames+=("$pname")
 +
        pdesc=("    ${p#*:}")
 +
        pvals+=("$(cat $md/$pname 2>/dev/null)")
 +
      fi
 +
      add_desc=true
 +
    done < <(modinfo -p $mod 2>/dev/null)
 +
    $add_desc && pdescs+=("$pdesc")
 +
    for ((i=0; i<${#pnames[@]}; i++))
 +
    do
 +
      printf "  $cyan%s$reset = $yellow%s$reset\n%s\n" \
 +
        ${pnames[i]} \
 +
        "${pvals[i]}" \
 +
        "${pdescs[i]}"
 +
    done
 +
    echo
  
* Usare {{Codeline|modprobe}} per ottenere informazioni riguardo a {{Codeline|MODULO_2}} (inclusi alias e comandi di installazione):
+
  done < <(cut -d' ' -f1 /proc/modules | sort)
$ modprobe --show-depends MODULO_2
+
}
 +
</nowiki>}}
  
==Ulteriori risorse==
+
==Altre risorse==
*http://linuxmanpages.com/man5/modprobe.conf.5.php
+
* [[Disable PC Speaker Beep]]
*[[Disabling IPv6]]
+
*[[Disable PC Speaker Beep]]
+

Revision as of 05:01, 1 September 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary heading Template:Article summary link Template:Article summary end

I moduli del kernel sono file di codice che possono essere caricati e rimossi dal kernel su richiesta. Essi estendono le funzionalità del kernel senza bisogno di riavviare il sistema. In questo articolo saranno approfonditi i metodi per la gestione dei moduli del kernel.

Panoramica

La creazione di un modulo del kernel è descritta in questa guida. Un modulo può essere configurato per essere build-in (incluso nel kernel) o loadable (caricabile a richiesta). Per caricare o rimuovere dinamicamente un modulo, esso deve essere configurato come loadable nella configurazione del kernel (la riga relativa al modulo mostrerà perciò la lettera M).

I moduli vengono archiviati nel percorso /usr/lib/modules/versione_del_kernel (per ottenere la versione del kernel usare il comando uname -r).

Nota: Nella nomenclatura dei moduli spesso compare il simbolo di underscore (_) o il dash (-), però nell'uso del comando modprobe oppure all'interno dei file di configurazione nella cartella /etc/modprobe.d/ questi simboli sono perfettamente intercambiabili.

Ottenere informazioni

Per mostrare quali moduli sono attualmente caricati:

$ lsmod

Per ottenere informazioni riguardo ad un modulo:

$ modinfo nome_modulo

Per elencare le opzioni configurate per un modulo caricato:

$ systool -v -m nome_modulo

Per controllare la configurazione di tutti i moduli:

$ modprobe -c | less

Per controllare la configurazione di uno specifico modulo:

$ modprobe -c | grep nome_modulo

Per elencare le dipendenze di un modulo (o un alias), incluso il modulo stesso:

$ modprobe --show-depends nome_modulo

Configurazione

Ad oggi, tutti i moduli necessari da caricare sono gestiti automaticamente da udev, cosicché, se non si vuole usare qualcuno dei moduli fuori dal kernel, non c'è bisogno di mettere i moduli che dovrebbero essere caricati al boot in nessun file di configurazione. Tuttavia, ci sono casi in cui si vuole caricare un modulo extra durante il processo di avvio oppure evitare il caricamento di un altro perché il computer funzioni correttamente.

Caricamento

I moduli extra al kernel da caricare durante il boot sono configurati in una lista statica in /etc/modules-load.d/. Ogni file di configurazione ha il nome nello stile di /etc/modules-load.d/programma.conf/. I files di configurazione dovrebbero semplicemente contenere una lista con i nomi dei moduli da caricare, separati da ritorni a capo. Le linee vuote o quelle il cui primo carattere non è né uno spazio né #; sono ignorate. Ad esempio:

/etc/modules-load.d/virtio-net.conf
# Carica virtio-net.ko al boot
virtio-net

vedere man 5 modules-load.d per maggiori dettagli.

Impostazione delle opzioni

Per passare parametri al modulo del kernel è possibile utilizzare un file di configurazione oppure la linea di comando del kernel.

Usando i file in /etc/modprobe.d/

La directory /etc/modprobe.d/ può essere usata per passare la configurazione dei moduli a udev, il quale utilizza modprobe per gestire il caricamento dei moduli durante l'avvio del sistema. È possibile usare file di configurazione con qualunque nome in tale directory, purché terminino con l'estensione .conf. La sintassi è:

/etc/modprobe.d/mionomefile.conf
options nomemodulo nomeparametro=valoreparametro

Ad esempio:

/etc/modprobe.d/thinkfan.conf
#Sui Thinkpad, questo permette al demone 'thinkfan' di controllare la velocità delle ventole.
options thinkpad_acpi fan_control=1
Nota: Se qualcuno dei moduli coinvolti è caricato dal ramdisk di init, si dovranno aggiungere i necessari file .conf all'array FILES in mkinitcpio.conf, in maniera che i moduli siano inclusi nel ramdisk.

Usando la riga di comando del kernel

Se il modulo è compilato nel kernel è possibile passare le opzioni al modulo utilizzando la linea di comando del kernel. Tutti i bootloader più comuni supportano la seguente sintassi:

nomemodulo.nomeparametro=valoreparametro

Ad esempio:

thinkpad_acpi.fan_control=1

Basta semplicemente aggiungere queste opzioni alla linea del kernel per il proprio bootloader come descritto in Kernel parameters.

Alias

Gli alias sono nomi alternativi per un modulo. Ad esempio alias mio-mod lunghissimo_nome_modulo permette di usare modprobe mio-mod invece di modprobe lunghissimo_nome_modulo. Si possono anche usare wildcard come nella shell, per cui alias mio-mod* lunghissimo_nome_modulo permette di usare modprobe mio-mod-qualcosa con il medesimo risultato. Creare un alias:

/etc/modprobe.d/myalias.conf
alias mio-mod lunghissimo_nome_modulo

Alcuni moduli hanno alias che vengono utilizzati per il loro caricamento automatico quando vengono richiesti da una applicazione. Disabilitando questi alias verrà impedito il caricamento automatico, ma sarà comunque possibile caricarli manualmente.

/etc/modprobe.d/modprobe.conf
#Impedisci il caricamento automatico di Bluetooth.

alias net-pf-31 off

Blacklist

Con l'espressione "mettere un modulo in blacklist" si intende il meccanismo che impedisce al kernel di caricare tale modulo. Questo può essere usato anche quando la periferica hardware associata al modulo non viene utilizzata e non si desidera farla funzionare, oppure perché il caricamento del modulo crea problemi: ad esempio potrebbe verificarsi il caricamento contemporaneo di due moduli che cercano di controllare la stessa periferica o componente hardware, creando quindi un conflitto.

Alcuni moduli vengono caricati in quanto parte dell'initramfs. Usando il comando mkinitcpio -M verranno mostrati tutti i moduli caricati dal hook autodetect: per impedire all'initramfs di caricare alcuni di quei moduli, sarà necessario inserirli in blacklist tramite il file /etc/modprobe.d/modprobe.conf. Utilizzando il comando mkinitcpio -v verranno elencati tutti i moduli inseriti nell'initramfs da tutti gli hook (ad esempio dal hook filesystem, dal hook SCSI eccetera). Ricordarsi di rigenerare l'initramfs una volta inseriti i moduli in blacklist.

Usando i file in /etc/modprobe.d/

Creare un file .conf all'interno della cartella /etc/modprobe.d/ ed inserire all'interno una riga per ogni modulo che si desidera mettere in blacklist, usando la parola chiave blacklist. Ad esempio se si desidera impedire il caricamento del modulo pcspkr:

/etc/modprobe.d/nobeep.conf
# Non caricare il modulo pcspkr all'avvio
blacklist pcspkr
Nota: L'uso dell'opzione blacklist impedisce il caricamento automatico del modulo. Questo potrebbe però essere caricato nel caso in cui fosse dipendenza di un secondo modulo. E quindi, nel momento in cui quest'ultimo venisse caricato, verrebbe fatto lo stesso anche per il primo, nonostante il blacklist.

Esiste comunque un modo di evitare questo inconveniente; utilizzando l'opzione install sarà possibile eseguire un comando personalizzato invece di inserire il modulo in memoria, si potrà quindi forzare il fallimento nel caricamento del modulo usando:

etc/modprobe.d/blacklist.conf
...
install nome_modulo /bin/false
...
Questo impedirà il caricamento del modulo e di tutti quelli che da esso dipendono.

Uso della riga di comando del kernel

Tip: Questo metodo è utile nel caso in cui un modulo mal funzionante impedisce il corretto avvio del sistema.

Si può inoltre impedire il caricamento dei moduli tramite il bootloader. Aggiungere modprobe.blacklist=modname1,modname2,modname3 ai parametri del kernel. Leggere kernel parameters per maggiori informazioni.

Nota: Quando si mette in blacklist più di un modulo, fare attenzione a separarli solamente con virgole. Spazi o altri caratteri potrebbero infrangere la sintassi.

Gestione manuale dei moduli

I moduli del kernel sono gestiti per mezzo di applicazioni fornite dal pacchetto kmod. Queste possono anche essere utilizzate manualmente.

Per caricare un modulo:

# modprobe nome_modulo

Per rimuovere un modulo:

# modprobe -r nome_modulo

O, in alternativa:

# rmmod nome_modulo

Trucchi e Consigli

Funzione bash per elencare i parametri dei moduli

Qui sotto è presentata una funzione bash, da usare come root, che mostra una lista di tutti i moduli attualmente caricati insieme a tutti i loro parametri, compreso il loro valore corrente. Utilizza /proc/modules per recuperare la lista dei moduli caricati, quindi accede al file del modulo direttamente con modinfo per ottenere una descrizione del modulo e le descrizioni per ogni parametro (se disponibile), ed infine accede al filesystem sysfs per ottenere i nomi dei parametri ed i loro valori.

function aa_mod_parameters () 
{ 
    N=/dev/null;
    C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
    for mod in $(cat /proc/modules|cut -d" " -f1);
    do
        md=/sys/module/$mod/parameters;
        [[ ! -d $md ]] && continue;
        m=$mod;
        d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
        echo -en "$O$m$C";
        [[ ${#d} -gt 0 ]] && echo -n " - $d";
        echo;
        for mc in $(cd $md; echo *);
        do
            de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
            echo -en "\t$mc=`cat $md/$mc 2>$N`";
            [[ ${#de} -gt 1 ]] && echo -en " - $de";
            echo;
        done;
    done
}

Ed ecco un esempio di output:

# aa_mod_parameters
>>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver
        hird=0 - hird:host initiated resume duration, +1 for each 75us (int)
        ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool)
        log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int)
        park=0 - park:park setting; 1-3 back-to-back async packets (uint)

>>> processor - ACPI Processor Driver
        ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int)
        ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int)
        latency_factor=2 - latency_factor: (uint)

>>> usb_storage - USB Mass Storage driver for Linux
        delay_use=1 - delay_use:seconds to delay before using a new device (uint)
        option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
        quirks= - quirks:supplemental list of device IDs and their quirks (string)
        swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)

>>> video - ACPI Video Driver
        allow_duplicates=N - allow_duplicates: (bool)
        brightness_switch_enabled=Y - brightness_switch_enabled: (bool)
        use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)

Di seguito è riportata una variazione della funzione precedente che include una descrizione completa per ogni parametro. L'output è formattato in maniera leggermente diversa ed usa più colori.

function show_mod_parameter_info ()
{
  if tty -s <&1
  then
    green="\e[1;32m"
    yellow="\e[1;33m"
    cyan="\e[1;36m"
    reset="\e[0m"
  else
    green=
    yellow=
    cyan=
    reset=
  fi
  newline="
"

  while read mod
  do
    md=/sys/module/$mod/parameters
    [[ ! -d $md ]] && continue
    d="$(modinfo -d $mod 2>/dev/null | tr "\n" "\t")"
    echo -en "$green$mod$reset"
    [[ ${#d} -gt 0 ]] && echo -n " - $d"
    echo
    pnames=()
    pdescs=()
    pvals=()
    pdesc=
    add_desc=false
    while IFS="$newline" read p
    do
      if [[ $p =~ ^[[:space:]] ]]
      then
        pdesc+="$newline    $p"
      else
        $add_desc && pdescs+=("$pdesc")
        pname="${p%%:*}"
        pnames+=("$pname")
        pdesc=("    ${p#*:}")
        pvals+=("$(cat $md/$pname 2>/dev/null)")
      fi
      add_desc=true
    done < <(modinfo -p $mod 2>/dev/null)
    $add_desc && pdescs+=("$pdesc")
    for ((i=0; i<${#pnames[@]}; i++))
    do
      printf "  $cyan%s$reset = $yellow%s$reset\n%s\n" \
        ${pnames[i]} \
        "${pvals[i]}" \
        "${pdescs[i]}"
    done
    echo

  done < <(cut -d' ' -f1 /proc/modules | sort)
}

Altre risorse