Il File System è quel componente del SO che realizza i servizi di gestione dei file. Rappresenta la struttura logica della memoria di massa ed è costituito da un insieme di funzioni di SO e relative strutture dati di support. Linux è in grado di gestire file system molto diversi (standard, di rete, etc).
Definiamo un virtual file system come un interfaccia unica per gestire i diversi file system che mette a disposizione le API che consentono utilizzo indipendente delle chiamate di sistema.
Le astrazioni fornite dal file system sono:
I dispositivi di memorizzazione non volatile possono essere suddivisi in porzioni dette partizioni. Ogni partizione può essere funzionalmente considerata come un dispositivo logico indipendente.
L'indirizzamento dei dati si basa sul concetto di Logical Block Address (LBA), uno schema di indirizzamento nel quale l'intero dispositivo è rappresentato come un vettore lineare di blocchi, ogniuno costituito da un certo numero byte.
Il termine volume indica una partizione di qualsiasi dispositivo di memorizzazione non volatile di massa dotato di uno schema di indirizzamento LBA.
Il blocco costituisce l'unità fondamentale di informazione che viene trasferita con una sola operazione tra il disco e la memoria centrale.
Un file è un insieme costituito da una sequenza di byte, un nome simbolico e univoco ed un insieme di attributi. Un file in Linux può contenere dati o programmi, contenere riferimenti ad altri file, oppure rappresentare l'astrazione di un dispositivo periferico.
Tutte le operazioni sul contenuto del file richiedono il trasferimento in/da memoria di byte e partono dalla posizione corrente nel file, aggiornandola. Tra le operazioni principali troviamo creazione, apertura, chiusura, cancellazione, lettura, scrittura e riposizionamento.
Potremmo suddividere il modello d'utente in 2 aspetti:
L'accesso a un file può avvenire tramite mappatura di una VMA sul file, oppure tramite system call. Il VFS deve implementare ambedue le modalità
L'immagine del file system è memorizzata in memoria di massa. Per rendere più efficienti gli accessi a file, il SO mantiene in memoria centrale una parte delle strutture dati per gestire i file, tra cui la tabella dei file aperti per ogni processo, e la tabella globale dei file aperti nel sistema.
Il descrittore di file è un numero intero non negativo che rappresenta un file aperto da un processo e sul quale il processo può effettuare operazioni di I/O tramite system call.
I file sono organizzati in una struttura ad alberi i cui nodi sono detti cataloghi. Per semplificare la gestione dei file, i nomi dei file sono inseriti nei cataloghi.
Un catalogo non è altro che un file dedicato a contenere i nomi di altri file. I file dedicati a servire come catalogo sono detti di tipo catalogo, mentre i file che contengono normali informazioni sono detti di tipo normale. La struttura dei cataloghi si basa sull'esistenza di un unico catalogo principale detto radice, che il sistema è in grado di identificare ed accedere autonomamente.
Il nome completo di un file di qualsiasi tipo è costituito dal concatenamento dei nomi di tutti i cataloghi sul percorso che porta dalla radice al file stesso, separati dal simbolo "/".
Di seguito la struttura del File System Linux:
In Unix le periferiche sono viste come file speciali, simulate come file nel direttorio /dev. Sulle periferiche è possibile eseguire open, read, write, close, ma non create.
Ogni programma, all'esecuzione, dispone già di stdin, stdout e stderr.
Il file system svolge le sue funzioni appoggiandosi a due componenti:
Funzionamento:
In Linux esiste un unico albero di directory con radice /.
Ogni volume (partizione formattata con un FS) è montato in un punto dell’albero (mount point).
Il VFS fornisce un modello unificato per gestire file system diversi.
Mantiene:
Strutture principali:
struct dentry → rappresenta un’entry di directory.struct inode → rappresenta un file fisico e i suoi metadati.struct file → rappresenta un file aperto, con posizione corrente e contatore di riferimenti.Ogni processo possiede una tabella dei file aperti (files_struct) contenente un array fd_array.
fd_array è un puntatore a una struct file.struct file → punta a un dentry → che punta a un inode.struct file (quindi la stessa posizione corrente), oppure avere istanze separate ma riferirsi allo stesso inode.f_count nella tabella globale dei file indica quante aperture puntano allo stesso file.Ogni file ha un solo inode (relazione biunivoca). Contiene: dimensione, tipo, puntatori a funzioni operative (inode_operations per directory, file_operations per file) e un puntatore i_mapping alla struttura di mapping con la Page Cache.
address_space → page_tree).readpage).read/write tradizionali sia la mappatura in memoria (mmap).