Table des matières
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