Ce tutoriel explique comment ajouter un système de fichiers ZFS sous FreeBSD 8.0. Pour ce faire, deux disques SATA de 500Go vont être ajoutés pour fonctionner en mirroring (RAID 1).
Les manipulations suivantes ont été l’occasion pour moi de découvrir ZFS et je dois avouer que la simplicité de mise en œuvre est étonnante. Une seule ligne de commandes pour créer un volume RAID 1 exploitable. On est loin des longues suites de commandes sous GNU/Linux pour avoir un équivalent – par équivalent, j’entends ce que j’avais sous Fedora, du LVM2 formaté en ext3 sur un RAID 1 logiciel (mdadm).
Principes généraux
L’architecture de ZFS repose sur 3 niveaux : un ou des système(s) de fichiers sont contenus dans un pool qui lui-même est fait de device(s). Et ceci s’administre avec seulement deux commandes : zpool et zfs.
Mise en œuvre
Deux disques de 500Go sont donc ajoutés à la machine. Un dmesg montre qu’ils sont reconnus comme ad4 et ad6 :
# dmesg
ad4: 476940MB <WDC WD5000AAKS-65A7B0 01.03B01> at ata2-master SATA150
ad6: 476940MB <Seagate ST3500830AS 3.AFD> at ata3-master SATA150
On peut donc créer le pool ZFS – que je nommerai dataraid – comme ceci :
# zpool create dataraid raidz ad4 ad6
Et voilà. C’est fini :> Sérieusement, on peut s’arrêter là, le volume /dataraid monté à la racine est disponible et parfaitement exploitable. Voyons un peu son état avec l’option list de zpool qui permet de lister les pools :
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
dataraid 931G 159K 931G 0% ONLINE -
C’est plutôt lisible. dataraid d’une taille de 931Go (capacité totale des devices et non pas capacité utile), utilisé pour 159Ko (il est encore vide), il reste donc 931Go et le pool est en ligne.
Un df confirme qu’il est monté :
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 496M 174M 282M 38% /
/dev/ad0s1e 496M 16K 456M 0% /tmp
/dev/ad0s1f 71G 7.4G 57G 11% /usr
/dev/ad0s1d 1.4G 204M 1.1G 15% /var
dataraid 458G 0B 458G 0% /dataraid
Pour plus d’informations :
# zpool status dataraid
pool: dataraid
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
dataraid ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0
ad6 ONLINE 0 0 0
errors: No known data errors
Encore des informations bien utiles. Le nom du pool, son statut en ligne. scrub indique la dernière vérification de l’état du pool qui se fait à chaque écriture/modification. Et on voit la hiérarchie de notre pile ZFS, le pool dataraid, en RAID constitué de 2 disques physiques. La dernière ligne renvoie les erreurs s’il y a lieu.
Essayons de passer ce pool en mode dégradé en débranchant un disque SATA à chaud tant qu’il n’y a pas trop de données dessus. Le système chez moi ne bronche pas. Normal. Lorsque c’est fait, on revoit le statut du pool :
# zpool status dataraid
pool: dataraid
state: DEGRADED
status: One or more devices could not be used because the label is missing or
invalid. Sufficient replicas exist for the pool to continue
functioning in a degraded state.
action: Replace the device using 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-4J
scrub: scrub in progress for 0h0m, 29.73% done, 0h0m to go
config:
NAME STATE READ WRITE CKSUM
dataraid DEGRADED 0 0 0
raidz1 DEGRADED 0 0 0
ad4 ONLINE 0 0 0
ad6 UNAVAIL 3 212 0 experienced I/O failures
errors: No known data errors
Le statut est passé en mode dégradé, il nous indique qu’un disque est manquant (I/O failures). J’arrête la machine, je remets le disque :
$ sudo zpool status
pool: dataraid
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
dataraid ONLINE 0 0 0
raidz1 ONLINE 0 0 0
ad4 ONLINE 0 0 0
ad6 ONLINE 0 0 0
errors: No known data errors
C’est reparti.
Le pool est en place, il faut maintenant le remplir avec un ou des systèmes de fichiers. Ceci s’opère avec la simple commande zfs. Dans l’exemple suivant, un système de fichiers zfsdata sera ajouté dans notre pool, on vérifiera sa disponibilité par un df :
# zfs create dataraid/zfsdata
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 496M 174M 282M 38% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1e 496M 16K 456M 0% /tmp
/dev/ad0s1f 71G 7.4G 57G 11% /usr
/dev/ad0s1d 1.4G 204M 1.1G 15% /var
dataraid 458G 128K 458G 0% /dataraid
devfs 1.0K 1.0K 0B 100% /var/named/dev
dataraid/backup 458G 128K 458G 0% /dataraid/backup
dataraid/zfsdata 458G 128K 458G 0% /dataraid/zfsdata
Voilà, par ce simple zfs create on a un système de fichiers exploitable. Celui-ci pourrait être supprimé avec zfs destroy dataraid/zfsdata. Cette commande zfs permet beaucoup plus, notament d’avoir des informations – très – détaillées sur le système de fichiers, grâce à zfs get all :
# zfs get all dataraid/zfsdata
NAME PROPERTY VALUE SOURCE
dataraid/zfsdata type filesystem -
dataraid/zfsdata creation Wed Dec 9 19:48 2009 -
dataraid/zfsdata used 18K -
dataraid/zfsdata available 458G -
dataraid/zfsdata referenced 18K -
dataraid/zfsdata compressratio 1.00x -
dataraid/zfsdata mounted yes -
dataraid/zfsdata quota none default
dataraid/zfsdata reservation none default
dataraid/zfsdata recordsize 128K default
dataraid/zfsdata mountpoint /dataraid/zfsdata default
dataraid/zfsdata sharenfs off default
dataraid/zfsdata checksum on default
dataraid/zfsdata compression off default
dataraid/zfsdata atime on default
dataraid/zfsdata devices on default
dataraid/zfsdata exec on default
dataraid/zfsdata setuid on default
dataraid/zfsdata readonly off default
dataraid/zfsdata jailed off default
dataraid/zfsdata snapdir hidden default
dataraid/zfsdata aclmode groupmask default
dataraid/zfsdata aclinherit restricted default
dataraid/zfsdata canmount on default
dataraid/zfsdata shareiscsi off default
dataraid/zfsdata xattr off temporary
dataraid/zfsdata copies 1 default
dataraid/zfsdata version 3 -
dataraid/zfsdata utf8only off -
dataraid/zfsdata normalization none -
dataraid/zfsdata casesensitivity sensitive -
dataraid/zfsdata vscan off default
dataraid/zfsdata nbmand off default
dataraid/zfsdata sharesmb off default
dataraid/zfsdata refquota none default
dataraid/zfsdata refreservation none default
dataraid/zfsdata primarycache all default
dataraid/zfsdata secondarycache all default
dataraid/zfsdata usedbysnapshots 0 -
dataraid/zfsdata usedbydataset 18K -
dataraid/zfsdata usedbychildren 0 -
dataraid/zfsdata usedbyrefreservation 0 -
Le détail de toutes ces informations peut être consulté à cette adresse chez Sun. A noter que les propriétés avec un tiret dans la colonne SOURCE, indiquent que celles-ci sont en lecture uniquement, alors que les autres peuvent être modifiées. Il y a trois types de SOURCE :
- default – la valeur ZFS par défaut
- local – la propriété a été modifiée localement pour ce système de fichiers
- inherited – la propriété est héritée d’un système de fichiers parent
Conclusion
Voilà une introduction à ZFS qui permet tout de même de commencer à le découvrir et l’exploiter rapidement. Une documentation complète peut être consultée ou téléchargée sur le site de Sun.
Sources :