>
MENU
bios.jpg

Hack del BIOS (Parte I)

Gestire le password degli utenti con uno script bash

27 novembre 2007 Visualizzazioni: 725 Focus

Il File System di Linux (2/2)

Linux vede tutti i file system dalla prospettiva di un comune insieme di oggetti. Questi oggetti possono essere super blocchi, inode, dentry e file. Alla radice di ogni file system c’è il super blocco che descrive e mantiene lo stato del file system. Ogni oggetto gestito all’interno del file system (file o directory) è rappresentato come un inode.


L’inode contiene tutti i metadata per gestire gli oggetti del file system (incluso le operazioni che su di esso sono possibili). Un altro insieme di strutture chiamate dentry sono usate come ponte tra i nomi e gli inode per cui esiste una directory cache per mantenere quelli usati più di recente a portata di mano. Il dentry mantiene anche le relazioni tra le directory e i file per attraversare il file system. Infine, un file VFS rappresenta un file aperto (mantiene lo stato del file aperto come l’offset di scrittura e così via).

Lo strato del Virtual File System
Il VFS agisce come il livello radice dell’interfaccia del file system. Il VFS mantiene traccia dei file system correntemente supportati, come anche quei file system che sono correntemente montati. I file system possono essere dinamicamente aggiunti o rimossi usando un insieme di funzioni di registrazione. Il kernel mantiene una lista di file system correntemente supportati, i quali possono essere visti dallo spazio utente attaverso il /proc file system. Questo file virtuale mostra anche i dispositivi correntemente associati con il file system. Per aggiungere un nuovo file system, viene invocato il register_filesystem. Questo prende un singolo argomento che definisce il riferimento alla struttura del file system (file_system_type) che definisce il nome del file system, un insieme di attributi e due funzioni di super blocco. Un file system, comunque, può anche essere deregistrato.

Il registrare un nuovo file system, pemette di mettere esso e le informazioni di sua pertinenza all’intero della lista dei file system (vedi la Figura sotto e .…/linux/include/fs.h). Questa lista definisce i file system che può essere supportati. Possiamo vedere questa lista scrivendo sul terminale cat /proc/filesystems.

figure2.jpg

Un’altra struttura mantenuta nel VFS è il file system attualmente montato (vedi Fiugra sotto). Questo elenca i file system correntemente montati (vedi linux/include/linux/mount.h). Questo viene legato alla struttura del super blocco che esploreremo successivamente.

figure3.jpg

Il Super Blocco
Il super blocco è la struttura che rappresenta il file system. Include le necessarie informazioni per gestire il file system durante le operazioni. Include il nome del file system (come ext2), la dimensione del file system e il suo stato, un riferimento al blocco del dispositivo e metadata (come la lista libera e così via). Il super blocco è tipicamente memorizzato sul dispositivo di memorizzazione ma può essere creato in tempo reale se non ne esiste già uno.

figure4.jpg

Possiamo trovare la struttura del super blocco in /linux/include/linux/fs.h. Un importante elemento del super blocco è la definizione delle operazioni su di esso. Questa struttura definisce l’insieme delle funzioni per gestire gli inode all’interno del file system. Per esempio, gli inode possono essere allocati con alloc_inode o cancellati con destroy_inode. Possiamo leggere e scrivere gli inode con rean_inode e write_inode o sincronizzare il file system con sync_fs. Ogni file system fornisce i propri metodi sugli inode che implementano le operazioni e fornisce l’astrazione comune allo strato VFS.

inode e dentry
Gli inode rappresentano un oggetto nel file system con unico identificatore. Il singolo file system fornisce metodi per tradurre il nome del file all’interno di un unico identificatore di inode e quindi al riferimento dell’inode. Una porzione della struttura dell’inode è mostrata di seguito insieme con un paio di altre strutture. Notiamo in particolare l’inode_operations e file_operations. Ognuna di queste strutture si riferisce una singola operazione che può essere eseguita sull’inode. Per esempio, inode_operatons definisce quelle operazioni che operano direttamente sull’inode e file_operations referisce quei metodi che sono relativi a file e directory (le standard system call). Gli inode e dentry più utilizzati di recente vengono mantenuti nell’inode cache e nella directory cache rispettivamente. Le strutture degli inode e dentry sono definite in …/linux/include/linux/fs.h.

figure5.jpg

Buffer cache
Eccetto che per la particolare implementazione del file system, in fondo al sistema a strati vi è il buffer cache. Questo tiene traccia delle richieste di scrittura e lettura da un singolo file system e dai dispositivi fisici. Per questioni di efficienza, Linux mantiene una cache di richieste per evitare di dovere accedere al dispositivo fisico ad ogni richiesta, invece, il buffer per le richieste usate più di recente (most-recently used buffer) vengono messe in questa cache e possono essere restituire velocemente al singolo file system.

File system interessanti
In quest’articolo non abbiamo speso tempo nell’esplorare le virtù di un file system particolare ma dobbiamo notare che Linux supporta un’ampia gamma di file system, dai vecchi file system come MINIX, MS-DOS e ext2 ai più recenti journaling file system come ext3, JFS e ReiserFS. In aggiunta, Linux supporta file system crittografati come CFS e file system virutali come /proc. Un’altro file system degno di nota è File System in Users Space, detto FUSE. Questo è un interessante progetto che consente di instradare le richieste al file system attraverso il VFS in user space.

Infine diciamo che l’implementazione di un file system, pur essendo semplice, è un buon esempio di architettura scalabile e estendibile. L’architettura del file system ha subito notevoli evoluzioni negli anni e ha, con successo, supportato molti tipi di file system e di dispositivi di memorizzazione molto differenti tra loro. Usare un’architettura basata su plug-in con molti livelli di indirezione funzionale la rende molto interessante agli occhi di un Architetto Software.

PUNTATE PRECEDENTI:
20 Novembre 2007: Il File System di Linux (1/2)

di Giuseppe Lo Brutto - TuxJournal.net

twittergoogle_pluslinkedinmail