Non vengono caricati automaticamente all'avvio o in qualsiasi altro momento, sebbene molti di essi finiscano per essere caricati durante l'avvio. Esistono tre diversi meccanismi attraverso i quali ciò accade:
-
Richiesta spazio utente: Che copre tutto, dai servizi init a udev alla riga di comando. Init o udev sono probabilmente i mezzi più diretti se vuoi caricare un modulo specifico al momento dell'avvio.
-
Dispositivo collegato a caldo: Quando colleghi qualcosa a, ad esempio, USB o PCI, il kernel lo rileva e richiede un modulo appropriato in base a come il dispositivo si identifica.
-
Protocollo o altra implementazione necessari :Quando il kernel ha bisogno di fare qualcosa, come leggere un filesystem, e scopre di non avere le conoscenze per farlo, richiederà un modulo.
Si noti che per gli ultimi due ho usato la frase "request a module" -- questo perché il kernel si carica effettivamente tramite un demone dello spazio utente, kmod
che esegue /sbin/modprobe
. Secondo Wolfgang Mauerer in Linux Kernel Architecture , ci sono solo ~100 punti diversi nel kernel 2.6 in cui chiama un request_module()
interno funzione.
modprobe
utilizza un database di MODULE_ALIAS installati. Questi sono specificati esplicitamente nel codice sorgente del modulo o derivati dal suo MODULE_DEVICE_TABLE, che è un elenco di ID dispositivo OEM che il modulo serve.
Molti sistemi sono impostati per utilizzare initrd o initramfs. Queste sono immagini del filesystem che vengono caricate dal bootloader e rese disponibili al kernel prima che monti la partizione root. Ciò consente ai driver necessari per montare la partizione root (driver del disco, driver del filesystem, device mapper o driver del volume logico, ...) di essere compilati come moduli e caricati da initrd/initramfs.
Gli script di avvio su initrd (/linuxrc
) o initramfs (/init
) in genere carica alcuni moduli e individua il filesystem root. Ogni distribuzione ha la sua configurazione. Ubuntu usa un initramfs che è assemblato da componenti nel initramfs-tools
pacchetto e rigenerato per ogni kernel in base ai driver necessari per montare il filesystem di root.
Dopo che il filesystem root è stato montato, durante l'avvio del sistema, i moduli elencati in /etc/modules
(Debian, …) o /etc/modules.conf
(Red Hat, Arch, …) sono caricati. Questo file di solito elenca pochi moduli, se ce ne sono. La maggior parte dei moduli viene caricata su richiesta.
Quando il kernel rileva dell'hardware per il quale manca un driver, o alcuni altri componenti come protocolli di rete o algoritmi crittografici, chiama /sbin/modprobe
per caricare il modulo. Per i driver hardware, il kernel passa i nomi che codificano l'ID PCI, l'ID USB o altra designazione sistematica dell'hardware. C'è una tabella in /lib/modules/$VERSION/modules.alias
che associa queste designazioni sistematiche ai nomi dei moduli. Questa tabella è generata da depmod
e letto da modprobe
.
Se hai un modulo kernel aggiuntivo che hai compilato manualmente per un dispositivo hardware, rilascialo in /lib/modules/$VERSION/local
(crea il local
sottodirectory se non esiste) ed eseguire depmod -a
per rigenerare il database degli alias. Se il modulo è per qualche caratteristica insolita che il kernel non è in grado di rilevare automaticamente, rilascialo in /lib/modules/$VERSION/local
, esegui depmod -a
per analizzare le sue dipendenze e aggiungere il nome del modulo a /etc/modules
.