ZFS è un progetto della Sun Microsystems come parte del sistema operativo Solaris. È un file system avanzato open-source con capacità di gestione dei volumi, che consente agli utenti di raggruppare lo storage fisico in pool unificati dotati di funzionalità avanzate come la ridondanza, la riparazione automatica dei dati, la deduplicazione, la compressione e molte altre.

Panoramica approfondita

zpools

A un livello più alto, ZFS funziona organizzando lo storage in zpools, ciascun zpool è composto da diversi vdevs raggruppati insieme, che a loro volta sono costituiti aggregando diversi dispositivi fisici insieme. Mentre i vdev forniscono la ridondanza dei dati e la tolleranza ai guasti, lo zpool fornisce lo spazio di archiviazione vero e proprio. Questo spazio di archiviazione può consistere in:

  • datasets: un insieme di file e directory montati all’interno dello zpool stesso
  • zvolumes (o zvols): block devices virtuali che si comportano come normale storage fisico

Sia i dataset che i zvols sono governati da una serie di attributi. Questi attributi abilitano funzionalità come la crittografia dei dati, la compressione, la deduplicazione e le quote di utilizzo. Inoltre, è possibile fare regolari snapshot dello zpool. Questi snapshot possono poi essere navigati o persino riportati indietro per ripristinare uno stato precedente del pool.

vdevs e RAID-Z

Ogni zpool è composto da stripe di uno o più vdevs. ZFS offre diverse opzioni per creare vdevs, ognuna con diversi livelli di ridondanza. Le due opzioni più semplici per creare un vdev sono:

  • stripe: i dati vengono suddivisi su ogni disco del vdev. Molto veloce ma non fornisce alcuna protezione contro i guasti hardware.
  • mirror: una copia dei dati viene scritta su ogni disco del vdev. Sicuro contro i guasti hardware ma fornisce solo la capacità di un singolo disco.

ZFS fornisce anche topologie simili al RAID, chiamate RAID-Z, per configurare i vdev. Queste sono:

  • RAID-Z1: viene utilizzata parità singola e distribuita nel vdev consentendo la perdita di un solo disco fisico. La capacità totale equivale alla somma della capacità di tutti i dischi meno la capacità di un disco. Simile al RAID-5 standard.
  • RAID-Z2: uguale a RAID-Z1 ma con doppia parità. La capacità totale equivale alla somma della capacità di tutti i dischi meno la capacità di due dischi. Può perdere fino a due dischi. Simile al RAID-6 standard.
  • RAID-Z3: uguale a RAID-Z1 ma con tripla parità. La capacità totale equivale alla somma della capacità di tutti i dischi meno la capacità di tre dischi. Può perdere fino a tre dischi.

Configurazione

Requisiti hardware

Quando si tratta di acquistare o costruire un sistema per l’uso con ZFS, è importante ricordare che:

  • ZFS ha bisogno di accesso diretto ai dischi fisici presenti nel sistema. Ciò rende le schede RAID inadatte all’uso con ZFS. Assicurati inoltre che il controller disco operi in modalità JBOD (a tal proposito, alcuni controller potrebbero necessitare di essere riprogrammati con un firmware specifico per lavorare in modalità JBOD)
  • Cerca di evitare i moltiplicatori di porte SATA o i controller SATA del chipset, poiché tendono ad introdurre dei bottlenecks. Le HBA SATA/SAS sono ideali per l’utilizzo con ZFS.
  • Se stai utilizzando dischi rigidi meccanici per il tuo zpool, controlla se i tuoi dischi utilizzano il Conventional o il Shingled Magnetic Recording. I dischi SMR sono più lenti e possono introdurre bottlenecks. Utilizza sempre dischi CMR con ZFS.
  • Se stai utilizzando dischi a stato solido, assicurati che i tuoi dischi abbiano una cache DRAM. I dischi privi di DRAM sono più lenti al punto che possono persino smettere di rispondere durante operazioni intense. Inoltre, se non hai un UPS, considera l’utilizzo di SSD protetti da perdite di corrente.

