ZFS

Faig servir ZFS als discs interns per 2 motius:

  • té sumes de comprovació per a cada bloc, així que detecta "bit-rot"
  • permet fer mirror de 3 volums

Assegura't que el mòdul està carregat:

modprobe zfs

però segurament prefereixes aixecar el servei:

/etc/rc.d/rc.zfs start

Important

Aquest script no es part del paquet de fonts pero el pots baixar d'SBo. Assegura't que hi ha sysvinit-functions instal.lat.

Slackware no executa scripts de /etc/rc.d encara que siguin executables. Nomes ho fa per als que venen amb el sistema, purament perque estan definits a /etc/rc.d/rc.X. Com que no es bo modificar aquests darrers, es millor executar els scripts addicionals a /etc/rc.d/rc.local:

vi /etc/rc.d/rc.local
   [ -e /var/lock/zfs/zfs ] && rm /var/lock/zfs/zfs
   /etc/rc.d/rc.zfs start

Per crear un "pool" de discs:

zpool create -f -o ashift=12 -m <dir> <pool> [tipus] <IDs>

a on:

  • -f força la creació del volum i ignora l'error sobre la "EFI label"
  • -o ashift=12 crea blocs de 4096 (2^12) bytes
  • -m és el directori a on es muntarà
  • és el nom del pool
  • [tipus] és la redundància: raidz, raidz2, raidz3 o mirror
  • són els ID dels discs o particions

Si no s'indica ashift, ZFS intentarà detectar la mida dels sectors al disc. Si no la detecta bé, pot donar problemes de rendiment: emprar blocs de 512 bytes en discs amb sectors de 4096 implica que per escriure un bloc el disc ha de llegir el sector sencer, modificar el bloc ZFS i rescriure el sector. (Recorda que els discs antics tenen sectors de 512 bytes i els nous, sobretot els de molta capacitat, i els SSD tenen tendència a tenir-los de 4096.)

Si no s'indica el punt de muntatge, per omisió és /<pool>. Emprarem /mnt/<pool>.

Si no s'indica el tipus, per omisió no hi ha redundància. Equival a indicar vdev.

No és recomanable emprar dispositius (/dev/sdX) perquè poden canviar si afegeixes discs, si arrenques amb un USB connectat, etc. És millor emprar IDs (/dev/disk/by-id).

Hi ha qui diu que és millor no emprar particions sinó discs sencers. No tinc clar que això sigui cert si les particions estàn ben alineades amb blocs de 4 KB. Com fas sempre començant al sector 2048, és bo que totes les particions estiguin alineades a multiples de 2048. Els fdisk prou moderns ho fan per omisió.

Per tant, el nostre pool es creara aixi:

zpool create -f -o ashift=12 -m /mnt/drac1 drac1 mirror <IDs>

a on anomeno el pool segons la maquina, per evitar conflictes si mai he de muntar els discs d'una en una altra, i el numero per si de cas mai en necessito cap mes. El munto directament a /mnt.

Els datasets (sistemes de fitxers segons la nomenclatura ZFS) es creen a sota:

zfs create <pool>/<dataset>

Nota que no indiques el path cap al pool, sino el seu nom.

Per omisió els datasets es munten a un directori amb el seu nom a dins del directori de muntatge del pool. Pots canviar-lo si vols amb:

zfs set mountpoint=<directori> <pool>/<dataset>

o, si encara no has creat el dataset, pots fer-ho durant la creacio:

zfs create -o mountpoint=<directori> <pool>/<volum>

Si tots els datasets van a directoris fora del punt de muntatge del pool, aquest darrer restara muntat pero buit. Es lleig pero no importa. Si intentes desmuntar-lo, ZFS intentara desmuntar tots els datasets que en pengen.

Els pools i datasets es munten automaticament, pero de vegades aixo no passa. En aquest cas pots muntar-los a ma:

zfs mount <pool>
zfs mount <pool>/<dataset>

Un exemple en que passaria aixo seria crear un dataset per al /home. En un sistema configurat aquest directori no es buit, i aquesta comanda:

zfs create -o mountpoint=/home <pool>/home

creara el dataset pero no el muntara. Un error indicara exactament aixo. La manera de procedir seria, per exemple:

