HowtoZFS
Howto ZFS
Les exemples donnés ici n’ont été testés sur OpenIndiana et Solaris, bien qu’ils soient probablement applicables à FreeBSD voir Linux, ils peuvent présenter de grosses différences dans le support de fonctionnalités spécifiques ou du montage automatique !
ZFS est le système de fichiers par défaut de Solaris et OpenIndiana, il regroupe à lui seul les outils de différents niveaux habituellement utilisés pour gérer le stockage tels LVM pour le découpage logique, mdadm pour la gestion du raid, et ext3/4 pour le filesystem en lui même.
Tout commence avec le zpool, qui est la première unité de gestion de disques avec ZFS, un zpool peut être composé d’un ou plusieurs disques, avec ou sans gestion de parité, et même avec ou sans cache séparé. Viennent ensuite les volumes, qui sont découpés dans un zpool, et qui constituent un équivalent des partitions. Attention, par défaut un zpool est parfaitement utilisable comme un gros volume, mais rien n’empêche de le (re)découper par la suite, de la même manière un volume peut très bien être créé en tant que block device afin d’être partagé en iSCSI par exemple.
||zpool||zfs|| ||RAID||Ext3/4|| ||LVM||img||
Configuration
Limiter l’utilisation mémoire de ZFS
ZFS est assez consommateur en mémoire RAM. Par défaut ZFS utilise
comme limite maximale la
totalité de la mémoire disponible moins 1G (ou 5/8 de toute la mémoire
disponible si c’est plus grand) d’un machine comme cache. Ce qui
peut déclencher des alertes sur des sondes mal concues. On préfère donc
réduire son utilisation via l’option de configuration
zfs_arc_max.
Nous suivons la recommandation
de Proxmox d’avoir un zfs_arc_max d’au moins 2 GiB avec
1 GiB supplémentaire par TiB de stockage ZFS. Par exmple avec un pool de
8 TiB utilisable, on assigne 10 GiB de RAM à ZFS ARC au maximum.
La consultation du réglage et changement à chad se fait via
/sys/module/zfs/parameters/zfs_arc_max. Pour péréniser le
réglage au démarrage c’est via le fichier
/etc/modprobe.d/zfs.conf :
## Forcer la mémoire maximale pour ARC à 10 GiB et péréniser le régglage au boot
# echo "$[10 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max
# echo "options zfs zfs_arc_max=$(cat /sys/module/zfs/parameters/zfs_arc_max)" >> /etc/modprobe.d/zfs.conf
Note, si /sys/module/zfs/parameters/zfs_arc_max est à
0 ça ne signifie pas que ZFS ARC est
désactivé ou qu’il utilise 0B de RAM. Ça signifie qu’il est à sa valeur
par défaut soit la
totalité de la mémoire disponible moins 1G (ou 5/8 de toute la mémoire
disponible si c’est plus grand).
Zpool(s)
Création
Créer un zpool simple (sur un disque nouvellement ajouté par exemple) :
# cfgadm
Ap_Id Type Receptacle Occupant Condition
sata6/0::dsk/c3t0d0 disk connected configured ok
sata6/1::dsk/c3t1d0 cd/dvd connected configured ok
sata6/2::dsk/c3t2d0 disk connected configured ok
[...]
# zpool create test1 c3t2d0
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 7,94G 3,25G 4,69G 40% 1.00x ONLINE -
test1 49,8G 114K 49,7G 0% 1.00x ONLINE -
Créer un zpool avec plusieurs disques (équivalent d’un RAID0) :
# zpool create test2 c3t3d0 c3t4d0
'test2' successfully created, but with no redundancy; failure of one
device will cause loss of the pool
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 7,94G 3,24G 4,69G 40% 1.00x ONLINE -
test1 49,8G 86,5K 49,7G 0% 1.00x ONLINE -
test2 99,5G 127K 99,5G 0% 1.00x ONLINE -
Créer un zpool en RAID-Z (équivalent d’un RAID5) :
# zpool destroy test2
# zpool destroy test1
# zpool create test raidz c3t2d0 c3t3d0 c3t4d0
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 7,94G 3,26G 4,68G 41% 1.00x ONLINE -
test 149G 253K 149G 0% 1.00x ONLINE -
Dans ce cas, la parité est conservée une seule fois, mais il est possible de choisir d’utiliser un parité double ou triple en ayant un minimum de 4 ou 5 disques et en remplaçant raidz par respectivement raidz2 ou raidz3.
Pour obtenir les détails sur l’état d’un zpool (qu’il s’agisse d’un raidz, ou d’un mirroir, ou encore d’un stripping sans parité) :
# zpool status test
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 0
c3t4d0 ONLINE 0 0 0
errors: No known data errors
Les zpool créés localement sont montés par défaut sur la racine, pour changer ce comportement, il faut préciser le point de montage par défaut avec l’option -m après le create :
# zpool create -m /export/test test raidz c3t2d0 c3t3d0 c3t4d0
# df -h
[...]
test 98G 34K 98G 1% /export/test
Il est à noter que les zpools sont également persistants, et sont (re)montés automatiquement au démarrage.
Ajout de disques à un zpool
À compléter
Désignation des disques de spare dans un zpool
# zpool add test spare c3t5d0
# zpool status test
pool: test
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 0
c3t4d0 ONLINE 0 0 0
spares
c3t5d0 AVAIL
errors: No known data errors
Dès lors qu’un disque du pool est en défaut, tout se déroule automatiquement :
# zpool status test
pool: test
state: ONLINE
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 Fri Apr 20 17:11:19 2012
154M scanned out of 309M at 3,28M/s, 0h0m to go
51,2M resilvered, 49,86% done
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
spare-1 ONLINE 0 0 0
c3t3d0 UNAVAIL 0 0 0 corrupted data
c3t5d0 ONLINE 0 0 0 (resilvering)
c3t4d0 ONLINE 0 0 0
spares
c3t5d0 INUSE currently in use
errors: No known data errors
Remplacement d’un disque
Dans le cas précédent, un disque était en défaut, il a été remplacé par un disque de spare, mais il ne faut pas tarder à remplacer le disque défectueux afin d’éviter toute défaillance en cascade.
Le disque c3t3d0, vient d’être remplacé par un disque neuf :
# zpool replace test c3t3d0
# zpool status test
pool: test
state: ONLINE
scan: resilvered 103M in 0h0m with 0 errors on Fri Apr 20 17:23:08 2012
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 0
c3t4d0 ONLINE 0 0 0
spares
c3t5d0 AVAIL
errors: No known data errors
Si le disque n’avait pas été remplacé physiquement, mais qu’un autre disque était utilisable sur le serveur une autre solution aurait été de le remplacer par ce dernier :
# zpool replace test c3t3d0 c3t6d0
# zpool status test
pool: test
state: ONLINE
scan: resilvered 103M in 0h1m with 0 errors on Fri Apr 20 20:33:44 2012
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
c3t6d0 ONLINE 0 0 0
c3t4d0 ONLINE 0 0 0
spares
c3t5d0 AVAIL
errors: No known data errors
Les deux commandes précédentes affichent un état de la reconstruction tant que l’opération n’est pas terminée.
Réparation d’un zpool en défaut
À compléter
Utilisation de disques de cache
À compléter
Volumes ZFS
Création
Créer un filesystem ZFS dans le zpool test :
zfs create test/zfs
Créer un volume de type “block” (pour le partager en iSCSI, ou pour utiliser un autre système de fichiers dessus) dans le zpool test :
# zfs create -V 90g test/iscsi
# zfs list
[...]
test 93,3G 4,43G 427M /export/test
test/iscsi 92,8G 97,3G 16,7K -
Partage en réseau
NFS
À compléter
SMB
À compléter
Synchronisation de volumes/pools
Sychroniser filer1:zpool/vol1 vers filer2:zpool/vol2:
# Premiere synchro seulement:
filer1# zfs snapshot -r zpool/vol1@sync1 # -r = recursif
filer1# zfs send -R zpool/vol1@sync1 | ssh filer2 'zfs receive -F zpool/vol2'
# synchro incrémentale suivante:
filer1# zfs snapshot -r zpool/vol1@sync2
filer1# zfs send -R -I @sync1 zpool/vol1@sync2 | ssh filer2 'zfs receive -F zpool/vol2'
Attention: receive -F écrase la destination, et send -R envoie tout (points de montages, destruction/creation de sous volumes, snapshots, …)
Monitoring
Mise en place d’un check NRPE check_zpools pour
monitoring le raidz et l’occupation du pool :
# wget https://www.claudiokuenzler.com/monitoring-plugins/check_zpools.sh
# cp check_zpools.sh /usr/local/lib/nagios/plugins/check_zpools
# chmod 755 /usr/local/lib/nagios/plugins/check_zpools
# chown root:nagios /usr/local/lib/nagios/plugins/check_zpools
Dans la configuration NRPE on peux mettre le check suivant :
command[check_zpools]=/usr/local/lib/nagios/plugins/check_zpools -p ALL -w 80 -c 90
Les options disponibles sont :
- -p : nom du pool ZFS à surveiller, possible de mettre ALL pour check tout les pools disponible.
- -w : seuil en warning pour l’occupation du pool
- -c : seuil en critique pour l’occupation du pool
