Sei sulla pagina 1di 70

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-0
Vantaggi

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-1
Vantaggi

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-5
Vantaggi

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-Z
Vantaggi

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 corrotto
images 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
Clone
Il 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/filesystem


zfs 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/filesystem


zfs 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 pool
Un 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

zfs send pool/fs@snap1 > /backup/snap1

• Backup full su filesystem


Snapshot e Cloni

zfs send -i pool/fs@snap1 pool/fs@snap2 > /backup/


snap_inc

• Backup incrementale su filesystem ( modello Time Machine )


Snapshot e Cloni

zfs send -i tank/fs@11:31 tank/fs@11:32 |


ssh remote_host zfs receive -d /tank/fs

• Replicazione remota dei dati


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.

Potrebbero piacerti anche