# MagmaFS

MagmaFS è un network file system basato su una Distributed hash table, scritto in C, compatibile con i kernel Linux e BSD mediante l'uso di FUSE.

## Terminologia e principi generali

Magma unisce molti nodi interconnessi da una rete TCP/IP per formare uno spazio comune di salvataggio dati chiamato lava ring. Ogni nodo è chiamato vulcano. Ogni vulcano ospita una porzione di uno spazio delle chiavi comune, delimitata da due chiavi SHA1. Ogni vulcano è anche incaricato di replicare lo spazio di chiavi del nodo precedente, per garantire ridondanza dei dati. Ogni chiave può rappresentare uno o più oggetti all'interno dello spazio di salvataggio. Questi oggetti sono chiamati flare.
Magma può salvare differenti tipi di oggetti: file, directory, collegamenti simbolici, block e characted device, FIFO pipes. Ogni oggetto è legato ad un flare e viceversa. Un flare di qualsiasi tipo fra i sei precedentemente citati è descritto da alcune proprietà elementari comuni a tutti i flare, come il percorso e la chiave hash associata. Ma ciascuno dei sei tipi ha anche le sue specifiche proprietà. Per esempio, un flare di tipo directory è caratterizzato da alcune informazioni specifiche che non riguardano i collegamenti simbolici. Un flare contenente solo informazioni generiche è definito uncasted, mentre un flare completo è chiamato casted.
Un flare allo stato uncasted non contiene sufficienti informazioni per operare su dati, ma ha abbastanza informazioni per essere mosso come una sorta di contenitore opaco da un vulcano ad un altro. Per essere facilmente movibile, ogni tipo di flare, directory incluse, è stato reimplementato come un insieme (set) di due file, il primo dei quali contiene informazioni relative al flare (metadata) mentre il secondo contiene i contenuti del flare. Spostare flare attraverso il lava ring viene definito load balancing (bilanciamento del carico) ed è eseguito per livellare eventuali diseguaglianze di carico fra i nodi nel tentativo di fornire le migliori prestazioni.

## Il flare system

Il cuore di Magma è noto come flare system ed è implementato come una pila a livelli (layer stack).
| | Livelli del flare system |
| 1. | API pubblica: flare_system_init, magma_open, magma_mknod, magma_lstat, ... |
| 2. | Lava network: magma_new_node, route_key, join_network |
| 3. | Flare objects: magma_new_flare, magma_search_or_create, magma_add_to_cache, ... |
magma_mkdir può essere usata come esempio di attraversamento dei livelli. In questo paragrafo si supporrà che si voglia creare una directory chiamata /esempio. magma_mkdir è parte del livello API Pubblica layer. È usata per creare una nuova directory, come nel caso della corrispondente controparte mkdir fornita dalla Libc.
magma_mkdir prima instrada la richiesta per decidere se può essere gestita localmente o se richiederà operazioni sulla rete. Per eseguire l'instradamento, il percorso /esempio è tradotto nella chiave SHA1 corrispondente 22e45a818d673138296223d4d3aaa7d918f38726. Se l'instradamento evidenzia la necessità di contattare un altro nodo vulcano, la richiesta non lascerà questo livello. Il livello lava network inoltrerà la richiesta al nodo che è responsabile della chiave, continuando il flusso delle operazioni sul nodo remoto. L'instradamento è solo metà dei compiti del livello Lava network, che prevede anche il monitoraggio della rete nonché la creazione, l'aggiornamento e la rimozione dei nodi vulcano.
Sia che si tratti di una richiesta locale o remota, l'ultimo passaggio è eseguito dal livello Flare. Il flare corrispondente alla chiave 22e45a818d673138296223d4d3aaa7d918f38726 sarà ricercato all'interno della cache. Nel caso in cui non venga trovato, sarà creato e caricato dalla copia su disco, se già esistente. Sull'oggetto flare risultante saranno prima di tutto applicati i test sui permessi (permission checking). Se viene accordato il permesso di operare, la richiesta originaria è soddisfatta: in questo esempio, il flare viene specializzato (casted) per rappresentare una directory (se ancora non lo era) e viene salvato su disco.

