Internet è il postino dei nostri tempi che nessun cane azzannerà.
Linux vede tutti i file system dalla prospettiva di un comune insieme di oggetti. Questi oggetti possono essere super blocchi, inode, dentry e file. Alla radice di ogni file system c’è il super blocco che descrive e mantiene lo stato del file system. Ogni oggetto gestito all’interno del file system (file o directory) è rappresentato come un inode.
L’inode contiene tutti i metadata per gestire gli oggetti del file system (incluso le operazioni che su di esso sono possibili). Un altro insieme di strutture chiamate dentry sono usate come ponte tra i nomi e gli inode per cui esiste una directory cache per mantenere quelli usati più di recente a portata di mano. Il dentry mantiene anche le relazioni tra le directory e i file per attraversare il file system. Infine, un file VFS rappresenta un file aperto (mantiene lo stato del file aperto come l’offset di scrittura e così via).
Il VFS agisce come il livello radice dell’interfaccia del file system. Il VFS mantiene traccia dei file system correntemente supportati, come anche quei file system che sono correntemente montati. I file system possono essere dinamicamente aggiunti o rimossi usando un insieme di funzioni di registrazione. Il kernel mantiene una lista di file system correntemente supportati, i quali possono essere visti dallo spazio utente attaverso il /proc file system. Questo file virtuale mostra anche i dispositivi correntemente associati con il file system. Per aggiungere un nuovo file system, viene invocato il register_filesystem. Questo prende un singolo argomento che definisce il riferimento alla struttura del file system (file_system_type) che definisce il nome del file system, un insieme di attributi e due funzioni di super blocco. Un file system, comunque, può anche essere deregistrato.
Il registrare un nuovo file system, pemette di mettere esso e le informazioni di sua pertinenza all’intero della lista dei file system (vedi la Figura sotto e .…/linux/include/fs.h). Questa lista definisce i file system che può essere supportati. Possiamo vedere questa lista scrivendo sul terminale cat /proc/filesystems.


Il super blocco è la struttura che rappresenta il file system. Include le necessarie informazioni per gestire il file system durante le operazioni. Include il nome del file system (come ext2), la dimensione del file system e il suo stato, un riferimento al blocco del dispositivo e metadata (come la lista libera e così via). Il super blocco è tipicamente memorizzato sul dispositivo di memorizzazione ma può essere creato in tempo reale se non ne esiste già uno.

Gli inode rappresentano un oggetto nel file system con unico identificatore. Il singolo file system fornisce metodi per tradurre il nome del file all’interno di un unico identificatore di inode e quindi al riferimento dell’inode. Una porzione della struttura dell’inode è mostrata di seguito insieme con un paio di altre strutture. Notiamo in particolare l’inode_operations e file_operations. Ognuna di queste strutture si riferisce una singola operazione che può essere eseguita sull’inode. Per esempio, inode_operatons definisce quelle operazioni che operano direttamente sull’inode e file_operations referisce quei metodi che sono relativi a file e directory (le standard system call). Gli inode e dentry più utilizzati di recente vengono mantenuti nell’inode cache e nella directory cache rispettivamente. Le strutture degli inode e dentry sono definite in …/linux/include/linux/fs.h.

Eccetto che per la particolare implementazione del file system, in fondo al sistema a strati vi è il buffer cache. Questo tiene traccia delle richieste di scrittura e lettura da un singolo file system e dai dispositivi fisici. Per questioni di efficienza, Linux mantiene una cache di richieste per evitare di dovere accedere al dispositivo fisico ad ogni richiesta, invece, il buffer per le richieste usate più di recente (most-recently used buffer) vengono messe in questa cache e possono essere restituire velocemente al singolo file system.
In quest’articolo non abbiamo speso tempo nell’esplorare le virtù di un file system particolare ma dobbiamo notare che Linux supporta un’ampia gamma di file system, dai vecchi file system come MINIX, MS-DOS e ext2 ai più recenti journaling file system come ext3, JFS e ReiserFS. In aggiunta, Linux supporta file system crittografati come CFS e file system virutali come /proc. Un’altro file system degno di nota è File System in Users Space, detto FUSE. Questo è un interessante progetto che consente di instradare le richieste al file system attraverso il VFS in user space.
Infine diciamo che l’implementazione di un file system, pur essendo semplice, è un buon esempio di architettura scalabile e estendibile. L’architettura del file system ha subito notevoli evoluzioni negli anni e ha, con successo, supportato molti tipi di file system e di dispositivi di memorizzazione molto differenti tra loro. Usare un’architettura basata su plug-in con molti livelli di indirezione funzionale la rende molto interessante agli occhi di un Architetto Software.
Recent comments
1 min 12 sec ago
1 week 1 day ago
3 weeks 20 hours ago
4 weeks 3 days ago
7 weeks 6 days ago
13 weeks 1 hour ago
13 weeks 3 days ago
15 weeks 5 days ago
16 weeks 3 days ago
19 weeks 22 hours ago