È stato pubblicato il rilascio del progetto LittleFS 2.10, che sviluppa un file system compatto per dispositivi embedded e microcontrollori. Inizialmente, il file system è stato creato da ARM per il sistema operativo Mbed OS, ma poi è stato separato in un progetto autonomo. Il codice del file system è scritto in C e distribuito con licenza BSD. L'implementazione di riferimento di LittleFS viene fornita come libreria C, sulla quale è stato creato un modulo FUSE e wrapper per vari linguaggi di programmazione.
Caratteristiche di LittleFS:
- Basse esigenze di risorse e supporto per il funzionamento in condizioni di spazio di RAM limitato. Nell'implementazione di LittleFS vengono utilizzati solo buffer staticamente definiti (senza allocazione di memoria dinamica) e non vengono utilizzate chiamate ricorsive, il che consente di mantenere sempre costante la quantità di memoria operativa e le strutture dati di LittleFS sul dispositivo di archiviazione, indipendentemente da ciò che viene scritto nel file system e dalla dimensione della memoria.
- Strumenti per l'equalizzazione dell'usura delle unità Flash (wear leveling), progettati per minimizzare il riutilizzo dei blocchi e distribuire uniformemente le operazioni di cancellazione sui blocchi nella memoria Flash, il cui controller non fornisce una soluzione a questo problema.
- Estrema resilienza ai guasti - il file system considera l'interruzione casuale (sospensione tramite spegnimento) come una situazione normale e garantisce che i dati siano sempre integri e presenti su disco. Per evitare la compromissione dell'integrità e la perdita di dati, viene utilizzato un meccanismo copy-on-write (COW), in cui le modifiche non sovrascrivono le informazioni, ma vengono salvate in un nuovo luogo.
- Atomicità delle operazioni, come eliminazione e rinominazione, anche in caso di perdita di alimentazione durante la loro esecuzione. Le modifiche ai file vengono scritte su disco solo al termine della chiamata a sync o close. Le incoerenze causate da operazioni che non possono essere eseguite in modo atomico vengono gestite da un apposito gestore deorphan, che analizza l'intero albero del file system dopo il caricamento.
- Supporto per le funzioni simili a POSIX per la gestione di file e directory.
Il contenuto dei file in LittleFS è rappresentato da liste COW (Copy-On-Write) CTZ, garantendo una complessità O(1) per l'aggiunta e O(nlogn) per la lettura. L'allocazione dei blocchi avviene mediante la scansione del file system per i blocchi utilizzati in un'area di dimensione fissa, memorizzata come un vettore di bit. Per semplificare la scansione, tutte le directory fanno parte di una lista collegata che copre l'intero file system. Se si verifica un errore durante la scrittura di un blocco, viene allocato un nuovo blocco e i dati vengono trasferiti in questo.
Tra le modifiche nella nuova versione di LittleFS:
- È stato riprogettato il codice di parsing dei percorsi dei file, il che ha avvicinato il comportamento del file system a quello dei sistemi POSIX e alle aspettative degli utenti in situazioni come la conclusione del percorso con una barra obliqua, la gestione di percorsi vuoti e la navigazione oltre la radice del file system.
- Sono stati aggiunti due nuovi esempi di dispositivi a blocchi ramcrc32bd e ramrsbd, in cui è implementato un meccanismo di correzione degli errori compatibile con LittleFS. Nel suo stato attuale, il file system LittleFS non supporta la rilevazione e la correzione degli errori, e queste operazioni sono portate a livello dei dispositivi a blocchi.
- La funzione lfs_mkdir ora supporta slash finali, cioè la chiamata lfs_mkdir("a/") non genera più un errore.
- Nelle funzioni lfs_stat e lfs_getattr ora viene restituito un errore quando si utilizzano slash finali, se il percorso esistente nel file system non è una directory.
- Il tentativo di aprire un file tramite la funzione lfs_file_open con uno slash finale nel nome genera ora un errore LFS_ERR_NOTDIR, se il file non è una directory nel file system, LFS_ERR_ISDIR, se il nome fa riferimento a una directory nel file system, e LFS_O_CREAT, se il file non esiste.
- Il tentativo di accedere oltre la radice del file system, ad esempio lfs_stat("/.../a"), ora genera un errore.
- Specificare un percorso vuoto non è più sinonimo di accesso alla directory radice, quindi la chiamata lfs_stat("") genererà un errore.
Fonte: opennet.ru
