# Flash file system

Un flash file system è un tipo di file system progettato per il posizionamento e l'organizzazione di file su sistemi con memoria flash, si tratta infatti di file system ottimizzati per queste memorie al fine di evitare problemi relativi alle loro stesse caratteristiche peculiari (come ad esempio il fenomeno della write amplification) o per consentirne l'utilizzo in particolari sistemi operativi.

## Panoramica

Un dispositivo a blocchi è in grado di emulare un disco rigido utilizzando un file system generico su una memoria flash. Si tratta di una soluzione piuttosto inefficiente per le seguenti ragioni:
* Cancellazione dei blocchi: i blocchi della memoria flash devono essere esplicitamente cancellati prima che vi sia nuovamente consentita la scrittura. Il tempo necessario per cancellare i blocchi può essere significativo, per questo motivo conviene cancellare i blocchi inutilizzati mentre il dispositivo non è in uso.
* Accesso casuale: i file system generici sono ottimizzati per evitare operazioni di ricerca qualora possibile, a causa del loro alto costo su un disco rigido. Al contrario, una memoria flash non ha alcuna latenza causata da un'operazione di ricerca.
* Wear leveling: i dispositivi di memoria flash tendono a degradarsi quando un singolo blocco è ripetutamente sovrascritto; i file system di tipo flash, infatti, sono progettati per distribuire il più possibile le operazioni di scrittura. Gli LFS, o file system Log-structured, hanno le caratteristiche opportune per l'uso di un flash file system..
Proprio a causa delle sue particolari caratteristiche, la memoria flash necessita dell'utilizzo di un file system di tipo flash specificamente progettato o di un controller per il wear leveling e delle rilevazioni d'errore. Un flash file system, infatti, distribuisce le operazioni di scrittura su tutto il dispositivo e gestisce i lunghi tempi di cancellazione dei blocchi NAND. Ogni volta che la memoria deve essere aggiornata il file system non aggiornerà direttamente il blocco originale, ma scriverà una nuova copia dei dati modificati su di un blocco libero, modificando i puntatori per poi cancellare i dati dal vecchio blocco, rendendolo a questo punto nuovamente libero.
In pratica, i flash file system sono utilizzati solo per gli MTD, ovvero i Memory Technology Devices, che sono memorie flash integrate prive di un controller. I dispositivi rimovibili come le schede di memoria o i dispositivi di archiviazione USB sono dotati di un controller integrato per gestire gli MTD attraverso algoritmi dedicati, come quelli per il wear leveling, per il recupero dati da badblock, per garbage collection o per la correzione di errori.
La diffusione dei dispositivi con memoria flash aumenta grazie al corrispettivo aumento di dispositivi mobili, di un inferiore costo per bit e all'aumento della loro stessa capacità.

## Origini

Il primo file system di tipo flash, che gestiva un array come se fosse stato liberamente riscrivibile, era il TrueFFS sviluppato dalla M-Systems di Israele, presentato come un software al PC-Card Expo di Santa Clara, in California, nel Giugno del 1992 e registrato nel 1993.
Uno dei primi flash file system fu l'FFS2 della Microsoft per MS-DOS, rilasciato nell'autunno del 1992.. L'FFS2 era stato preceduto dall'"FFS", che fu però lontano dall'essere un vero flash file system, poiché gestiva gli array della memoria flash come un dispositivo write once read many (WORM) piuttosto che come un disco liberamente riscrivibile.
Nel 1994 il gruppo industriale Personal Computer Memory Card International Association (PCMCIA), approvò la specifica del Flash Translation Layer (FTL), basata sull'architettura del TrueFFS della M-Systems. La specifica fu sviluppata e proposta dalla M-Systems e dalla SCM Microsystems, che si occupò anche di fornire le prime implementazioni funzionanti dell'FTL. Supportato dalla Intel, l'FTL divenne un'architettura popolare anche in altri dispositivi.

## Flash Translation Layer

