• Non ci sono risultati.

File System ext2 Struttura di base

N/A
N/A
Protected

Academic year: 2021

Condividi "File System ext2 Struttura di base"

Copied!
5
0
0

Testo completo

(1)

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.

(2)

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.

(3)

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

(4)

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

Nei sistemi Unix-like dunque un file (o directory) è rappresentato da un inode, all’interno del quale sono memorizzati i sui metadati, ovvero i suoi dati caratteristici ed in esso vi sono i riferimenti ai blocchi che contengono il contenuto vero e proprio del file. Come si può notare dalla struttura, negli inode non viene memorizzato il nome del file, poiché esso non è una caratteristica intrinseca del file stesso (il file è individuato univocamente dal numero di inode), ma è semplicemente un’etichetta memorizzata nelle dentry che serve come riferimento per poter accedere all’inode relativo al file.

Quindi, sebbene un nome di file individui un solo inode, lo stesso inode può essere individuato da più nomi di file. L’associazione tra il nome del file e l’inode a cui si riferisce, memorizzato nelle dentry, è detta hard link (physical link, collegamento fisico o collegamento diretto). Dunque, un file (inode) può avere più hard link (più nomi) che si riferiscono ad esso.

Quando viene creato un hard link, viene incrementato il contatore dei riferimenti nell’inode relativo (i_links_count). In questo modo il sistema tiene traccia di quanti hard link sono riferiti ad ogni inode. L’eliminazione di un hard link non implica l’eliminazione di un file, ovvero dell’inode relativo, ma un file viene effettivamente eliminato dal filesystem soltanto quando l’ultimo degli hard link ad esso relativi viene eliminato e nessun processo sta utilizzando il file (inode) in questione.

Alla creazione di un file viene sempre creato un hard link ad esso relativo, cioè il primo riferimento a sé stesso che è una dentry all’interno della directory che lo contiene. In tale dentry sarà memorizzato il nome associato a tale hard link (il nome del file).

È possibile creare hard link soltanto sui filesystem che li supportano e, comunque, sia l’inode che il relativo hard link devono trovarsi sullo stesso filesystem;

GNU/Linux permette la creazione di file particolari che il sistema riconosce come tali: i symbolic link (symlink, soft link o collegamenti simbolici). Essi sono dei file che contengono soltanto il path relativo al file o directory a cui si riferiscono.

È importante sottolineare il fatto che il sistema non tiene conto, all’interno degli inode, dei symbolic

(5)

link che si riferiscono ad essi, come invece avviene per gli hard link: quindi è possibile ottenere dei dangling link (collegamenti penzolanti) ovvero dei symbolic link che non sono collegati ad un file o ad una directory esistente.

Per contro, i symbolic link non hanno le restrizioni degli hard link, quindi è possibile anche creare symbolic link relativi a file o directory situati in filesystem diversi da quello in cui viene creato il link. I link vengono creati per mezzo del comando ln.

La creazione di un link, sia hard che symbolic, non occupa molto spazio sul disco, poiché non effettua la copia del contenuto del file al quale il link si riferisce.

I file speciali

Alcuni file in GNU/Linux hanno caratteristiche particolari e per questo sono detti file speciali e si dividono in FIFO (o named pipe), file di dispositivo e socket (Unix domain socket).

Le FIFO o named pipe

Una FIFO, detta anche named pipe, è un file il cui funzionamento è simile a quello di una pipe, cioè come memoria di appoggio per lo scambio di informazioni tra processi. Quando i processi comunicano tra loro attraverso una FIFO, il sistema non utilizza il filesystem, ma il transito delle informazioni avviene direttamente in memoria centrale. Il file serve soltanto come riferimento univoco alla FIFO per i processi che la vogliono utilizzare per comunicare tra loro.Il nome FIFO deriva dal fatto che essa opera come una coda, ovvero è gestita in maniera tale che il primo dato in essa inserito è anche quello che viene estratto per primo (First In, First Out). Un processo può accedere in lettura e/o scrittura ad una FIFO, ovvero all’inode (file) presente sul filesystem, soltanto se ha i diritti per poterlo fare, come avviene per tutti gli altri file.

I file di dispositivo

I file di dispositivo o device file sono particolari file che i sistemi Unix-like associano ai dispositivi fisici. Ad esempio, ad un terminale (monitor) è associato un file di dispositivo che rappresenta per il sistema il buffer di output del terminale stesso, ovvero i caratteri scritti in quel file verranno visualizzati sullo schermo; allo stesso modo la tastiera è associata ad un file, ovvero tutto ciò che viene digitato dalla tastiera finisce in tale file ed il sistema operativo leggerà i comandi impartiti da tale file.

Per poter funzionare correttamente con il sistema, ogni dispositivo necessita di un apposito software denominato driver. Tale software ha il compito di far “vedere” il dispositivo al sistema, nel senso che si preoccupa di gestire i meccanismi per la comunicazione con il particolare dispositivo considerato. Quindi è necessario creare anche un file di dispositivo, con le opportune caratteristiche, da associare al dispositivo stesso. I file di dispositivo sono generalmente contenuti nella directory /dev.

I socket

I socket costituiscono un’interfaccia di comunicazione tra processi. I socket locali, o Unix domain socket (il nome deriva dal fatto che tale meccanismo di comunicazione è nato in ambiente Unix nel 1983) presi in considerazione in questo contesto, costituiscono il meccanismo di comunicazione tra processi esistenti su una stessa macchina. L’interfaccia dei socket viene attualmente utilizzata per la comunicazione tra processi esistenti anche su macchine diverse, ovvero per realizzare la comunicazione di rete.

Un socket rappresenta un canale di comunicazione tra due processi, nel quale si possono scrivere

informazioni e dal quale si possono leggerle. L’interfaccia dei socket è caratterizzata da un’elevata

genericità e flessibilità, tanto che si è diffusa in tutti gli ambienti di programmazione, anche in

quelli non legati al mondo Unix.

Riferimenti

Documenti correlati

copiando il descrittore del file da questo alla tabella dei file aperti.  Close(f) – il descrittore del file viene rimosso dalla tabella dei

 Open(f) – prende il nome del file e cerca nel dispositivo, copiando il descrittore del file da questo alla tabella dei file aperti.  Close(f) – il descrittore del file viene

– tabella associata ad ogni processo utente contenente una riga per ogni file aperto dal processo (indice = descrittore del file) con l’indirizzo della riga della tabella globale

• Le operazioni di lettura e scrittura su file ad accesso random fanno uso di un indice che si può spostare con le funzioni lseek (basso livello) e fseek (stream). • Ovviamente non

Calcolo dell’indirizzo fisico: a partire dall’indirizzo logico, il file system fisico individua il numero del blocco che contiene il record richiesto, in base alla lunghezza

Una conseguenza della struttura delle directory descritta e che costituisce una caratteristica peculiare dei file system dei sistemi Unix è che un inode può essere associato a più di

parzialmente contigua – il blocco diventa l’unità indirizzabile sul disco; un file viene memorizzato utilizzando qualsiasi blocco libero, tutti i blocchi utilizzati

 Utilizzare il contenuto del file raggi.txt per inizializzare un vettore cerchi di oggetti Cerchio.  Implementare la funzione membro operator> per confrontare due oggetti