# XFS (file system)

XFS è un file system di tipo journaled con indirizzamento a 64 bit sviluppato da SGI per il sistema operativo IRIX.
XFS è stato incluso in linux 2.4 (dalla 2.4.25, quando Marcelo Tosatti l'ha ritenuto abbastanza stabile) e nella 2.6. FreeBSD ha il supporto in sola lettura dal dicembre 2005 e nel giugno 2006 è stato introdotto il supporto sperimentale alla scrittura (solo nella versione CURRENT).
XFS è un file system maturo e scalabile con un sistema di journaling che minimizza l'impatto di read/write massive: usa un'efficiente struttura a tabelle che permette una rapida ricerca e altrettanto rapida nuova allocazione di spazio.

## Capacità

XFS è un file system a 64 bit e supporta una dimensione massima del file system di 9 exabyte però è soggetto ai limiti imposti dal sistema operativo. Nei sistemi Linux a 32 bit il limite della dimensione dei file e del file system è di 16 terabyte

## Journaling

XFS fornisce il journaling dei metadati del file system, gli aggiornamenti del file system vengono scritti in un journal seriale prima che i blocchi del disco vengano aggiornati. Il journal è un buffer circolare di blocchi del disco che non è mai letto in un'operazione normale del file system. Il journal può essere memorizzato nell'area dati del file system (un log interno) oppure in un dispositivo separato per minimizzare la contesa dei dischi. Gli aggiornamenti del journal sono effettuati in modo asincrono per evitare perdite di prestazioni. Nel caso di crash del sistema, le operazioni effettuate immediatamente prima del crash possono essere effettuate nuovamente usando i dati nel journal, che permettono a XFS di garantire la consistenza. Il recupero viene effettuato automaticamente durante il montaggio, il tempo impiegato non dipende dalla dimensione del file system. Quando le modifiche recenti non vengono scritte su disco (flush) prima di un crash, XFS assicura che ogni blocco di dati non scritto viene azzerato al riavvio, ovviando ogni problema di sicurezza che derivi dai dati non scritti.

## Gruppi di allocazione

I file system XFS sono internamente partizionati in gruppi di allocazione, che sono regioni lineari del file system equamente dimensionate. File e directory possono essere distribuiti in più gruppi di allocazione. Ogni gruppo di allocazione gestisce separatamente i suoi inode e il suo spazio libero, provvedendo scalabilità e parallelismo, thread multipli e processi possono effettuare operazioni di I/O nello stesso filesystem simultaneamente. Questa architettura aiuta ad ottimizzare le performance del I/O parallelo nei sistemi SMP anche gli aggiornamenti dei metadati sono parallelizzabili. Il partizionamento interno provveduto dai gruppi di allocazione può essere utile quando il file system occupa più dispositivi fisici, permettendo l'uso ottimale della banda dei dispositivi fisici.

## Allocazione basata sugli extent

Lo spazio nei file memorizzati nei filesystem XFS è gestito in extent di dimensione variabile, diversamente dai blocchi di dimensione fissa usati da molti altri filesystem. Molti filesystem gestiscono l'allocazione dello spazio con una bitmap dei blocchi, invece in XFS l'allocazione dello spazio è gestita tramite 2 alberi B+tree per ogni gruppo di allocazione del filesystem. Uno dei B+tree è indicizzato per la dimensione degli extent liberi, invece l'altro è indicizzato per il blocco di partenza degli extent liberi. Questo doppio schema di indicizzazione permette ricerche altamente efficienti degli extent liberi appropriati per le operazioni del filesystem.

## Ridimensionamento in linea

XFS provvede l'utility xfs_growfs per effettuare il ridimensionamento del filesystem in linea. I filesystem XFS possono soltanto ingrandirsi e non restringersi, e l'ingrandimento del filesystem richiede che ci sia dello spazio non allocato nel dispositivo che contiene il filesystem. Questa funzionalità è tipicamente usata in congiunzione con il volume management, altrimenti la partizione che contiene il filesystem deve essere ingrandita separatamente.

## Utility native per il Backup/Ripristino

XFS provvede le utility xfsdump e xfsrestore in sussidio al backup dei dati contenuti in un filesystem XFS. L'utility xfsdump esegue il backup di un filesystem XFS, rispettando l'ordine degli inode. Diversamente dai tradizionali filesystem UNIX, che devono essere smontati prima di effettuare il dump per garantire la coerenza, XFS permette di eseguirlo a filesystem in uso. I dump e i ripristini di XFS sono riprendibili, e possono essere interrotti senza difficoltà. L'operazione multi-thread di xfsdump provvede operazioni di backup ad alte prestazioni, dividendo il dump in stream multipli, che possono essere inviati in differenti destinazioni. Le capacità multistream non sono state ancora portate completamente su Linux.

## Snapshots

XFS non fornisce un supporto diretto agli snapshots, Per eseguire uno snapshot di un filesystem XFS, è necessario usare l'utility xfs_freeze per congelare l'I/O verso il filesystem, il volume manager per compiere lo snapshot effettivo e poi scongelare l'I/O per riprendere le operazioni normali. Lo snapshot può essere poi montato in sola lettura per scopi di backup. Le release di XFS su IRIX incorporano un volume manager integrato di nome XLV. Questo volume manager non è stato portato su Linux. Nei kernel Linux recenti, la funzionalità xfs_freeze è stata implementata a livello di VFS ed è eseguita automaticamente quando viene chiamata la funzione snapshot del volume manager.

## Curiosità

Il server SGI Altix 3000, che frantumò il record del benchmark per l'High Performance Computing dei supercomputer nel 2003, utilizzava kernel Linux, processori Intel Itanium e XFS come file system.
Questo sistema di file viene tuttora utilizzato in diversi NAS casalinghi basati su linux come ad esempio Etrayz Xstream.