BREVE GUIDA ALL’USO DEL FILESYSTEM ZFS

 

NOTA: la guida è basata su Ubuntu Linux, in alcuni esempi viene usato un nome di pool 'mypool’ che va sostituito con uno proprio. La guida serve solo per prendere confidenza con questo potente filesystem.

ZFS (acronimo di Zettabyte File System) è un file system sviluppato da Sun Microsystems per Solaris (2004). È caratterizzato da architetture RAID supportate, funzionalità di correzione degli errori, checksum automatico, istantanee del sistema operativo (snapshots) e la capacità di organizzare i dischi in dispositivi virtuali. ZFS offre anche strumenti integrati per la gestione dei backup, verifica dell'integrità dei dati, clonazione e rollback.

Disponibile per *BSD, Linux, MacOS e Windows (grazie a OpenZFS ) è installabile anche con pacchetti provenienti dai repository delle varie distro Linux.

La sua gestione richiede un po' di pratica. Questa breve guida serve per avere un primo approccio e farsi un’idea delle potenzialità intrinseche. Per un normale uso è utile per trasferire facilmente i dati da una piattaforma ad un’altra (ad esempio da un Linux a MacOS, Windows, FreeBSD e viceversa). Per i backup su qualsiasi piattaforma il vantaggio è poi evidente. Per i *BSD è la scelta di default all'atto dell'installazione (vedi GhostBSD) come per Solaris e OpenIndiana. Per una disamina più tecnica delle potenzialità vedere QUI. Molto in sintesi, lo storage si basa su dei pool (zpool) che forniscono lo spazio di archiviazione vero e proprio mentre i datasets sono un insieme di file e directory montati all’interno dello zpool stesso.

INSTALLAZIONE MEDIANTE PACCHETTI

Premessa: attenzione alla compatibilità tra versioni di ZFS, in genere la versione più recente dovrebbe funzionare con versioni precedenti ma non viceversa.

Installare ZFS (su Ubuntu e derivate) con sudo apt install zfsutils-linux e zfs-dkms per i moduli del kernel. Testare la riuscita dell’installazione con whereis zpool (appaiono le directory con i file di ZFS). Per altre distro cercare i pacchetti corrispondenti, facili da trovare.

INSTALLAZIONE MEDIANTE COMPILAZIONE

Premesso che si da per scontata la presenza delle applicazioni necessarie alla compilazione nel proprio sistema, scaricare il file sorgente per Linux più recente da OpenZFS.

Installare prima alcune dipendenze: zlib-devel, libuuid-devel (per Debian uuid-dev), libblkid-devel, libssl-devel. Poi, nella directory scompattata di ZFS, dare nell'ordine: ./configure make e infine make install.

USARE ZFS

Premessa alla creazione di un pool: poichè versioni meno recenti di ZFS potrebbero fallire con versioni più nuove, fare attenzione con quale versione andrete a creare il vostro pool se poi dovrà essere letto su altri sistemi operativi o macchine. La versione installata si controlla con zpool -V

1) Creazione di un pool su intero disco (anche esterno)

E’ possibile creare un pool con zpool create <nome> <disk> cioè ad esempio zpool create myzpool dev/sdb (in questo caso su dispositivo esterno)

2) Creazione di un pool su una partizione insieme ad altre

E' da fare con più cautela perchè ZFS tende ad occupare l'intero disco. Quindi, sotto Linux vediamo prima le partizioni esistenti e con Gparted creiamo una partizione 'pulita'. Poi da terminale dare il comando ls -lh /dev/disk/by-id/ per vedere in modo analitico le partizioni presenti.

Una volta trovata la stringa della partizione da assegnare a ZFS, dare il comando ‘create’ con le varie opzioni desiderate. L'esempio seguente crea un pool ‘mypool’. La lunga stringa successiva è derivata dal comando visto prima e relativo alla partizione scelta:

zpool create mypool nvme-INTEL_SSDPEKNU512GZ_BTKA20542J93512A-part10