Installazione

L’implementazione di ZFS più comunemente utilizzata è OpenZFS, disponibile sia per sistemi Linux che FreeBSD. A causa di incompatibilità nelle licenze software, Linux non ha il supporto nativo per ZFS (FreeBSD lo ha), il che significa che gli utenti Linux devono installare manualmente ZFS. Su Linux, ZFS viene distribuito sia come modulo DKMS che come kABI-tracking kmod (per le distribuzioni basate su RHEL). Per questo motivo è importante scegliere una distribuzione con un kernel stabile (come Debian, ad esempio), poiché ZFS può rompersi con gli aggiornamenti del kernel.

Utilizzo di base

Creazione di uno zpool

Per creare e gestire un zpool, è sufficiente utilizzare gli strumenti zfs e zpool. Il comando zpool create viene utilizzato per creare un nuovo zpool, con un nuovo dataset dello stesso nome creato automaticamente nella root dello zpool (lo zpool dovrebbe essere montato automaticamente all’interno della root del sistema). Ecco alcuni esempi:

  • zpool create zfs_test /dev/sda: crea uno zpool composto da un singolo vdev contenente un singolo dispositivo fisico.
  • zpool create zfs_test mirror /dev/sda /dev/sdb: crea uno zpool composto da un singolo vdev contenente due dispositivi fisici in mirror.
  • zpool create zfs_test raidz /dev/sda /dev/sdb /dev/sdc: crea uno zpool composto da un singolo vdev contenente tre dispositivi fisici in RAID-Z1.

Puoi utilizzare il comando zpool list per controllare l’elenco dei zpool attualmente conosciuti e alcune statistiche sull’utilizzo. Il comando zpool status fornisce informazioni in tempo reale sullo stato dei zpool e la salute dei vdev. Se dovessi incontrare un guasto hardware, con l’opportuno livello di ridondanza, il pool continuerà a funzionare in uno stato degradato. Una volta sostituiti i dischi difettosi, ZFS inizierà automaticamente a ripristinare il pool alle sue condizioni originali. Questo processo è chiamato resilvering.

Creazione di dataset e zvol

Puoi creare sia dataset che zvol utilizzando il comando zfs create. Ecco un paio di esempi:

  • zfs create zfs_test/mydata: crea il dataset mydata all’interno del zpool zfs_test
  • zfs create -V 5gb zfs_test/vol: crea il zvol vol all’interno del zpool zfs_test

Per distruggere un dataset/zvol, puoi utilizzare il comando zfs destroy.

⚠️ Nessuna richiesta di conferma appare con il sottocomando destroy. Utilizzalo con estrema cautela.

Snapshot e scrubbing

Il comando zfs snapshot prende uno snapshot del zpool nel suo stato attuale. Gli snapshot sono elencati nel formato zpool-path@snapshot-name. Per fare uno snapshot, esegui:

  • zfs snapshot zfs_test/mydata@snap: prende lo snapshot snap del dataset mydata

Per elencare tutti gli snapshot presenti nei tuoi zpool, esegui zfs list -t snapshot.

Un’altra operazione comune di ZFS è lo scrubbing, che consiste nel verificare l’integrità dei dati sui pool ed eventualmente ricostruire i dati corrotti. Per eseguire manualmente uno scrub su un pool, esegui zpool scrub <nome-pool>.

⚠️ Questo potrebbe richiedere del tempo ed è abbastanza intensivo in termini di I/O. Pianifica i tuoi scrub saggiamente.

Conclusione

Questa è solo una panoramica di base delle caratteristiche e delle funzionalità di ZFS. Consulta la documentazione ufficiale per ulteriori informazioni su ZFS, ed assicurati di avere una buona comprensione di ZFS prima di versarci dati importanti. Happy hacking ✌️