File System ext2
Struttura di base
Lo spazio fisico di un disco viene usualmente diviso in partizioni; ogni partizione può contenere un filesystem. Nel filesystem ext2 il blocco (block) definisce la minima unità di memorizzazione dei dati è generalmente delle dimensioni di 1.024 byte, ma la sua dimensione può essere scelta tra 1.024, 2.048 o 4.096 byte in fase di creazione del filesystem.
Struttura del filesystem ext2.
I blocchi vengono raggruppati in block group in modo da suddividere l’intero filesystem in entità autonome allo scopo di limitare eventuali errori che possono verificarsi nella struttura del filesystem (un errore è limitato all’interno di un block group e non compromette l’intero filesystem) e per ridurre i tempi di accesso alle informazioni, memorizzando i file nelle vicinanze delle directory che li contengono. Ogni block group contiene una copia delle informazioni essenziali del filesystem (superblock e descrittore del filesystem sono quindi ridondati) per una maggiore affidabilità e possibilità di recupero in caso di corruzione del superblock principale.
Superblock contiene informazioni relative all’intero filesystem, ad esempio: numero totale dei blocchi, numero totale inode , contatore blocchi liberi, dimensione del blocco, numeri di blocchi per gruppo, numero di inode per gruppo, fata ora ultima operazione di “mount”, nome partizione.
Questi valori stabiliti al momento della creazione del filesystem e non possono essere più modificati, se non distruggendo il filesystem e creandone un altro.
FS descriptor contiene informazioni relative al block group a cui si riferisce, ad esempio: il numero dei blocchi liberi, quello degli inode liberi e delle directory presenti nel block group.
Data block bitmap è una sequenza di bit, ognuno dei quali indica se il corrispondente data block del block group è libero o allocato.
Inode bitmap analogo al data block bitmap ma si riferisce agli inode
Inode table è la porzione del filesystem che contiene gli inode del block group, ovvero strutture adibite alla memorizzazione delle proprietà degli oggetti del filesystem.
Data blocks è la porzione del filesystem che contiene i blocchi (data blocks) del block group,
adibiti alla memorizzazione delle informazioni contenute all’interno dei file.
I file
In generale, un file contiene delle informazioni (data) ed è caratterizzato da alcune proprietà, come il tipo, la dimensione, i permessi di accesso. Queste proprietà sono chiamate metadati. Il filesystem ext2 memorizza i metadati di un file in un’apposita struttura, detta index node, o più comunemente inode, mentre le informazioni contenute nel file sono memorizzate nei blocchi, denominati anche data block.
Ogni inode è una struttura che contiene i valori sottoelencati ed il numero degli inode è fissato alla creazione del filesystem. Quando tutti gli inode saranno utilizzati (allocati) da altrettanti file, non sarà più possibile creare altri file anche se ci sono data block liberi.
In un inode ext2 vengono memorizzati i metadati di un file, tra cui
• Tipo indica il tipo di file (regular file, directory, symbolic link, ...).
• UID proprietario identifica l’utente propriertario del file (è il suo UID);
• GID proprietario identifica il gruppo propriertario del file (è il suo GID);
• Permessi (mode) sono i permessi di accesso al file;
• Dimensione indica la lunghezza del file in byte.
• Numero dei data block indica il numero dei data block utilizzati per memorizzare il file.
• data/ora dell’ultima modifica (mtime) è il riferimento al momento nel quale il contenuto del file ha subito l’ultima modifica (quella più recente);
• data/ora dell’ultimo cambiamento dei metadati (ctime) è il riferimento al momento nel quale l’inode relativo al file in questione ha subito l’ultima modifica (anche se il suo contenuto non è stato modificato);
• data/ora dell’ultimo accesso (atime) è il riferimento al momento nel quale il file è stato acceduto l’ultima volta;
• data/ora di cancellazione (dtime) è il riferimento al momento nel quale il file è stato cancellato (tale campo, se diverso da 0, indica che l’inode è stato cancellato ed il filesystem può riutilizzare lo spazio del disco da esso occupato per memorizzarci un altro inode);
• Numero degli hard link indica il numero degli hard link associati al file);
• Riferimenti ai data block sono i riferimenti ai blocchi nei quali sono memorizzate le informazioni contenute nel file. In particolare per ogni inode possono essere memorizzati fino a 12 riferimenti a blocchi contenenti dati (direct block), un riferimento ad un blocco che a sua volta contiene un elenco di direct block (indirect block), un riferimento ad un blocco che a sua volta contiene un elenco di indirect block (double indirect block) ed un riferimento ad un blocco che a sua volta contiene un elenco di double indirect block (triple indirect block).
È da notare il fatto che tra i metadati di un inode non c’è il nome del file, in quanto esso viene
memorizzato soltanto all’interno della directory che lo contiene (cioè nei data block relativi
all’inode della directory che lo contiene). Questo permette la gestione degli hard link.
I tipi di file
In GNU/Linux possono essere utilizzati vari tipi di file, ognuno identificato da uno specifico codice che filesystem ext2 memorizza nei metadati relativi al file considerato.
I file “standard” o regular file
A tale categoria appartiene la maggior parte dei file presenti sui filesystem. Tale tipo rappresenta il file nella sua accezione di base, ovvero un contenitore di informazioni senza caratteristiche particolari. I file di questo tipo sono anche detti regular file.
Le directory
Una directory è un file particolare che contiene un elenco di elementi detti dentry (directory entry), ognuno dei quali è costituito da:
• il numero di inode al quale si riferisce;
• la lunghezza della dentry;
• la lunghezza del nome del file;
• il tipo del file;
• il nome del file;
I numeri degli inode presenti in tale elenco, costituiscono i riferimenti univoci agli inode relativi ai file (o directory) accessibili da tale directory, cioè i file (o directory) contenuti all’interno della directory. Si tenga presente che la dimensione del campo name è variabile.
All’interno della directory sono sempre presenti le directory . e .. che indicano rispettivamente la directory stessa e la directory padre.
Quando viene specificato il percorso di un file (path), il kernel ricerca nelle dentry delle varie
directory che costituiscono il path del file, il nome indicato, per trovare di volta in volta il relativo
numero di inode e per poter così accedere alle informazioni in esso contenute. Una volta raggiunto l’inode relativo al file indicato, il sistema ha i riferimenti per poter accedere alle informazioni contenute nel file stesso.
Esempio di accesso ad un file.
I link