ZFS - Zettabyte File System
Il filesystem del futuro
v. 1.0 - a cura di Cataldo Cigliola
Agenda
• Introduzione al filesystem
• Strutture RAID
• ZFS
• Esercitazioni
• Q&A
• Questionario di chiusura
image under creative commons license © arquera
Introduzione al Filesystem
Un file system è parte integrante di qualsiasi sistema operativo e si occupa della gestione e organizzazione dei dati sui supporti di memorizzazione.
Un file system realizza tipicamente due livelli di astrazione, che rendono le risorse di memorizzazione di massa facilmente utilizzabili dagli utenti.
Introduzione al Filesystem
Il primo livello di astrazione è quello che organizza i settori in un insieme di archivi (file) di dimensioni arbitrarie, che possono andare da zero all'intera dimensione disponibile del dispositivo. Ciascun file viene distribuito in un insieme di settori.
Il secondo livello di astrazione è quello che permette di organizzare i file dando loro dei nomi gerarchici.
Introduzione al Filesystem
Nel corso della storia informatica, è stata ideata una miriade di file system. I sistemi operativi moderni sono spesso in grado di accedere a diversi file system, semplicemente installando un apposito modulo o driver.
I tipi di file system possono essere classificati in file system per dischi, file system di rete e file system per compiti speciali.
Strutture RAID
Il RAID è un meccanismo di ridondanza e protezione dei dati che garantisce ( a seconda del modello prescelto ) una alta
disponibilità di spazio o una alta tolleranza ai guasti
Strutture RAID
La struttura RAID più semplice è il RAID-0 altrimenti nota come striping. Due o più dischi vengono uniti insieme in una struttura logica e le operazioni di I/O sono parallelizzate su
tutte le meccaniche in gioco.
Strutture RAID / RAID-0Vantaggi
Alta capacità ( più dischi ci sono, più spazio c’è ) Alte prestazioni ( più sono le meccaniche in gioco più velocemente i
dati verranno trasferiti)
Svantaggi
Nessun livello di protezione ( se salta un disco tutti i dati della struttura RAID sono compromessi )
Strutture RAID
Un’alternativa al RAID-0 è rappresentata dal RAID-1 altrimenti noto come Mirroring. In questa struttura i dati sono clonati su tutti i dischi facenti parte del RAID e la dimensione massima è pari alla dimensione del disco più
piccolo dell’insieme
Strutture RAID / RAID-1Vantaggi
Alta affidabilità ( se si rompe un disco la copia completa dei dati si trova anche sul suo mirror )
Svantaggi
Lo spazio è disottimizzato La velocità di scrittura è leggermente inferiore
Strutture RAID
Un compromesso fra affidabilità e capacità è rappresentato dal RAID-5. Nella struttura RAID-5, il cui numero minimo di dischi è 3, i blocchi di dati vengono scritti in stripe su tutti i
dischi e contemporaneamente a ogni scrittura viene generato un codice di parità ( scritto anch’esso sui dischi ) che tramite un meccanismo di decodifica inversa permette
di recuperare eventuali errori di lettura di un blocco.
Strutture RAID / RAID-5Vantaggi
Buona afidabilità ( se si rompe un disco i dati vengono recuperati tramite la parità ) Buona capacità ( solo 1/3 dello spazio va sprecato e non 1/2 come nel
mirroring )
Svantaggi
Il calcolo della parità richiede elevate risorse di calcolo La rottura di due dischi causa la perdita di tutti i dati In caso di interruzione dell’alimentazione durante la scrittura dei dati la
scrittura è inconsistente
ZFS
ZFS, rispetto agli altri filesystem presenti sul mercato, introduce una serie di concetti innovativi come il pool di dischi, il copy on
write, il self healing, un innovativo sistema di checksum dei dati, la snapshot e il clone, oltre che una nuova struttura RAID, il RAID-Z
RAID-Z
Il RAID-Z è una struttura raid molto simile al RAID-5 da cui non eredita però i difetti ( il write-hole ). Le scritture sono sempre
consistenti, anche in caso di interruzione repentina dell’alimentazione del disco
Strutture RAID / RAID-ZVantaggi
Buona affidabilità ( se si rompe un disco i dati vengono recuperati tramite la parità ) Buona capacità ( solo 1/3 dello spazio va sprecato e non 1/2 come
nel mirroring )
Svantaggi
Il calcolo della parità richiede elevate risorse di calcolo La rottura di due dischi causa la perdita di tutti i dati
Il Pool di dischi
Il concetto di pool di dischi è innovativo rispetto al volume. Gruppi di dischi possono essere raggruppati in pool con determinate
caratteristiche di protezione ( mirror, raid-z, stripe ) e su tali pool vengono poi creati uno o più filesystem logicamente indipendenti fra
di loro. Ogni filesystem può avere caratteristiche differenti
images credits http://www.opensolaris.org/os/community/zfs/docs/zfs_last.pdf
Copy on write
Quando un dato deve essere modificato, anziché sovrascrivere il blocco in cui risiede con il nuovo dato, questo viene copiato in un
nuovo blocco e qui modificato. Questa tecnica consente di preservare i dati nel caso di fault nella scrittura e permette inoltre l’implementazione di alcune features come la snapshot
images credits http://www.opensolaris.org/os/community/zfs/docs/zfs_last.pdf
Checksum
In un filesystem tradizionale il checksum dei dati viene scritto insieme ai dati stessi. Questo fa si che in caso di corruzione del dato anche il checksum si possa corrompere. ZFS scrive il checksum insieme ai
puntatori ai dati, questo permette di avere un livello di separazione ( e quindi di maggiore sicurezza ) e consente di verificare l’integrità del dato
anche in condizioni di danneggiamento del blocco che lo contiene.
images credits http://www.opensolaris.org/os/community/zfs/docs/zfs_last.pdf
Self Healing
In un mirror tradizionale la corruzione silente dei dati non è gestita. Grazie al checksum, invece ZFS è in grado di capire se il dato e corrotto e di conseguenza prendere il dato dall’altro ramo del mirror. ZFS inoltre effettua la auto riparazione del dato, prendendo il dato corretto dall’altro
ramo del mirror e sovrascrivendo quello corrottoimages credits http://www.opensolaris.org/os/community/zfs/docs/zfs_last.pdf
Snapshot
Il copy on write rende possibile la snapshot istantanea di un filesystem. Infatti è possibile definire il momento in cui si vuole effettuare una
fotografia dei dati ( magari per un backup successivo ) e il meccanismo di copy on write farà il resto. La snapshot è read-only
images credits http://www.opensolaris.org/os/community/zfs/docs/zfs_last.pdf
CloneIl clone è a tutti gli effetti una snapshot modificabile, infatti per creare un
clone è necessario prima creare una snapshot. Anche la creazione del clone sfrutta il copy on write ed è perciò istantanea, ma a differenza del clone i dati sono modificabili ( il blocco con le modifiche
viene scritto sul disco e il puntatore viene aggiornato di conseguenza ).
Sia per quanto riguarda la snapshot che per il clone la quantità di spazio necessaria è direttamente proporzionale alle modifiche effettuate all’originale
( nel caso della snapshot ) o al clone. Una snapshot o un clone appena creati occupano uno spazio pari a zero.
Altre caratteristiche• Interamente a 128bit
• Filesystem grandi fino a 16exabyte
• Massima dimensione del file = alla massima dimensione del filesystem
• Pool grandi fino a 256 quadrilioni di zettabyte
• Dimensione dei blocchi variabile
• Prefetch dei dati intelligente
• Design transazionale
images credits http://it.wikipedia.org/wiki/Zettabyte
Gestione dei pool
Il comando per la creazione di un pool di dischi è semplice
zpool create nome_pool disco disco ...
Per creare un pool di dischi in modalità stripe basterà lanciare il comando
zpool create tank c0d0 c0d1 c0d2
Gestione dei pool
Il pool viene visto come un normale mount point da Solaris, ma le informazioni del pool ( proprietà, mount point, ecc. ) non risiedono nel file /etc/vfstab, bensì in una private region di ogni disco facente
parte del pool.
In questo modo le informazioni sulla struttura di cui il disco è parte sono insieme con il disco stesso e in questo modo è possibile spostare dischi e pool da un sistema all’altro senza
perdere le informazioni sul pool
Gestione dei pool
Analogamente è possibile creare un pool con una protezione dei dati ( mirror o raidz ) specificando il tipo di protezione dopo il nome del pool
nel comando di creazione
zpool create tank mirror c0d0 c0d1
avendo cura di indicare un numero di dischi pari
Gestione dei pool
Esistono due tipi di RAID-Z: A singola parità ( raidz ) o a doppia parità ( raidz2 ). Per creare un pool di questo tipo basta indicare la modalità desiderata nella tipologia del pool
zpool create tank raidz c0d0 c0d1 c0d2
avendo cura di indicare un numero di dischi maggiore o uguale a 3
WARNING !!!
ZFS Non richiede conferma quando lanciate un comando, eventuali operazioni distruttive verranno
compiute senza alcun avvertimento.
Prima di lanciare qualsiasi comando ZFS è bene rileggere quanto scritto !
Gestione dei pool
Per verificare lo stato di un pool è possibile usare il comando
zpool status nome_pool
Gestione dei pool
zpool status tank
Gestione dei pool
E possibile aggiungere dischi a un pool già in uso con il comando
zpool add nome_pool disco disco ...
Attualmente non è possibile togliere dischi da un pool , a meno che non si tratti di un detach di un ramo del mirror con il comando
zpool detach nome_pool disco
Gestione dei pool
Il comando per la distruzione di un pool di dischi è
zpool destroy nome_pool
Esercitazioni
Esercizio n°1
• Creare un pool zfs in stripe di 3 dischi e verificare l’avvenuta creazione
• Creare un pool zfs in mirror e verificare l’avvenuta creazione
• Creare un pool zfs in raidz e verificare l’avvenuta creazione
Esercizio n°2
• Aggiungere un disco al pool striped
• Rimuovere un ramo del mirror dal pool mirrored
• Distruggere i pool creati in precedenza
Filesystem ZFS
Alla creazione di un pool, viene automaticamente creato un filesystem ZFS con nome , dimensione e mount point uguale a quello del pool.
Per verificare le caratteristiche di un filesystem è possibile usare il comando
zfs get all filesystem
Filesystem ZFS
zfs get all tank
Filesystem ZFS
Per modificare le caratteristiche di un filesystem ZFS si utilizza il comando
zfs set variabile=valore filesystem
Filesystem ZFS
zfs set mountpoint=/tank_new tank
Filesystem ZFS
All’interno di un pool è possibile creare nuovi filesystem ZFS utilizzando il comando
zfs create pool/filesystem
Filesystem ZFS
zfs create tank/tank_2
zfs set mountpoint=/tank_2 tank/tank_2
Filesystem ZFS
Di default, i filesystem all’interno di un pool condividono tutto lo spazio del pool ( tutti i filesystem ZFS hanno come dimensione massima la massima dimensione del pool ) a meno di non assegnare un limite
( quota ) o uno spazio riservato ( reservation )
zfs set quota=xx pool/filesystemzfs set reservation=xx pool/filesystem
Filesystem ZFS
zfs set quota=10G tank/tank_2
zfs set reservation=5G tank/tank_2
Filesystem ZFS
dd if=/dev/zero of=./file_virtuale bs=1024 count=6000000
Filesystem ZFS
Una delle caratteristiche importanti di ZFS è la possibilità di abilitare la compressione ( algoritmo lzjb ) dei dati on-the-fly su ogni filesystem
zfs set compression=on pool/filesystem
Filesystem ZFS
zfs set compression=on tank/tank_2
dd if=/dev/zero of=./file_virtuale bs=1024 count=6000000
Filesystem ZFS
Per montare e smontare un filesystem ZFS è possibile usare il comando
zfs mount pool/filesystemzfs umount pool/filesystem
Filesystem ZFS
Per eliminare un filesystem ZFS è sufficiente usare il comando
zfs destroy pool/filesystem
Esercitazioni
Esercizio n°3
• Creare un pool striped di due dischi
• Creare un pool mirrored
• Creare la seguente struttura di filesystem:/mionome/db (striped - min. 10Gb)/mionome/redo (mirrored - min. 2Gb, max 4Gb)/mionome/redo/archive (striped - compressed, min. 2Gb)
Esercizio n°4
• distruggere i filesystem creati in precedenza
• Creare la seguente struttura di filesystem:/mionome/ (striped - min. 10Gb)/mionome/archive (mirrored - min. 2Gb, max 4Gb)
• Smontare il filesystem /mionome
• Rimontare la struttura come prima
Esercizio n°5
• distruggere il filesystem /mionome
• distruggere i pool creati in precedenza
Gestione dei poolUn pool può essere esportato su un sistema diverso. L’unico pre-
requisito è che tutti i dischi facenti parte del pool siano visibili dall’host che deve importare il pool.
Per spostare un pool su un altro sistema è necessario prima esportarlo con il comando
zpool export nome_pool
Gestione dei pool
Per importare un pool esportato da un altro sistema basta usare il comando
zpool import [-R alt_root] nome_pool
Snapshot e Cloni
ZFS permette di creare una snapshot istantanea di un filesystem ( grazie al meccanismo del copy on write ) con il comando
zfs snapshot pool/filesystem@nome_snap
la snapshot viene posta in una directory nascosta ( .zfs ) all’interno del filesystem da cui dipende ed è una copia in sola lettura dei dati.
Snapshot e Cloni
E’ possibile ottenere un elenco delle snapshot disponibili con il comando
zfs list -t snapshot
Snapshot e Cloni
E’ possibile fare rollback di una snapshot ripristinando il filesystem originale allo stato in cui era quando è stata fatta la snapshot con il
comando
zfs rollback pool/filesystem@nome_snap
la snapshot viene automaticamente ripristinata nel filesystem originale
Snapshot e Cloni
E’ possibile ripristinare anche singoli files della snapshot. Basta cercare all’interno della directory nascosta
/path_to_dir/.zfs/snapshot/nome_snap
Snapshot e Cloni
Per avere una copia modificabile dei dati ( la snapshot è read-only ) è possibile clonare una snapshot con il comando
zfs clone pool/filesystem@snapshot pool/nuovofs
Snapshot e Cloni
ZFS permette di creare uno stream su standard output partendo da una snapshot rendendo così possibili le seguenti operazioni:
• Backup full su filesystem • Backup incrementale su filesystem ( modello Time Machine )• Replicazione remota dei dati
Snapshot e Cloni
• Backup full su filesystem
zfs send pool/fs@snap1 > /backup/snap1
Snapshot e Cloni
• Backup incrementale su filesystem ( modello Time Machine )
zfs send -i pool/fs@snap1 pool/fs@snap2 > /backup/snap_inc
Snapshot e Cloni
• Replicazione remota dei dati
zfs send -i tank/fs@11:31 tank/fs@11:32 | ssh remote_host zfs receive -d /tank/fs
Esercitazioni
Esercizio n°6
• creare un pool striped di due dischi
• creare 2 filesystem all’interno del pool
• popolare i filesystem con dati random
• creare una snapshot di entrambi i filesystem
• creare un clone di una delle due snapshot
Esercizio n°7
• creare un backup su disco dei dati della snapshot
• creare un nuovo pool striped di due dischi
• replicare i dati della snapshot sul nuovo pool
Esercizio n°8
• popolare i filesystem con altri dati random
• creare una nuova snapshot dei dati
• aggiornare incrementalmente la replica sul nuovo pool
Esercizio n°9
• popolare i filesystem con altri dati random
• eseguire un rollback della snapshot originale
• distruggere il clone creato in precedenza
• distruggere le snapshot
Esercizio n°10
• distruggere i filesystem creati in precedenza
• distruggere i pool creati in precedenza
Domande ?
Grazie !
Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribuzione 2.5 Italia. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by/2.5/it/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.