E’ possibile, anzi è una prerogativa in alcuni casi più professionali, all’atto della creazione del pool fare un mirror o addirittura sfruttare le qualità RAID di ZFS. Un mirror si crea semplicemente con il comando zpool create -r -d /dev/sda -d /dev/sdb mypool (ovviamente si devono avere 2 dischi a disposizione).

Per una disamina più complessa su RAID vedere QUI

CRITTARE IL POOL

Il pool può essere crittato all’atto della creazione. Farlo in un secondo momento è più complicato ed è necessario usare in tal caso i comandi send e receive come spiegato dopo nell’apposito paragrafo.

Crittare con una password. Usare appositi parametri come nell’esempio:

zpool create -O encryption=on -O keyformat=passphrase -O keylocation=prompt mypool nvme-INTEL_SSDPEKNU512GZ_BTKA20542J93512A-part10

Verrà creato un pool crittato con password da inserire da parte dell’utente

Crittare con una chiave

Se invece vogliamo crittare un pool non con password ma con un file raw dobbiamo dare prima da terminale comando per generare la chiave: dd if=/dev/random of=<path file>/.zfs-encrypt.key bs=32 count=1

Ovviamente il file della chiave dovrà essere al sicuro e non dovrà essere perso. Per la crittografia si ricorda che non è possibile crittografare realmente il pool utilizzando la crittografia ZFS. Comunque un esauriente guida più complessa alla crittatura e al montaggio in auto è QUI

Fatte queste procedure con zpool status controlliamo se va tutto è andato bene e dovrebbe uscire qualcosa di analogo:

pool: mypool

state: ONLINE

config:

NAME STATE READ WRITE CKSUM

mypool ONLINE 0 0 0

sdb ONLINE 0 0 0

Adesso creiamo un dataset, ad esempio /home e lo montiamo sotto /mnt/home con zfs create -o mountpoint=/mnt/home mypool/home

Controlliamo con zfs list:

NAME USED AVAIL REFER MOUNTPOINT

mypool 492K 899G 96K /mypool

mypool/home 96K 899G 96K /mnt/home

