Ho un modulo del kernel Linux che ho compilato dinamicamente. Come viene aggiunto all'avvio? Ci sono molti .ko
file in /lib/modules
. Come viene impostata la priorità per il caricamento di questi moduli?
Ho un modulo del kernel Linux che ho compilato dinamicamente. Come viene aggiunto all'avvio? Ci sono molti .ko
file in /lib/modules
. Come viene impostata la priorità per il caricamento di questi moduli?
Risposte:
Non vengono caricati automaticamente all'avvio o in qualsiasi altro momento, anche se molti di essi finiscono per essere caricati durante l'avvio. Esistono tre diversi meccanismi con cui ciò accade:
Richiesta spazio utenti: che copre tutto, dai servizi di init a udev alla riga di comando. Init o udev sono probabilmente i mezzi più semplici se si desidera caricare un modulo specifico al momento dell'avvio.
Dispositivo hotplugged: quando si collega qualcosa, ad esempio, USB o PCI, il kernel lo rileva e richiede un modulo appropriato in base al modo in cui il dispositivo si identifica.
Protocollo necessario o altra implementazione : quando il kernel deve fare qualcosa, come leggere un filesystem, e scopre che non ha le conoscenze per farlo, richiederà un modulo.
Si noti che negli ultimi due ho usato la frase "richiesta un modulo" - questo perché il kernel si carica effettivamente tramite un demone dello spazio utente, kmod
che viene eseguito /sbin/modprobe
. Secondo Wolfgang Mauerer in Linux Kernel Architecture , ci sono solo ~ 100 punti diversi nel kernel 2.6 dove chiama una request_module()
funzione interna .
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 offre.
Molti sistemi sono impostati per utilizzare un initrd o initramfs . Queste sono immagini di filesystem che vengono caricate dal bootloader e rese disponibili al kernel prima che monti la partizione root. Ciò consente di compilare come moduli i driver necessari per montare la partizione di root (driver del disco, driver del file system, mapper del dispositivo o volume logico, ecc.) E caricarli da initrd / initramfs.
Gli script di avvio su initrd ( /linuxrc
) o initramfs ( /init
) in genere caricano alcuni moduli e individuano il filesystem di root. Ogni distribuzione ha la sua configurazione. Ubuntu utilizza un initramfs che viene assemblato dai componenti nel initramfs-tools
pacchetto e rigenerato per ciascun kernel in base ai driver necessari per montare il filesystem di root.
Dopo aver montato il filesystem di root, durante l'avvio del sistema, vengono caricati i moduli elencati in /etc/modules
(Debian, ...) o /etc/modules.conf
(Red Hat, Arch, ...). Questo file di solito elenca alcuni moduli, se presenti. La maggior parte dei moduli sono caricati 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 /lib/modules/$VERSION/modules.alias
che mappa queste designazioni sistematiche sui nomi dei moduli. Questa tabella è generata depmod
e letta da modprobe
.
Se si dispone di un modulo kernel aggiuntivo compilato manualmente per un dispositivo hardware, rilasciarlo /lib/modules/$VERSION/local
(creare la local
sottodirectory se non esiste) ed eseguire depmod -a
per rigenerare il database alias. Se il modulo è per qualche caratteristica insolita che il kernel non è in grado di rilevare automaticamente, rilasciarlo /lib/modules/$VERSION/local
, eseguirlo depmod -a
per analizzare le sue dipendenze e aggiungere il nome del modulo /etc/modules
.
/lib/modules/…
. Basta creare la local
sottodirectory ( depmod
attraversa /lib/module/$VERSION
ricorsivamente).
/var/lib/modules
né un/lib/modules/*/local
, né posso trovare alcuna menzione di questo su Google o nelladepmod
pagina man. Guardato in CentOS 6.4, 7.4 e Ubuntu 19.04.