mv /home /home2 # si es punt de muntatge, cal umount + mount al nou punt
zfs mount <pool>/home
mv /home2/* /home
rmdir /home2

Recorda que caldra eliminar /home de /etc/fstab si hi era, ja que ZFS s'encarregara de muntar-lo.

Els datasets poden contenir datasets, aixi que potser vols fer quelcom aixi:

zfs create -o mountpoint=/comu zfs/comu
zfs create zfs/comu/backup
zfs create zfs/comu/data
zfs create zfs/comu/home
zfs create zfs/comu/...

Igual que he dit abans per al pool, potser en aquest cas vols intentar evitar tenir fitxers i directoris a /comu per no barrejar datasets i "fitxers normals", pero es quelcom perfectament valid i potser fins i tot practic per als directoris petits.

Si no has creat particio de swap al disk, pot crear un volum al pool. Per exemple:

zfs create <pool>/swap -V 8G -b $(getconf PAGESIZE)

a on hem donat el nom "swap" al volum.

Note

En nomenclatura ZFS un volum (-V) es un "bloc device", i un "dataset" (sense -V) es un "filesystem"

Important

L'arrel del pool es un dataset en si mateixa, aixi que si nomes vols un dataset, pots fer zpool create -f -o ashift=12 -m /comu comu mirror <discs>. Per si mai en tens mes d'un, es millor crear datasets sempre

Per veure els pools i els datasets, respectivament:

zpool status
zfs list

Els "scrubs" no són automàtics. Es fan a nivell de pool. Fes això manualment o a un cron:

zpool scrub <pool>

Si un pool falla i cal importar-lo, NO FACIS AIXÒ:

zpool import <pool>

perquè llavors l'importarà amb dispositius /dev/sdX. Ja he comentat més amunt quin problema té aixó. Si vas emprar /dev/disk/by-id per crear-lo, fes ara:

zpool import -d /dev/disk/by-id <pool>

Això es pot emprar per passar un pool creat amb /dev/sdX a IDs, exportant-lo primer i important-lo llavors per ID:

zpool export <pool>

ZFS té quotes per dataset. Per exemple:

zfs set quota=20G <pool>/.../<dataset>

Algunes coses que pots voler canviar:

# atime en format ext4/xfs: nomes s'actualitza un cop cada 24 h per a # accesos al fitxer, i sempre quan canvia mtime o ctime zfs set relatime=on

# atime desactivat del tot zfs set atime=off

# compressio zfs set compression=on

# veure opcions posibles i valors al pool zfs get all

Important

Atenció a quan estigui disponible l'encriptació! Mentrestant pots fer ZFS sobre LUKS.

Classificar

ZFS fa servir ARC com a cache, i la memoria emprada per ARC apareix a "used" i no a "cached" encara que es comporta enterament com a cache i es per tant alliberada quan cal. Aixo dona la falsa impressio que ZFS es menja tota la memoria. Si tot i aixi vols reduir la mida maxima d'ARC a, per exemple, 512 MB, fes aixo en "runtime":

echo 536870912 > /sys/module/zfs/parameters/zfs_arc_max

i aixo per a propers reinicis:

echo "options zfs zfs_arc_max=536870912" >> /etc/modprobe.d/zfs.conf

Si el valor de /sys/module/zfs/parameters/zfs_arc_max es zero, no hi ha cap limit establert i ZFS emprara fins a un 50% de la memoria total.

En rebotar, els pools no eren visibles. Els vaig fer amb sdX, no amb IDs. zpool status i zpool list deien que no hi habia res, pero zpool import si els veia. zpool import -d /dev/disk/by-id l'importa sense problemes. Es munta automaticament en importar. Falta veure si en tornar a reiniciar cal tornar a importar, o si havent important "by-id" ja no cal.

Segons zfs-on-linux, gent a qui li passava el mateix va fer zpool export i zpool import -d /dev/disk/by-id i el problema es va arreglar. Els desenvolupadors confirmen el metode. Potser em cal primer fer un export i llavors tornar a fer el import perque en un proper reinici es munti automaticament.

Si cal eliminar un pool, fes zpool destroy .

Els snapshots son per dataset, no per pool. Per crear-ne un:

zfs snapshot [pool]/[dataset]@[nom]

i per esborrar-lo es fa com a un dataset normal:

zfs destroy [pool]/[dataset]@[nom]

Pots veure quins n'hi ha;

zfs list -t snapshot

Els snapshots son visibles a l'arrel del dataset en un subdirectori virtual .zfs/snapshots que nomes existeix en accedir-hi.

Encriptacio de datasets, amb ZoL 0.8 i seguents:

zfs create -o encryption=on \ -o keysource=passphrase,prompt \ [pool]/[dataset]

https://blog.heckel.xyz/2017/01/08/zfs-encryption-openzfs-zfs-on-linux

pero potser prefereixes LUKS + ZFS no encriptat. Si tens varis discs, pots dir a LUKS que els obri tots d'una.

cryptsetup luksFormat # mira a [[luks]] com faig per obrir-los tots alhora zpool create -o ashift=12 -m /mnt/zfs zfs mirror /dev/disk/by-id/ for d in comu home soft do zfs create -o mountpoint=/$d zfs/$d done

Sembla que en actualitzar ZFS cal actualitzar els pools amb:

zpool upgrade

No pots fer mirror amb un sol disk, pero pots fer un vdev i despres afegir disks amb zpool attach. Idem si tens un mirror d'n disks i vols tenir n+1.

zpool attach # cal IDact perque cal dir quin dispositiu del pool es el que volem # duplicar. un pool pot tenir alhora dispositius amb diferents nivells # de redundancia: per exemple RAID10

Si falla cap disc, canvia'l i fes:

zpool replace drac

Suposo que hi ha una manera d'eliminar el disc cascat abans de canviar-lo fisicament, i d'afegir el nou un cop fet el canvi, pero no ho he buscat.

Volver al inicio