Outils pour utilisateurs

Outils du site


freebsd:zfs

ZFS

Création d'un pool

Identifier les disques durs

SATA :

camcontrol devlist

PATA :

atacontrol list

ou le grep qui va bien :

egrep 'ad[0-9]|cd[0-9]' /var/run/dmesg.boot

Définition d'un pool

Pour créer un pool de 3 disques dur en raidz du nom de “mon_pool” :

zpool create mon_pool raidz ada0 ada1 ada3

Propriétés

Voir les propriétés d'un pool :

zfs get all storage/home

Voir le status d'un propriété (compression dans l'exemple):

zfs get compression storage/home

Changer une propriété (atime dans l'exemple):

zfs set atime=on storage/home

Réparer un pool dégradé

On identifie le disque dur défaillant :

zpool status

ce qui donne :

pool: mon_pool
state: DEGRADED
status: One or more devices has been removed by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
scan: resilvered 1.37G in 0h0m with 0 errors on Thu Jul 12 16:01:38 2012
config:

	NAME                     STATE     READ WRITE CKSUM
	mon_pool                  DEGRADED     0     0     0
	  raidz1-0               DEGRADED     0     0     0
	    4426481649996282313  REMOVED      0     0     0  was /dev/ada1
	    ada2                 ONLINE       0     0     0
	    ada3                 ONLINE       0     0     0

errors: No known data errors

C'est donc “ada1” qui a été enlevé (dans l'exemple ci dessus, il est marqué “REMOVED” car je l'ai débranché volontairement)

On éteint la machine, on remplace le disque défaillant, puis on rallume.

On indique donc qu'on a remplacé le disque avec cette commande :

zpool replace mon_pool /dev/ada1

Si vous remplacer le disque défaillant par un ayant déja été utilisé dans un autre pool, la commande le signalera en donnant le nom du pool dont fait parti le disque, si vous êtes sur de vouloir l'intégrer au pool il faut forcer la commande :

zpool replace -f mon_pool /dev/ada1

la commande peut prendre quelque seconde pour rendre le prompt.

Une fois fait on peut vérifier de nouveau avec “zpool status” ce qui se passe, pendant qu'il reconstruit le pool la sortie peut ressembler à ça :

pool: mon_pool
state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scan: resilver in progress since Thu Jul 12 16:22:34 2012
    3.17G scanned out of 4.11G at 217M/s, 0h0m to go
    1.06G resilvered, 77.16% done
config:

	NAME                       STATE     READ WRITE CKSUM
	mon_pool                    DEGRADED     0     0     0
	  raidz1-0                 DEGRADED     0     0     0
	    ada1                   ONLINE       0     0     0
	    ada2                   ONLINE       0     0     0
	    replacing-2            REMOVED      0     0     0
	      5739093499366978272  REMOVED      0     0     0  was /dev/ada3/old
	      ada3                 ONLINE       0     0     0  (resilvering)

errors: No known data errors

Redimensionner un pool

Imaginons un pool de 3 disques de 250Go (ada1, ada2, ada3), que l'on souhaite remplacer par 3 disques de 1To.

Si le pool ne contient pas le système, il paraît judicieux de tous transférer sur un autre support, puis refaire un pool avec les 3 nouveaux disques, ou si l'on a suffisamment de contrôleurs, on peut également connecter les 2 pools et donc faire le transfert des données directement.

Si le système est dessus et/ou le pool est plein et qu'on a pas de moyen de transférer les données provisoirement ailleurs, il y a une solution, qui peut être longue mais qui fonctionne.

On éteint la machine et on remplace un 250Go par un modèle d'un 1To, et on déclare le remplacement comme indiqué dans le chapitre précédent.

Une fois que le status confirme que le pool est “ONLINE” et sans erreur, on recommence l'opération en remplaçant le disque suivant… jusqu'a avoir remplacé les 3 disques, en s'assurant toujours d'attendre la fin de la reconstruction !

Ensuite on fait un :

zpool list

qui confirmera que le pool fait environ 750Go, qui est donc la taille additionné des 3 anciens disques.

ensuite on fais un :

zpool set autoexpand=on mon_pool

Ce qui active la possibilité d'auto redimensionnement du pool, il faut ensuite déconnecter un disque, puis le reconnecter en lui indiquant d'étendre sa taille :

zpool offline mon_pool ada1

puis

zpool online -e mon_pool ada1

L'option “-e” implique les autres disques du pool

Et voila, un :

zpool list

devrait vous montrer cette fois environ 3To (~ 1,8To utilisable en raidz).

on peut ensuite désactivé l'option d'auto redimensionnement :

zpool set autoexpand=off mon_pool

Tuning

Alignement des blocs

Pour résumer, sous freebsd, les disques sont détecté comme ayant des blocs de 512 octets, et la plupart des outils de partitionnements les voient comme ça, sauf que tous les disques durs d'aujourd'hui utilise des blocs de 4ko.(en incluant une compatibilité avec l'ancien système 512 octets). En somme des “redécoupage” sont fait à la volée à chaque lecture/écriture sur le disque, ce qui fait légèrement baisser les performances des disques via un système de fichiers “standard”, mais qui peut provoquer une baisse très significative sur du raid (dont le lecture/écriture sont multipliés).

Pour vérifier :

zdb -C storage | grep ashift
 ashift: 9

La valeur “9” signifie que le disque est partitionné en se basant sur des blocs de 512 octets.

L'utilitaire “zpool” ne permettant pas de définir la taille des blocs, on va donc le duper en utilisant “gnop” qui sert normalement à faire des tests sur des partitions de type GEOM.

Attention, Dans le cas d'un pool existant, et avant d'utiliser ce qui suit, il faut le détruire, et donc sauvegarder les données qui seront détruites avec lui

On crée les “pseudo” devices :

gnop create -S 4096 /dev/ada1
gnop create -S 4096 /dev/ada2
gnop create -S 4096 /dev/ada3

On crée notre pool avec :

zpool create storage raidz /dev/ada1.nop /dev/ada2.nop /dev/ada3.nop

On vérifie :

zpool status

pool: storage
state: ONLINE
scan: none requested
config:

	NAME                 STATE     READ WRITE CKSUM
	storage              ONLINE       0     0     0
	  raidz1-0           ONLINE       0     0     0
	    /dev/ada1.nop    ONLINE       0     0     0
	    /dev/ada2.nop    ONLINE       0     0     0
	    /dev/ada3.nop    ONLINE       0     0     0

On exporte le pool (sauve les paramètres et stop les lecture/écriture eventuelle sur le pool) :

zpool export storage

On détruit les “pseudo” device :

gnop destroy /dev/ada1.nop /dev/ada2.nop /dev/ada3.nop

On importe le pool :

zpool import storage

On vérifie :

zpool status

 pool: storage
 state: ONLINE
 scan: none requested
 config:
NAME        STATE     READ WRITE CKSUM
storage     ONLINE       0     0     0
  raidz1-0  ONLINE       0     0     0
    ada1    ONLINE       0     0     0
    ada2    ONLINE       0     0     0
    ada3    ONLINE       0     0     0

Le pool en mode raidz est bien la avec les “vrais” devices.

On vérifie également que zfs considère bien nos disques comme ayant des blocs de 4Ko :

zdb -C storage | grep ashift

Ce qui doit donner :

ashift: 12

et non plus “9” comme précédemment.

Ajuster les propriétés

La déduplication est une propriété qui fera gagné un espace non négligeable sur certain système de fichiers, mais sur un NAS personnel, elle sera la plupart du temps inutile, mais surtout trés gourmande en ressources.

Pour la désactiver :

zfs set dedup=off

Une autre propriété rarement utile, les “acces time”, permettant de mettre a jour les dates d'accès au fichiers, cela génère beaucoup de lecture/écriture.

Pour les désactiver :

zfs set atime=off storage

Et la compression, effectivement ce serait encore un gain d'espace, mais au prix d'énormément de ressources.

Pour la désactiver :

zfs set compression=off storage
freebsd/zfs.txt · Dernière modification : 2018/04/25 10:44 de sheltem