Come posso implementare un driver del driver del file system in Linux? [chiuso]


14

Supponiamo di aver inventato un nuovo file system e ora voglio creare un driver di file system per esso.

Come implementare questo driver di file system, questo viene fatto usando un modulo kernel?

E come può il driver del file system accedere al disco rigido, se il driver del file system contiene codice per accedere al disco rigido o Linux contiene un driver del dispositivo per accedere al disco rigido utilizzato da tutti i driver del file system?

Risposte:


24

Sì, i filesystem in Linux possono essere implementati come moduli del kernel. Ma c'è anche l'interfaccia FUSE (Filesystem in USErspace), che può consentire a un normale processo di spazio utente di fungere da driver di filesystem. Se stai prototipando un nuovo filesystem, implementarlo prima utilizzando l'interfaccia FUSE potrebbe semplificare i test e lo sviluppo. Una volta elaborati gli interni del filesystem in formato FUSE, è possibile iniziare a implementare una versione del modulo del kernel ottimizzata per le prestazioni.

Ecco alcune informazioni di base sull'implementazione di un filesystem nello spazio del kernel. È piuttosto vecchio (dal 1996!), Ma questo dovrebbe almeno darti un'idea di base per il tipo di cose che devi fare.

Se si sceglie di accedere al percorso FUSE, ecco libfuse, l'implementazione di riferimento del lato spazio utente dell'interfaccia FUSE.

Driver del filesystem come modulo del kernel

Fondamentalmente, la funzione di inizializzazione del modulo del driver del file system deve semplicemente chiamare una register_filesystem()funzione e assegnarle come parametro una struttura che include un puntatore a funzione che identifica la funzione nel driver del file system che verrà utilizzata come primo passo nell'identificazione del file system digitare e montarlo. Non succede più nulla in quella fase.

Quando viene montato un filesystem e viene specificato il tipo di filesystem in base al proprio driver, oppure viene eseguito il rilevamento automatico del tipo di filesystem, il layer Virtual FileSystem del kernel (VFS in breve) chiamerà quella funzione. Sostanzialmente dice "Ecco un puntatore a una rappresentazione a livello di kernel di un dispositivo a blocchi Linux standard. Dai un'occhiata, vedi se è qualcosa che puoi gestire, e poi dimmi cosa puoi fare con esso."

A quel punto, il tuo driver dovrebbe leggere tutto ciò di cui ha bisogno per verificare che sia il driver giusto per il filesystem, e quindi restituire una struttura che include puntatori a ulteriori funzioni che il tuo driver può fare con quel particolare filesystem. Oppure, se il driver del file system non riconosce i dati sul disco, si suppone che restituisca un risultato di errore appropriato, quindi VFS segnalerà un errore nello spazio utente o - se viene eseguito il rilevamento automatico del tipo di file system - chiederà un altro file system autista da provare.

Gli altri driver nel kernel forniranno l'interfaccia standard del dispositivo a blocchi, quindi il driver del filesystem non dovrà implementare il supporto hardware. Fondamentalmente, il driver del filesystem può leggere e scrivere blocchi di dischi usando le funzioni standard a livello di kernel con il puntatore del dispositivo fornito.

Il livello VFS prevede che il driver del file system renda disponibili una serie di funzioni standard per il livello VFS; alcuni di questi sono obbligatori affinché il livello VFS possa fare qualcosa di significativo con il filesystem, altri sono opzionali e puoi semplicemente restituire un NULL al posto di un puntatore a tale funzione opzionale.


1
Questa è una buona risposta, anche se per rispondere pienamente alla domanda, come indicato, dovresti anche dire qualcosa sulla funzionalità che il livello del dispositivo a blocchi fornisce al livello del file system su cui basare.
Kasperd,

Mi sono in qualche modo accennato a questo con il bit "ecco un puntatore a un dispositivo a blocchi standard", ma un buon punto; Mi sono espanso su questo.
telcoM,

Questa risposta, in particolare la descrizione di ciò che accade in quale ordine, è divina. Esiste una sorta di libro / sito web che potrei leggere con descrizioni simili a quelle di "come funziona linux"?
Adam Barnes,

Potresti essere interessato a Linux Kernel Internals o Linux Device Driver, 3rd Edition . E, naturalmente, c'è la possibilità di leggere il codice sorgente effettivo.
telcoM


0

Sì, questo sarebbe normalmente fatto usando un driver del kernel che può essere caricato come modulo del kernel o compilato nel kernel.

Puoi controllare driver di filesystem simili e come funzionano qui .

Questi driver probabilmente usano le funzioni interne del kernel per accedere ai dispositivi di archiviazione come blocchi di byte, ma è anche possibile utilizzare i dispositivi a blocchi esposti dai driver nelle cartelle dei dispositivi a blocchi e dei caratteri .


0

È possibile utilizzare fuse per creare un file system utente-land o scrivere un modulo del kernel. È più facile avere a che fare con miccia, dato che hai una scelta di lingue e non bloccherà il kernel (e quindi l'intero sistema).

I moduli del kernel possono essere più veloci, ma la prima regola di ottimizzazione è: non farlo finché non hai testato il codice di lavoro. Il secondo è simile: non farlo finché non si ha la prova che è troppo lento. E il terzo: non tenerlo a meno che non si abbia la prova che lo rende più veloce / più piccolo.

E sì, il kernel ha già i driver per l'hardware, non è possibile implementarli nuovamente.


Ci sono molti aspetti negativi di FUSE oltre alle prestazioni: è difficile usarlo per il tuo filesystem di root. (Forse possibile con un initrd, ma il binario FUSE non può essere liberato dopo l'avvio perché sarebbe ancora in esecuzione dal ramdisk.)
Peter Cordes,

1
@PeterCordes Non può essere liberato , ma ciò non significa che non possa essere scollegato. Se c'è ancora un riferimento ad esso, sarà tenuto in memoria indipendentemente dal fatto che tu abbia lasciato o meno gli initramfs e cancellato il binario sottostante.
foresta

@forest: giusto, quindi non puoi smontare initrd dopo pivot_root, perché ci sono ancora inode occupati in initramfs.
Peter Cordes,

Un normale /initiniziato da un initramfs verrà (credo) /initeseguito dopo pivot_root, per trasferire il controllo ai veri root FS /init. Ma un binario FUSE non potrebbe sostituirsi con execve se l'accesso al root FS dipendeva dal processo FUSE che rispondeva al kernel. Beh, forse innescando prima il pagecache, ma non sembra affidabile.
Peter Cordes,
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.