ZFS și OS X (II)

Dacă data trecută am instalat ZFS pe OS X, de data asta încercăm să și folosim noul sistem de fișiere. Spuneam că este destul de complex, așa că nu vă așteptați să deschideți Disk Utility și să formatați partiția în formatul ZFS.

Atenție, în cele ce urmează vor fi descriși pași care duc la pierdea datelor. Nu uitați de backup și pregătiți-vă pentru ce-i mai rău. Să nu spuneți că nu ați fost avertizați :)

Ceea ce urmează se aplică oricărei implementări ZFS, nu contează dacă aveți MacZFS , OpenZFS sau ZEVO, atâta timp cât este vorba de v5000 (acolo unde sunt diferențe față de v28, va fi menționat). De asemenea, majoritatea pașilor următori nici măcar nu sunt specifici OS X-ului, ei putând fi aplicați cu succes și în FreeBSD, Linux sau OpenIndiana.

Pentru a profita cât de cât de facilitățile oferite de ZFS, voi folosi două discuri identice, care vor fi folosite ca mirror. În acest fel, ZFS se va putea vindeca singur dacă detectează date corupte, prin compararea acesteia cu copia aflată pe celălalt disc. În plus, defecțiunea unui disc nu va duce la pierderea datelor (similar cu RAID1).

Este recomandat să ștergeți discurile cu zerouri, dar este o operațiune care durează câteva ore și nu am avut răbdare. Acest lucru se poate face din Disk utility -> Erase -> Security options și mutați sliderul spre dreapta cu o poziție. Eu l-am lăsat la stânga și a fost extrem de rapid. Apoi dați unmount la discurile respective.

În Terminal, identificați care sunt cele două discuri pe care doriți să le formatați ZFS:

diskutil list

În cazul meu, au fost disk1 și disk2.

Să trecem la treabă și să creeam un pool, adică ierarhic, structura primară din cadrul ZFS-ului. Nu voi intra în amănunte cu privire la detalii legate de ZFS, le puteți găsi structurate în documentația oficială. Pentru mine, în cazul de față, un pool înseamnă colecția celor două discuri.

zpool create -f -o ashift=12 -O casesensitivity=insensitive -O compression=lz4 -O atime=off -O normalization=formD STORAGE mirror /dev/disk1 /dev/disk2

  • ashift este un parametru setat în funcție de tipul discului fizic. Dacă aveți discuri vechi, cu lungimea unui sector de 512 octeți, ashift poate avea valoarea ‘9’. Dacă aveți un disc mai nou, cu sectoare de 4K, ashift va fi ’12’. Dar dacă ashift are o valoare mai mare, nu este nici un fel de problemă, așa că dacă nu știți ce tip de HDD aveți, lăsați ashift=12 și nu vor fi nici un fel de probleme. ÎNsă invers nu e în regulă, dacă folosiți ashift=9 cu discuri de 4K, vor fi probleme de performanță. Dacă plănuiți în viitor să folosiți SSD, ashift va trebui să fie 13;
  • pentru că discul va fi folosit (și) sub OS X, nu-l vom face casesensitive, pentru a nu genera alte probleme;
  • ZFS suportă compresie în timp real, așa că folosim algoritmul lz4. Această opțiune este diposnibilă doar în ZFS v5000, astfel că pool-ul nu va fi accesibil din sisteme cu ZFS v28. Pentru a asigura compatibilitatea cu v28, aveți nevoie de opțiunea ‘-version=28′ și ‘compression=on';
  • atime se referă la access time și din motive de performanță, de regulă este dezactivat;
  • Don Brady recomandă normalization=formD pe OS X, așa că nu o să îl contrazic, o fi având omul motivele lui;
  • STORAGE este numele pool-ului, puteți alege altul, care vă este mai comod;
  • mirror este destul de evident ce efect va avea
  • /dev/disk1, dev/disk2 sunt cele două discuri pe care sistemul le va vedea ca un singur pool. Atenție maximă la aceste două argumente, la voi aproape cu siguranță numerele discurilor vor fi diferite.

Pentru a vedea starea pool-ului, rulați în Terminal:

zpool status

Cifrele din cele trei coloane reprezintă erori ale sistemului de fișiere. Cât timp sunt zero, e de bine.

E de preferat să vă însușiți noul pool înainte de a copia ceva în el:

