La società Cisco ha proposto un nuovo file system PuzzleFS, realizzato come un modulo per il kernel Linux, scritto in Rust. Il file system è progettato per l'uso in contenitori isolati e continua lo sviluppo delle idee presentate nel file system Atomfs. L'implementazione è attualmente in fase di prototipo, supporta la compilazione con il branch del kernel Linux rust-next ed è aperta sotto le licenze Apache 2.0 e MIT.
Il progetto è mirato a superare le limitazioni che sorgono nell'uso di immagini di contenitori nel formato OCI (Open Container Initiative). PuzzleFS affronta sfide come l'archiviazione efficiente dei dati duplicati, la possibilità di montaggio diretto, la ricostruzione ripetuta delle immagini e un funzionamento sicuro della memoria.
Per la deduplicazione dei dati ripetitivi in diversi contenitori viene utilizzato l'algoritmo FastCDC (Fast Content-Defined Chunking), che funziona suddividendo i dati in frammenti di dimensioni arbitrarie e mantenendo un indice con gli hash dei frammenti elaborati. I frammenti ripetitivi vengono memorizzati una sola volta e indicizzati congiuntamente per tutti i livelli del file system, ovvero la deduplicazione può coprire diversi punti di montaggio (un nuovo livello del file system può essere avviato sulla base di uno esistente e utilizzare i frammenti di dati già presenti per la deduplicazione).
La ricostruzione ripetuta delle immagini dei contenitori viene raggiunta attraverso la definizione di una rappresentazione canonica del formato delle immagini dei contenitori. Il montaggio diretto (direct-mount) consente di montare un'immagine di un contenitore nel formato OCI da un'archiviazione condivisa globale senza prelevare, utilizzando come identificatore l'hash del contenuto dal manifesto del contenitore. Per la verifica dell'integrità dei dati in presenza di un'archiviazione condivisa può essere utilizzato il meccanismo fs-verity, che controlla la corrispondenza tra gli hash specificati nell'indice binario e il contenuto effettivo durante l'accesso ai file.
Il linguaggio Rust è stato scelto per la sua alta performance del codice risultante, unita alle possibilità di una gestione sicura della memoria, il che consente di ridurre il rischio di vulnerabilità causate da problemi come l'accesso alla memoria dopo che è stata liberata e il superamento dei confini del buffer. L'uso di Rust per il modulo del kernel ha anche facilitato la condivisione del codice tra il kernel e i componenti che operano nello spazio utente, per creare un'unica implementazione protetta.
Tra gli altri obiettivi del progetto: costruzione e montaggio di immagini molto veloci, la possibilità di utilizzare una fase intermedia facoltativa per la conversione (canonicalizzazione) delle immagini, la non obbligatorietà di passaggi completi attraverso l'albero FS in stile mtree quando si utilizza una struttura multilayer, sovrapposizione delle modifiche in stile casync e un'architettura di semplice implementazione.
Fonte: opennet.ru