Il flash translation layer o FTL, che letteralmente significa livello di traduzione di tipo flash, è un software particolarmente complesso che ha lo scopo di tradurre un indirizzo logico usato dal sistema in un indirizzo fisico nella memoria flash. Nel dettaglio si occupa di fornire un'astrazione I/O di un generico dispositivo a blocchi, in modo da consentire la sostituzione di un qualsiasi disco rigido con un disco a stato solido senza che il software debba occuparsi di gestirne le differenze.
L'implementazione di questi compiti di organizzazione e gestione richiede un quantitativo di risorse significative nel controller della memoria flash. In particolare compiti come la rimappatura degli indirizzi fisici e le operazioni di garbage collection richiedono grandi quantitativi di DRAM e un processore particolarmente potente. L'FTL stabilisce importanti decisioni che hanno effetti sulle performance di archiviazione e sulla durata dei dispositivi utilizzati, senza che nessuna applicazione di alto livello debba occuparsene, rischiando un conseguente decadimento delle prestazioni di sistema.
Il flash translation layer funziona quindi come una scatola nera, le sue funzionalità interne sono nascoste dietro un livello di I/O, questo fa sì che il comportamento della memoria flash sia imprevedibile per le applicazioni di alto livello.
Un altro serio svantaggio dell'FTL è la dupicazione delle funzionalità tra quest'ultimo e il sistema. Molte applicazioni di sistema sono in grado di gestire i dispositivi di archiviazione di cui fanno uso per evitare un eccessivo numero di operazioni di aggiornamento sul posto per ragioni come una migliore efficienza, una corretta enumerazione delle versioni e una maggiore consistenza dei dati. I file system log-structured o copy-on-write, come quelli di tipo flash, scrivono continuamente nuovi dati sul dispositivo senza permettere operazioni di aggiornamento sul posto.

### TrueFFS

Nonostante il nome, TrueFFS non è un file system, si tratta infatti di un software che si occupa di fornire un'interfaccia per il disco ed è perciò più corretto definirlo come un FTL. TrueFFS è progettato per essere eseguito direttamente su dischi allo stato solido (si noti che la maggior parte degli SSD in commercio non forniscono possibilità di interazione diretta). TrueFFS fornisce correzione di errori, rimappatura dei badblock e wear leveling. Esternamente TrueFFS si presenta come una normale interfaccia di un disco rigido.
TrueFFS è stato creato dalla M-Systems, per poi essere acquistato dalla Sandisk nel 2006. Un derivato di TrueFFS, chiamato TFFS o TFFS-lite, si trova nel sistema operativo VxWorks, dove svolge la funzione di flash translation layer e non di un file system completo.

### ExtremeFFS

ExtremeFFS è una tecnologia rilasciata da SanDisk che vanta un miglioramento delle prestazioni di scrittura causale rispetto a TrueFFS. Sandisk sostiene che la suddetta tecnologia le permetta un miglioramento, nella velocità scrittura casuale sugli SSD, di cento volte superiore. Nel 2008 la compagnia ha promosso l'utilizzo della tecnologia ExtremeFFS in una implementazione MLC, o multi-level cell, della memoria flash di tipo NAND

### Application Managed Flash

L'Application Managed Flash (o AMF) è una tipologia di FTL che mira a spostare la gestione della memoria flash dal dispositivo alle applicazioni, quali file system. database e applicazioni dell'utente, lasciando così solo la gestione essenziale sul lato del dispositivo.
Nell'AMF la responsabilità del dispositivo è ridotta notevolmente per fornire accessi al dispositivo di archiviazione privi di errore ed un efficiente supporto al calcolo parallelo. Il dispositivo tiene autonomamente traccia dei badblocks e fa uso del wear-leveling, questo perché è sempre preferibile compiere queste operazioni ad un basso livello perché direttamente dipendenti dalle specifiche architetture dei circuiti utilizzati che, comprensibilmente, le aziende produttrici sono riluttanti nel divulgare.

## Flash file system per Linux
### JFFS, JFFS2 e YAFFS

Il Journaling Flash File System è stato il primo file system specifico per dispositivi flash per Linux, ma è stato rapidamente sostituito dal JFFS2, originariamente sviluppato per memorie flash di tipo NOR. Dopo che YAFFS venne rilasciato specificamente per memorie flash di tipo NAND nel 2002, anche il JFFS2 venne aggiornato per supportarle.

### UBIFS

Unsorted Block Image File System è un successore di JIFFS2 ed è stato usato da Linux 2.6.22 nel 2008. UBIFS è stato attivamente sviluppato dal suo rilascio iniziale UBIFS ha una documentazione all'indirizzo infradead.org insieme ai driver JFFS2 a MTD. Alcuni confronti iniziali mostrano che UBIFS compia operazioni di compressione più velocemente di F2FS.

### LogFS

Log-structured File System è un altro flash file system specifico per Linux, attualmente in fase di sviluppo con lo scopo di risolvere i problemi di scalabilità del JFFS2.

### F2FS

Flash-Friendly File System è stato aggiunto alla versione di Linux kernel 3.8. Piuttosto di essere sviluppato per comunicare direttamente con dispositivi flash, F2FS è stato progettato per essere usato su dispositivi di tipo flash che già possiedono un FTL, come le schede SD.