sudo chown -R <username>:staff /STORAGE

Acum, pentru a profita la maxim de ZFS, putem creea seturi de date (datasets). Acestea vor fi văzute ca discuri virtuale și vor ușura procesul de generare de snapshot și backup astfel: în loc să faceți un snapshot întregului pool (care la mine are aproape 1 TB), puteți genera snapshoturi pentru fiecare set de date în parte. De exemplu, să presupunem că dorim să avem trei foldere: Poze, Muzica, Filme. Le putem lăsa foldere, ca până acum, sau putem creea trei seturi de date, astfel:

zfs create STORAGE/Poze
zfs create STORAGE/Muzica
zfs create STORAGE/Filme

Dacă nu au apărut deja pe desktop, deschideți Finder și le veți vedea ca discuri virtuale, ierarhic aflate sub discul STORAGE.

Se pot genera și subseturi și sub-subseturi de date:

zfs create STORAGE/Filme/Seriale
zfs create STORAGE/Filme/Documentare

sau

zfs create STORAGE/Filme/Seriale/StarTrek/TNG

dar am considerat că pentru nevoile mele, un singur nivel de subset este suficient.

O altă facilitate a ZFS este posibilitatea de a genera snapshoturi, la care se poate reveni în viitor. Desigur, vor consuma spațiu în timp, dar usnt deosebit de utile pentru backup. Nu uitați, chiar dacă aveți mirror, acest lucru nu înseamnă backup! Înseamnă protecție la erori și protecție în cazul unei defecțiuni. Pentru backup este nevoie de un disc separat, de preferință formatat tot cu ZFS. Să vedem cum procedăm.

Înainte, să generăm un snapshot al colecției de muzică:

zfs snapshot STORAGE/Poze@snap1

Presupunem că avem un alt disc cu ZFS în preajmă, care are un pool denumit BACKUP. Pentru a face backup-ul colecției de muzică de la STORAGE pe BACKUP, procedăm în felul următor:

zfs send STORAGE/Poze@snap1 | zfs recv BACKUP/Poze

Dacă după un timp, dorim să aducem la zi backup-ul, vom genera un nou snapshot:

zfs snapshot STORAGE/Poze@snap2

și îl vom transfera incremental:

zfs send -i  STORAGE/Poze@snap1  STORAGE/Poze@snap2 | zfs recv BACKUP/Poze

Nu-i așa că e elegant, simplu și că vă duce cu gândul la Time Machine?

Dacă doriți să folosiți pool-ul în alt sistem de operare, acesta va trebui exportat:

zpool export STORAGE

Pentru importul său, se folosește evident:

zpool import STORAGE

Priviți aceste comenzi ca pe un fel de mount/unmount. Nu este nevoie de aceste comenzi înainte de reboot, sistemul are grijă să facă un unmount curat al discurilor, dar dacă intenționați să importați pool-ul în FreeBSD, de pildă, se recomandă un export manual.

Pentru a scana sistemul de erori, acesta trebuie „frecat” cu scrub:

zpool scrub STORAGE

Procesul este destul de lung și poate dura câteva ore, în funcție de performanțele computerului (procesor, RAM etc), dar în acest timp, discurile respective pot fi folosite.

Verificați starea procesului de scanare astfel:

zpool status STORAGE

Veți fi informat cu privire la cantitatea de date scanată și la timpul estimat până la finalizarea procesului.

Dacă vă incomodează, îl puteți întrerupe și îl puteți lăsa să frece discurile peste noapte:

zpool scrub -s STORAGE

Pentru a accesa toate informațiile despre pool și seturile de date, rulați:

zfs get all

Dacă ați optat pentru încărcarea manuală a extensiilor, atunci după fiecare reboot, Finder vă va spune că nu poate folosi cele două discuri și vă întreabă dacă nu vreți să le inițializați. Nu vreți, ignorați ce spune Finder și porniți ZFS-ul cu zfsadm - k, după cum am văzut în episodul trecut.

Ar mai fi de povestit despre ZFS, dar în mare, cam acesta ar fi punctul de plecare. Documentația este stufoasă, dar merită răsfoită. Și comunitatea OpenZFS este una destul de prietenoasă, așa că dacă întâmpinați probleme, puteți oricând intra pe IRC pentru răspunsuri rapide (#openzfs și #mac-zfs, în rețeaua Freenode).