Struttura del Micro Filesystem (µfs) Il Micro Filesystem deve essere organizzato all'interno di un unico file regolare Linux (dev_ufs) ed può basato sul filesystem FAT-32 con la gestione dei permessi in stile Unix/Linux. Il filesystem è composto dalle seguenti aree: Boot Sector: contiene le informazioni generali sulla partizione. La dimensione del boot sector è di 32. File Allocation Table (FAT): e' l'indice della partizione, mappa i diversi file o directory sui cluster dell'area dati. Area dati: e' divisa in cluster. Un file viene memorizzato in uno o piu' cluster. Boot Sector Area dati FAT C0 C1 C2 Cn File Allocation Table Boot Sector Le informazioni generali sulla partizione sono contenute nei primi 32 del µfs: il Boot Sector (nella terminologia Unix è chiamato superblock). I numeri composti da 2- o 4- all'interno del Boot Sector, sono memorizzati nella modalità little-endian (dal meno significativo al più significativo). Contenuto del boot sector: Dimensione (in ) Descrizione 0-1 2 per cluster (valori validi: 512, 1024, 2048, 4096, 8192) (D C ) 2-5 4 Numero di cluster presenti nell'area dati (C) 6-9 4 Dimensione in della FAT (D F ) 10-11 2 Versione del Filesystem ( 12: minor version, 13: major version) 12-15 4 Numero del cluster relativo alla directory di root 16-19 4 Dimensione in s della directory di root 20-29 10 Nome del volume della partizione 30-31 2 Firma 0x44BB ( 30: 0xBB, 31: 0x44)
File Allocation Table (FAT) La tabella di allocazione dei file (FAT) è l'indice utilizzato per mappare i file e le directory della partizione nei cluster dell'area dati. Ogni elemento i-esimo della tabella, che indicheremo con F[i], occupa 4 (32 bit) e descrive se il cluster C[i] è libero oppure è utilizzato da qualche file. F[0] F[1] F[2] F[C] C1 C2 Cc Special La seguente tabella mostra i valori da utilizzare per ogni elemento F[i]: Valore di F[i] (i > 0) 0x00000000 Cluster non utilizzato Significato 0x00000001 0xFFFFFFFE Cluster utilizzato. Il valore punta al prossimo cluster 0xFFFFFFFF Ultimo cluster di un file Il primo record della FAT (F[0]) è utilizzato per sapere se il filesystem e' stato smontato correttamente. F[0] assume i seguenti valori: Valore di F[0] 0x00000000 0x0000000F Partizione non montata Partizione montata Significato Esempio: F 0 1 2 3 4 5 6 7 8 9 Valore 0xF 0x4 0x0 0x0 0x6 0x0 0xFFFFFFF F 0x0 0x0 0x0 Se il cluster iniziale di un certo file è il numero 1, dalla tabella FAT leggo che il cluster successivo è il numero 4 ed infine il numero 6. In questo caso, per recuperare il contenuto del file devo leggere in sequenza i cluster 1, 4 e 6. Area dati L'area dati del µfs è divisa in cluster e contiene i files e le directory della partizione. Ogni file o directory è memorizzato in uno o più cluster. I cluster vengono numerati da 1 a C, dove C è il numero di cluster presenti nell'area dati (vedi boot sector). Il cluster che contiene la directory di root è identificato nel boot sector ( 12-15). Una directory table è un file speciale che contiene le informazioni su tutti i files
che la directory contiene. Directory table Ogni file o directory è rappresentato da un elemento di 48, questo contiene il nome, l'estensione, gli attributi, la data e l'ora di creazione, l'indirizzo del primo cluster che contiene il file e la dimensione in del file. Il formato di ogni elemento è il seguente: Dimensione (in ) Descrizione 0-18 19 Nome del file ed estensione 19-22 4 Attributi del file/directory 23 1 Numero di hard-link 24-27 4 User ID del proprietario del file 28-31 4 Group ID del proprietario del file 32-35 4 Data e Ora di creazione del file (numero di secondi dal 1/1/1970) 36-39 4 Data e Ora dell'ultima modifica del file (numero di secondi dal 1/1/1970) 40-43 4 Primo cluster che contiene i dati del file 44-47 4 Dimensione in del file Anche in questo caso i numeri devono essere memorizzati nella modalità littleendian. Attributi di un file/directory Gli attributi di un file o directory ( 19-22 di un elemento della directory table) derivano dal campo st_mode della struttura struct stat di Linux (vedi man 2 stat). La seguente tabella riassume i valori che possono essere utilizzati in bit AND per descrivere gli attributi di un file: Valore 0x00120000 0x00100000 0x00040000 Valore 0x00000400 0x00000200 0x00000100 0x00000040 Tipo del file Link simbolico File regolare Directory Permessi Il proprietario ha il permesso in lettura Il proprietario ha il permesso in scrittura Il proprietario ha il permesso di esecuzione Il gruppo ha il permesso in lettura
0x00000020 0x00000010 0x00000004 0x00000002 0x00000001 Il gruppo ha il permesso in scrittura Il gruppo ha il permesso di esecuzione Gli altri hanno il permesso in lettura Gli altri hanno il permesso in scrittura Gli altri hanno il permesso di esecuzione Data e Ora di creazione o modifica di un file La data e l'ora di creazione e modifica di un file rispecchiano la convenzione Linux (vedi man 2 time) e quindi contengono il numero di secondi dall'epoca (01/01/1970).
Creazione del filesystem µfs Il filesystem deve essere creato con la seguente sintassi: dove: ufs_mke2fs [-s dim-cluster] [-n nome-vol] device -s dim-cluster specifica la dimensione in di un cluster dell'area dati. I valori validi sono: 512, 1024 (default), 2048, 4096, 8192 -n nome-vol specifica il volume della partizione device è un file regolare Linux di una certa dimensione su cui creare il filesystem. Questo comando inizializza le seguenti strutture all'interno del file: Boot Sector (32 ) Tabella della FAT Root directory vuota La dimensione della tabella FAT può essere calcolata in base alle formule che seguono. Numero di Cluster dell'area dati e dimensione della FAT Alla creazione del filesystem abbiamo a disposizione i seguenti dati: D T : dimensione del file in D C : dimensione in di un cluster D B : dimensione in del boot sector (32 ) D R : dimensione in di un elemento della FAT (48 ) Da questi dati possiamo calcolare il numero di cluster che possono essere utilizzati nell'area dati e la dimensione della tabella FAT tramite le formule che seguono. Numero di cluster nell'area dati (C): C= D D T B dove x indica la parte intera inferiore di D R D x C Dimensione in della tabella FAT (D F ): D F =C D R Il numero di cluster nell'area dati può essere ricavato dalla seguente formula: D T =D B D F C D C cioè D T =D B C D R C D C
Esempio di creazione del filesystem µfs 1) Creare il file Linux dev_ufs (da 4 MB) che dovrà contenere il filesystem: dd if=/dev/zero of=dev_ufs bs=1k count=4096 2a) Formattare il file creato: ufs_mke2fs -s 1024 -n my_ufs1 dev_ufs 32 183,38 KB 3912 KB 608 FAT C1 C2 C3 C3912 Numero di cluster dell'area dati: 3912 Dimensione della FAT (s): 187776 Spazio non utilizzato (s): 608 2b) Formattare il file creato: ufs_mk2fs -s 512 -n my_ufs2 dev_ufs 32 351,08 KB 3744,50 KB 432 FAT C1 C2 C3 C7489 Numero di cluster dell'area dati: 7489 Dimensione della FAT (s): 359472 Spazio non utilizzato (s): 432 2c) Formattare il file creato: ufs_mk2fs -s 8192 -n my_ufs3 dev_ufs 32 23,89 KB 4072 KB 112 FAT C1 C2 C3 C509 Numero di cluster dell'area dati: 509 Dimensione della FAT (s): 24432 Spazio non utilizzato (s): 112