# Btrfs

Btrfs (B-tree FS, "Butter FS" o "Better FS") è un file system per Linux di tipo copy-on-write dotato di checksumming, annunciato da Oracle Corporation nel 2007 e pubblicato sotto la GNU General Public License (GPL).
Nato inizialmente come risposta al filesystem ZFS, è il filesystem scelto da MeeGo, il sistema operativo open source sviluppato da Intel e Nokia per smartphone, netbook e navigatori satellitari. Esso è disponibile in diverse distribuzioni Linux, come Arch Linux dal gennaio 2012, Debian dalla versione 6, Fedora dalla versione 16, Gentoo Linux dal mese di luglio 2010, OpenSUSE a partire dalla versione 12.1, e Ubuntu dalla versione 10.04. La prima distribuzione enterprise di linux che abbia adottato btrfs è SUSE 11 SP2, resa disponibile al grande pubblico il 2 marzo 2012.
Chris Mason, direttore del comparto Linux Kernel Engineering di Oracle e autore di btrfs, ha affermato: «Lo scopo principale è di permettere a Linux di scalare sulle ingenti risorse di storage che saranno disponibili in futuro. Scalare bene non si limita alle sole funzionalità di completo indirizzamento ma significa anche avere un'interfaccia pulita per l'amministrazione e una gestione che sia affidabile e che permetta agli utenti di comprendere chiaramente ogni passaggio.»
La prima comparsa di Btrfs nel kernel Linux risale alla prerelease 2.6.29-rc1 del kernel Linux, mentre la prima versione definita stabile è stata pubblicata nella versione 3.10. Lo sviluppo del filesystem procede tuttora.

## Struttura

Il filesystem Btrfs è di tipo COW (copy-on-write), il che permette di creare snapshot e cloni. Tutti i dati e i metadati sono validati tramite CRC. Btrfs è composto da un insieme di B-Tree con una radice comune; vengono utilizzati extent di dimensione variabile. Ciò permette di ridurre notevolmente la frammentazione in scrittura. I metadati sono contenuti all'interno di B-Tree che possegono tre tipi di strutture:
* Il Block header: è un header presente al principio di ogni blocco.
* La Key: è una struttura che permette di puntare ad un oggetto; possiede un Object ID da 64 bit, un Type da 8 bit che serve a determinare il tipo di struttura associato ad un determinato blocco e un Offset da 64 bit.
* L'item: è una struttura che contiene una key più un campo offset da 32 bit e un campo size da 32 bit.
I blocchi intermedi dell'albero sono formati da coppie di key e block-pointer, mentre le foglie, invece, dalla coppia item/data. All'inizio del blocco relativo ad una foglia, dopo il Block header, si trova l'array item; al fondo del blocco l'array dei data, ordinato in modo inverso rispetto al primo, quindi entrambi gli array crescono verso il centro. Ogni singolo B-tree è un oggetto a sé stante, quindi ogni volta che sarà necessario creare o copiare un file, si istanzierà un nuovo object-id appartenente a una key associata al nodo radice di un B-tree.
Vi è un superblocco posto in una posizione non variabile del filesystem che punta a una "tree of tree roots" (letteralmente albero di radici di alberi). Questo B-tree, dunque, tiene traccia degli starting point, quindi dei blocchi radice di ogni altro B-Tree presente. I B-tree sono così divisi tra loro:
* Extent-allocation tree: si tratta di un albero che traccia ogni extent allocato nel volume ed ha quindi la funzione di gestire lo spazio libero.
* Cheecksum-tree: è un B-tree nel quale si trova un valore di checksum per ogni extent allocato all'interno del volume.
* Chunk and device tree: è un livello di astrazione tra il filesystem e i dischi, quindi cambia a seconda del sistema RAID scelto, presentando una mappa dei blocchi reali e della loro struttura logica.
* Sub-volume: Un subvolume è un filesystem su cui si possono operare azioni di cloning e snapshot. L'insieme di questi B-tree compone tutti i file e le directory visibili.
* Reloc Tree: è un B-tree funzionale alla reallocazione degli extent, è usato quindi nella routine di frammentazione del filesystem.