4.6.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, ..., ovvero quelli che vengono
denominati metadati (metadata). 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 ha la struttura riportata nella sez. 4.6.1 ed il numero degli inode è fissato alla
creazione del filesystem (per default viene creato un inode ogni 4096 byte disponibili
nella partizione considerata). 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 (v. sez. 4.6.5);
-
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
(v. sez. 4.6.3);
-
Riferimenti ai data block sono i riferimenti ai blocchi nei quali sono memorizzate le
informazioni contenute nel file (v. fig. 4.6). 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).
Ogni riferimento ai blocchi (direct o indirect) è relativo ad un blocco del filesystem, che
nel caso di indirect block contiene i riferimenti (ognuno di 4 byte) ad altri
blocchi.
Supponendo di avere blocchi di dimensione B un file potrà contenere al massimo
12 + B
4 + (B
4 )2 + (B
4 )3 blocchi. Considerando la dimensione dei blocchi di 1024 byte, la
dimensione massima di un file permessa da ext2 è 17247252480 byte (poco più
di 16 GiB) (16843020 blocchi), mentre con blocchi da 4096 byte si ha una
dimensione massima dei file di 4402345721856 byte (circa 4 TiB) (1074791436
blocchi).
Nel caso in cui, all’interno di un inode, il riferimento ad un blocco di dati
sia nullo (cioè contenga il valore 0), esso indica che non si riferisce a
nessun blocco (la numerazione dei blocchi e quella degli inode inizia da
1). Questo è il meccanismo di gestione che ext2 attua nel caso di sparse
file.
La dimensione massima di un file è la minore tra quella consentita dal filesystem
e quella consentita dal kernel. Infatti, su architetture a 32 bit, le system call
messe a disposizione dal kernel per l’accesso al filesytem utilizzano parametri
esprimibili su 32 bit, e quindi possono gestire file con dimensioni inferiori o
uguali a 231 - 1 = 2 147 483 647 byte (2 GiB). Con il kernel 2.4 (o successivo)
è stato implementato il LFS (Large File Support), ovvero sono state messe a
disposizione delle nuove system call per l’accesso al filesystem che utilizzano
parametri esprimibili su 64 bit, e quindi, teoricamente, il kernel non ha problemi
a gestire file di dimensioni fino a 263 - 1 = 9 223 372 036 854 775 807 byte (circa
8 EiB), per cui il limite della dimensione massima dei file dipende essenzialmente
dal filesystem.
|
È 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
(v. sez. 4.6.3.3).
In un inode del filesystem ext2 sono memorizzati particolari flag (o attributi) che
specificano appositi comportamenti di cui il sistema deve tenere di conto per tale inode
(ognuno di essi è memorizzato in un bit del campo i_flags). Tali flag sono descritti di
seguito
-
Secure Deletion indica al sistema di azzerare i relativi data block quando l’inode viene
cancellato;
-
Undeletable indica al sistema di preservare i data block relativi quando l’inode
viene cancellato, per poter permettere un successivo ripristino (non è nel kernel
standard);
-
Compress indica al sistema di gestire automaticamente la compressione e
decompressionere del file relativo ad ogni accesso allo stesso: la compressione del
file subito dopo il suo aggiornamento e la decompressione del file subito prima di
una lettura (non è nel kernel standard);
-
Synchronous update indica al sistema di effettuare operazioni di I/O sincrone su tale
inode (non deve essere utilizzato nessun meccanismo di caching);
-
No atime update indica al sistema di non aggiornare il campo i_atime dell’inode;
-
Append only indica al sistema di permettere soltanto l’accodamento (appending) di
informazioni per tale inode (nel caso di directory non permette la cancellazione
dei file in essa contenuti);
-
Immutable indica al sistema di non permettere nessuna modifica ai dati e metadati
relativi all’inode (i symbolic link a tale inode possono comunque essere creati);
-
No dump indica al comando dump di non considerare l’inode;
-
No tail-merging indica al sistema che il relativo file non deve avere un fragment
nell’ultimo blocco in comune con un altro file (per i filesystem che supportano il
tail-merging);
-
Journaling (ext3)
indica al sistema di aggiornare il journal prima di effettuare una variazione sull’inode
(ha senso soltanto se il filesystem è montato con le opzioni data=ordered o data=writeback);
Tali flag possono essere gestiti per mezzo dei comandi lsattr (list attributes - man page
lsattr(1)) e chattr (change attributes - man page chattr(1)).
____________________________________________________________________
Comando: lsattr
Path: /usr/bin/lsattr
SINTASSI
$ lsattr [option] [file_name]
DESCRIZIONE
Visualizza gli attributi di un inode del filesystem ext2.
-
option indica la modalità di funzionamento di lsattr. Può assumere i seguenti
valori
-
-R visualizza gli attributi delle directory e dei file in esse contenuti in
maniera ricorsiva;
-
-a visualizza tutti i file contenuti nelle directory, compresi quelli che
iniziano con il carattere ‘.’;
-
-d tratta le directory alla stregua dei file, piuttosto che visualizzare il
loro contenuto;
-
-v visualizza la versione dei file;
-
file_name indica il file (o directory) di cui visualizzare gli attributi;
____________________________________________________________________________________________________________________
___________________________________________________________________________________________________________________
Comando: chattr
Path: /usr/bin/chattr
SINTASSI
$ chattr [option] file_name
DESCRIZIONE
Modifica gli attributi di un inode del filesystem ext2.
-
option indica la modalità di funzionamento di chattr. Può assumere i seguenti
valori
-
-R modifica gli attributi delle directory e dei file in esse contenuti in
maniera ricorsiva;
-
-V visualizza gli atributi modificati;
-
-v version
imposta la varione del file secondo quanto indicato da version;
-
{+|-|=}attr
imposta (+), rimuove (-) o indica esattamente (=) l’elenco degli
attributi specificato da attr (i possibili valori sono riportati nella
tab. 4.4);
| Tabella 4.4: | Possibili attributi modificabili con chattr. |
|
-
file_name indica il file (o directory) al quale modificare gli attibuti;
____________________________________________________________________
In particolare, i flag Append only e Immutable possono rivelarsi utili come difesa contro
eventuali malintenzionati che possono intrufolarsi nel sistema.
Generalmente un filesystem memorizza il contenuto di un file in un numero intero di
blocchi, quindi se un file contiene una quantità di informazioni che non è un multiplo della
dimensione di un blocco, parte dello spazio dell’ultimo blocco del file risulta inutilizzato,
quindi mediamente si ha lo spreco della metà della dimensione di un blocco per ogni file (ad
esempio, per memorizzare un file di 1025 byte in un filesystem in cui la dimensione dei blocchi
è 1024 byte, vengono utilizzati 2 blocchi, ovvero 2048 byte, di cui gli ultimi 1023 sono
inutilizzati). Per ovviare a tale inconveniente (frammentazione interna), è previsto
l’utilizzo di porzioni di blocchi (i fragment), ma questa caratteristica non è attualmente
utilizzata.
Il filesystem ext2 riserva alcuni inode per memorizzare informazioni particolari, ad
esempio
-
• l’inode 1 contiene l’elenco dei blocchi danneggiati;
-
• l’inode 2 contiene la root directory del filesystem;
-
• gli inode 3 e 4 contengono informazioni relative all’ACL;
-
• l’inode 5 contiene informazioni relative al boot loader;
-
• l’inode 6 contiene informazioni relative ai file ripristinati;
-
• l’inode 7 contiene informazioni relative ai group descriptor;
Il primo inode utilizzato per memorizzare informazioni generiche è il numero
11.