I moduli driver vengono caricati e scaricati automaticamente?


15

Su Ubuntu 14.04, ho scoperto che quando non collego il mio adattatore wireless esterno, il suo modulo rt2800usbè ancora mostrato lsmod.

  1. quando avviene il caricamento automatico di un modulo driver? È quando il dispositivo è collegato al computer o all'avvio del sistema operativo?

  2. quando avviene lo scarico automatico di un modulo driver? È quando il dispositivo è disconnesso dal computer o quando il sistema operativo si spegne?

Risposte:


13

Quando il kernel rileva un nuovo dispositivo, esegue il programma modprobee gli passa un nome che identifica il dispositivo. La maggior parte dei dispositivi viene identificata tramite numeri registrati per un fornitore e un modello, ad esempio identificatori PCI o USB . Il modprobeprogramma consulta la tabella degli alias del modulo per trovare il nome del file che contiene il driver per quel particolare dispositivo. Un principio simile si applica ai driver per cose che non sono dispositivi hardware, come filesystem e algoritmi crittografici. Per maggiori dettagli, vedere Debian non rileva la scheda PCI seriale dopo il riavvio/lib/modules/VERSION/modules.alias

Una volta che modprobe ha identificato quale file del modulo ( .ko) contiene il driver richiesto, carica il file del modulo nel kernel: il codice del modulo viene caricato dinamicamente nel kernel. Se il modulo viene caricato correttamente, verrà visualizzato nell'elenco da lsmod.

Il caricamento automatico dei moduli avviene quando il kernel rileva nuovo hardware hot plug, ad esempio quando si collega una periferica USB. Il sistema operativo esegue inoltre un enumerazione di tutto l'hardware presente sul sistema durante l'avvio, al fine di caricare i driver per le periferiche presenti all'avvio.

È anche possibile richiedere manualmente il caricamento di un modulo con il comando modprobeo insmod. La maggior parte delle distribuzioni include uno script di avvio che carica i moduli elencati in /etc/modules. Un altro modo per caricare i moduli è se sono una dipendenza di un modulo: se il modulo A dipende dal modulo B, quindi modprobe Acarica B prima di caricare A.

Una volta caricato, un modulo rimane caricato fino a quando non viene scaricato esplicitamente, anche se tutti i dispositivi che utilizzano quel driver sono stati disconnessi. Molto tempo fa, c'era un meccanismo per scaricare automaticamente i moduli inutilizzati, ma è stato rimosso, se ricordo bene, quando udev è entrato in scena. Ho il sospetto che lo scarico automatico dei moduli non sia una caratteristica comune perché i sistemi che tendono ad averne bisogno sono per lo più PC desktop che hanno comunque molta memoria (sulla scala del codice del driver).


Grazie. Non ho modificato /etc/modules. rt2800usbè nell'output di lsmod, e ciò significa che ho collegato il suo dispositivo al mio computer prima dall'avvio?
Tim

1
@Tim Se il modulo è caricato e non lo hai caricato esplicitamente e non è elencato in /etc/modules, quindi sì, presumibilmente il motivo per cui il modulo è caricato è perché il dispositivo era presente ad un certo punto.
Gilles 'SO- smetti di essere malvagio' il

5

I moduli vengono caricati all'avvio del sistema tramite il disco RAM iniziale noto come initrd . La sezione logica afferma:

Molte distribuzioni Linux forniscono una singola immagine generica del kernel Linux, creata dagli sviluppatori della distribuzione appositamente per l'avvio su un'ampia varietà di hardware. I driver di dispositivo per questa immagine del kernel generica sono inclusi come moduli del kernel caricabili perché la compilazione statica di molti driver in un kernel fa sì che l'immagine del kernel sia molto più grande, forse troppo grande per l'avvio su computer con memoria limitata. Ciò solleva quindi il problema di rilevare e caricare i moduli necessari per montare il file system di root all'avvio, o del resto, deducendo dove o cosa sia il file system di root.