### Instradamento (routing)

Dal momento che ogni nodo vulcano ha a disposizione la completa topologia della rete, l'instradamento si riduce al confronto della chiave del flare con lo spazio di chiavi di ciascun nodo per trovare il nodo che è responsabile del flare. La topologia della rete è anche salvata nella directory distribuita /.dht/ dentro lo stesso filesystem magma. I nodi vulcano possono periodicamente verificare le loro informazioni con i contenuti della directory /.dht/ per sapere se qualcosa è cambiato. I nodi sono anche tenuti a salvare periodicamente le loro informazioni dentro la stessa directory /.dht/.

### Bilanciamento del carico (load balancing)

Ogni nodo vulcano ha alcuni parametri dichiarati all'avvio, come ampiezza di banda e spazio su disco disponibili. Un thread separato, chiamato balancer, è dedicato alla distribuzione dello spazio di chiavi per evitare il sovraccarico dei nodi e viceversa. Ogni nodo ha un valore di carico dinamico associato, che è ottenuto dalla formula:
    $l_{n}=kl_{n}\cdot {\frac {b_{n}}{b_{a}}}\cdot {\frac {s_{n}}{s_{a}}}$
dove $kl_{n}$ è il carico del nodo calcolato su scala logaritmica; $b_{n}$ è la banda del nodo e $b_{a}$ è la banda media; $s_{n}$ è lo spazio disco del nodo e $s_{a}$ lo spazio disco medio

## Distribuzione del software Magma

La distribuzione di Magma include un server chiamato magmad e un client chiamato mount.magma.

### Il server Magma

Il server Magma magmad gestisce l'intercomunicazione fra i nodi della DHT e i client magma. Il flare system fornisce un ciclo per gli eventi di rete che accetta le connessioni entranti. Tre tipi di connessioni sono accettati:
* La connessione su protocollo flare è usata per operare sui flare: aprire file e directory, leggere e scrivere, ottenere informazioni e scambiare i flare durante le operazioni di bilanciamento del carico. Il protocollo flare è un protocollo binario.
* La connessione su protocollo internode è usata per scambiare informazioni sulla DHT e per agganciare nuovi nodi. Il protocollo internode è un protocollo binario.
* La connessions su protocollo console è utilizzata dagli amministratori per interrogare il network lava, eseguire semplici operazioni come elencare i contenuti di una directory e visionare i contenuti di un file e infine impartire alcuni comandi di amministrazione ai nodi. Un esempio di comando di amministrazione è: shutdown (spegnimento del nodo). Il protocollo console è un protocollo testuale accessibile via Telnet.

### Il client Magma

Il client Magma magma.mount è basato su FUSE ed è pertanto compatibile con i kernel Linux e BSD. Il client Magma usa una connessione su protocollo flare per contattare e operare con un server Magma a lui prossimo. La topologia della rete e l'ubicazione dei flare è completamente trasparente per i client. Il client semplicemente interroga un server esattamente come se tutte le informazioni fossero ubicate su quel server soltanto.
Un livello crittografico è previsto fra gli sviluppi futuri, in modo da consentire la cifratura dei soli contenuti dei file. La scelta di implementare un supporto crittografico su lato client è dovuta a motivazioni di scalabilità (il tempo di computazione cresce allo stesso ritmo della richiesta computazionale) e di riservatezza delle chiavi crittografiche (le chiavi o le passphrare non saranno mai disponibili al server).

### Interfaccia NFS alternativa

Come alternativa al client Magma, che è supportato solo su kernel Linux e BSD, il server Magma offrità una interfaccia NFS per gli altri sistemi UNIX. Dal momento che NFS è uno standard stabile, non possono essere aggiunte nuove funzionalità. Per esempio, il supporto crittografico sopra citato non sarà disponibile per i client che accederanno uno share Magma attraverso NFS.