Ora avremo un dataset ZFS sotto /mnt/home per gestire i files. I permessi si possono cambiare normalmente con chmod (ad esempio chmod 775 /<nome pool>/<nome dataset> e la gestione funziona con i normali comandi da terminale o usando un File Manager. Per problemi di permessi dare anche un chmod 777 ad alcuni dataset

APRIRE UN POOL

Una volta creato un pool con tutti i suoi dataset, sarà visibile usando il comando zpool import mypool (talora bisogna aggiungere il parametro -f cioè zpool import -f mypool)

Con zfs load-key mypool si inserisce la passphrase di sblocco per la crittatura

Con zfs set mountpoint=<path> mypool/dataset si cambia il percorso del mount (opzionale). Se si mette il parametro ‘none’ al path, non verrà scelto nessun punto di mount.

Con zfs mount mypool/<dataset> montiamo il dataset oppure solo il pool

Con zfs umount mypool/<dataset> smontiamo il dataset oppure solo il pool

Con zfs mount -a e zfs umount -a montiamo/smontiamo tutto

Con zfs list si controllano i dataset e i punti di mount

Con zfs export mypool si disattiva un pool senza cancellarne i dati (necessario un zfs import per il ripristino). Utile in particolare occasioni.

Per avere la possibilità di creare o fare altro come utente e non come root su un dataset, bisogna dare un comando come zfs allow -u <nome utente> mount,create,destroy,snapshot <nome dataset>. Nell’esempio abbiamo concesso ad un utente la facoltà di montare, creare, cancellare e fare snapshot

Praticamente dando prima zpool import mypool, poi zfs load-key mypool (se si usa la password via prompt) e infine con zfs mount -a potremmo gestire il pool con i File Manger soliti (Dolphin, Nautilus, ecc…) della propria distro sotto la cartella del punto di mount del pool e dei dataset.

SNAPSHOT

Creare un snapshot per avere copia esatta del contenuto dei pool. Si fa dando il comando ad esempio zfs snap mypool/home@snaphome1 (notare il simbolo@) e si controlla la creazione dello snapshot con

zfs list -t snapshot

NAME USED AVAIL REFER MOUNTPOINT

mypool/home@snaphome1 0B - 104K -

Con il comando zfs destroy <nome snap> si rimuove lo snapshot

Con il comando zfs rename <nome snap> <nuovo nome> si rinomina lo snapshot

Con il comando zfs rollback <nome snap> ripristiniamo il filesystem esistente con quello delle snap eseguito

USO DI SEND e RECEIVE

Con i comandi zfs send e zfs receive (abbreviabile in recv) è possibile trasferire uno snapshot di un dataset in un nuovo dataset.

Ipotizziamo di farlo sullo stesso pool. Prima si crea uno snapshot del dataset con zfs snapshot -r <nomepool>/<nome dataset>@transfer

Poi si spedisce lo snapshot con zfs send -Rv <nome snapshot> | zfs receive -o mountpoint=none (oppure nuovo punto di mount) <nome pool>/<nuovo nome dataset>

Un caso particolare è quello di voler criptare un dataset che originariamente non era stato crittato con gli stessi comandi. In tal caso, dopo aver creato lo snapshot del dataset da crittare bisogna dare questi comandi a seconda del metodo di crittatura voluto. In tal caso generare il file con il comando dd if=/dev/random of=<path file>/.zfs-encrypt.key bs=32 count=1. Poi dare comando zfs send <nome pool>/<nome snapshot> | zfs receive -o encryption=on -o keyformat=raw -o keylocation=file:///<path>/.zfs-encrypt.key <nome pool>/>nuovo nome dataset> (attenzione che per il path del file si intende anche un'eventuale slash aggiuntivo, cioè se il path completo è /mnt/zfs allora il comando sarà: keylocation=file:////mnt/zfs/.zfs-encrypt.key)

Qualora si preferisca crittare con una password da inserire ogni volta all'apertura del pool, prima fare la procedura di sopra descritta e poi cambiare la modalità con il comando: zfs change-key -o keyformat=passphrase -o keylocation=prompt <nome pool>

ZFS SU WINDOWS

Su Windows 10 e 11, ZFS non dà particolari problemi, si installa da QUI.

Bisogna usare il prompt dei comandi o la powershell (da amministratore). I comandi sono gli stessi già visti e Windows farà il mount del pool automaticamente vedendolo come disco aggiunto, quindi usando l’apposita icona ‘questo PC’ e la lettera del disco montato con il nome del pool si accederà al contenuto dello stesso.

ZFS SU MacOS

Sui dispositivi Apple MacOS, ZFS si installa da QUI come qualsiasi altro applicativo .dmg

Poi usando il terminale (da amministratore) si usano i medesimi comandi. Si accede per la gestione al Finder (in genere sotto una cartella con il nome del pool). Attenzione a settare i punti di mount, dato che MacOS usa cartelle dai nomi diversi rispetto ai *BSD e Linux (ad esempio la directory home è in MacOS denominata Users).

PROBLEMA ZFS NON VEDE TUTTI I FILES (su LINUX)

Può accadere che ZFS sebbene acceda al pool e ai dataset, questi una volta aperti non elenchino tutti i files ma solo alcuni di essi. Questo problema in genere si verifica quando si opera tra diversi sistemi operativi e si è cambiato il path di destinazione del mountpoint. In tal caso è necessario dare un umount <pool name>/<nome dataset> per tutti i dataset che presentano questo problema. Dopodichè andare di nuovo nella directory dove è montato il pool e i dataset e vedere se vengono mostrati tutti i files. Per vedere quale sia il punto di mount dare zfs list.

Altrimenti provare a dare un zfs umount -f -a e poi zfs set mountpoint=none <nome pool>/<nome dataset> e ripetere per tutti i dataset presenti nocnchè per il pool. Ripristinare il mountpoint originale sempre con lo stesso comando zfs set mountpoint=<path> <nome pool>. Fare un restart e una volta reimportato il pool dare un comando zfs mount -f -a.

Infine una completa visione su ZFS deve far riferimento alle pagine ufficiali Oracle dedicate al filesystem:

https://docs.oracle.com/cd/E27998_01/html/E48433/toc.html e https://docs.oracle.com/cd/E19253-01/819-5461/