Ubuntu come molte altre distribuzioni, sceglie di caricare tutti i driver di dispositivo in questo initrd, indipendentemente dal fatto che il driver sia necessario o meno, e anche indipendentemente dal fatto che il dispositivo sia presente sul sistema o meno. Come ha sottolineato Giles, l'intera cosa viene caricata nella RAM, quindi i moduli utilizzati vengono rilevati all'avvio e quelli inutilizzati vengono rimossi dalla RAM. L'uso di questo approccio garantisce che Ubuntu si avvierà sempre su qualsiasi sistema indipendentemente dalla configurazione. Ubuntu imita un kernel monolitico usando costrutti microkernel. Vedi il motivo per cui funziona


  1. Il modulo rt2800usbverrà sempre caricato all'avvio perché il modulo è stato incluso negli initramfs cui si riferiva Gilles. Initramfs è un successore di initrd, quindi verrà sempre mostrato da lsmod. Nota che puoi inserire un modulo appena compilato nel kernel usando modprobeseguito dal nome del modulo.

Come test riavviare il sistema con l'adattatore wireless scollegato. Se tutto va bene, il modulo non verrà elencato lsmodnell'output s poiché durante l'avvio il processo di rilevamento avviato da initramfs e init sstem non ha trovato il dispositivo durante il sondaggio e il modulo è stato rimosso dalla RAM.

  1. Per rimuovere un modulo mentre un sistema è in esecuzione, è possibile utilizzare comandi come rmmodo modprobe -rseguiti dal nome del modulo. Al successivo avvio il modulo verrà ricaricato. Vedi sopra. Nella maggior parte dei casi un modulo non viene rimosso in modo dinamico, poiché ciò disabiliterebbe il hotplugging, ovvero una volta rimosso un modulo il dispositivo che lo utilizza non può essere rilevato nuovamente quando viene ricollegato.

Per rimuovere un modulo da lsmod, è necessario rimuoverlo dall'immagine initramfs creata ricompilando il kernel senza il modulo scelto e quindi ricostruendo l'immagine. In questo modo si disabilita tutto il rilevamento di detto modulo.


3
Stai confondendo caricando un file nella RAM come parte di un disco RAM e caricando (cioè collegando dinamicamente) un modulo nel kernel in esecuzione. I moduli vengono caricati temporaneamente in memoria - non nel kernel - dall'inizrd (tecnicamente un initramfs al giorno d'oggi), ma vengono quindi rimossi dalla memoria dopo che è stata montata la radice reale. I moduli vengono caricati nel kernel solo quando viene rilevato un dispositivo che li utilizza (con poche eccezioni).
Gilles 'SO- smetti di essere malvagio' il

Mentre sono d'accordo qui, stava parlando di scaricare e caricare un modulo che non può essere fatto a meno che non scelga di riconfigurare il disco RAM di Ubuntu, che non è raccomandato perché Ubuntu sceglie di caricare tutti i moduli nella RAM ad ogni aggiornamento del kernel. Tutti i moduli vengono caricati ogni volta, semplicemente non sono tutti utilizzati.
eyoung100,

2
No, la domanda riguarda il caricamento e lo scaricamento di un modulo nel kernel. Né la tua risposta originale né la tua risposta modificata lo affrontano. Initramfs è irrilevante (o al massimo periferico rilevante) per questa domanda.
Gilles 'SO- smetti di essere malvagio' il

@Gilles È meglio ??
eyoung100,

1
@ eyoung100, sono d'accordo con Gilles. Una discussione su initramfs non è rilevante per la domanda. I moduli vengono generalmente caricati enumerando i dispositivi /syse caricando i driver per i dispositivi che si trovano effettivamente nel sistema. Questo succede se il dispositivo è presente all'avvio o hot plug in seguito. udevha molto più a che fare con esso di initramfs / initrd, e se tutti, la maggior parte o solo alcuni moduli vengano copiati in initramfs (un'opzione di configurazione in /etc/initramfs-tools/initramfs.conf) non è particolarmente rilevante.
Celada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.