—
Mac OS X Leopard supportera ZFS
Un article paru sur Apple Insider a éveillé ma curiosité. D’après son auteur, les développeurs auraient reçu de la part de la firme de Cuppertino une preview de ZFS sur Mac OS X. De là à en déduire que ZFS, le file system de SUN pour Solaris pourrait un jour remplacer HFS+ l’actuel file system d’OSx, il n’y a qu’un pas que certaines personnes n’ont pas hésité à faire.
Alors ça tombe bien, parce que j’ai justement eu l’occasion de jouer un peu avec ZFS ces derniers jours, et c’est vrai que le bébé est impressionnant. S’il ne révolutionne pas vraiment les technologies actuelles, il apporte une facilité d’administration sans commune mesure, une excellente sécurisation (miroir, raid5 et raid6) des données et des possibilités d’extensibilité presque infinies.
Pour vous donner une idée plus précise de la puissance du truc, je vous fais partager ci-dessous quelques manips/tests très simples que j’ai réalisées:
- Voyons tout d’abord quels sont les disques physiques disponibles:
# cd /dev/dsk
# ls c?t?d?
c0t0d0  c0t4d0  c1t0d0  c1t4d0  c4t0d0  c4t4d0  c6t0d0  c6t4d0  c7t0d0  c7t4d0
c0t1d0  c0t5d0  c1t1d0  c1t5d0  c4t1d0  c4t5d0  c6t1d0  c6t5d0  c7t1d0  c7t5d0
c0t2d0  c0t6d0  c1t2d0  c1t6d0  c4t2d0  c4t6d0  c6t2d0  c6t6d0  c7t2d0  c7t6d0
c0t3d0  c0t7d0  c1t3d0  c1t7d0  c4t3d0  c4t7d0  c6t3d0  c6t7d0  c7t3d0  c7t7d0
>> ok, nous avons de quoi faire…
- Création d’un storage pool simple (groupe de disques physiques, ici 1 seul disque):
# zpool create mypool1 c0t0d0
# df -h /mypool1
Système de fichiers  taille utilisé  dispo capacité  Monté sur
mypool1                457G     1K   457G     1%    /mypool1
# mkfile 1g /mypool1/foo
# df -h /mypool1
Système de fichiers  taille utilisé  dispo capacité  Monté sur
mypool1                457G   1,0G   456G     1%    /mypool1
>> nous constatons ici la simplicité de mise en oeuvre: pas de point de montage à créer, pas de montage à réaliser, pas de file system à initialiser, tout est automatique dès la création du storage pool.
- Vérifions comment tout cela se présente:
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool1                 464G   1,00G    463G     0%  ONLINE     -
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool1               1,00G   456G  1,00G  /mypool1
>> donc, il y a un file system ZFS qui est automatiquement associé à notre storage pool
- Jouons avec les file systems:
# zfs create mypool1/toto
# zfs create mypool1/titi
# zfs create mypool1/tutu
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool1               1,00G   456G  1,00G  /mypool1
mypool1/titi          24,5K   456G  24,5K  /mypool1/titi
mypool1/toto          24,5K   456G  24,5K  /mypool1/toto
mypool1/tutu          24,5K   456G  24,5K  /mypool1/tutu
#  zfs set mountpoint=/users mypool1
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool1               1,00G   456G  1,00G  /users
mypool1/titi          24,5K   456G  24,5K  /users/titi
mypool1/toto          24,5K   456G  24,5K  /users/toto
mypool1/tutu          24,5K   456G  24,5K  /users/tutu
# zfs set quota=20G mypool1/tutu
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool1               1,00G   456G  1,00G  /users
mypool1/titi          24,5K   456G  24,5K  /users/titi
mypool1/toto          24,5K   456G  24,5K  /users/toto
mypool1/tutu          24,5K  20,0G  24,5K  /users/tutu
>> nous créons toujours aussi simplement 3 file systems qui vont se partager le volume global du storage pool
>> puis nous modifions le point de montage associé au storage pool qui se répercute automatiquement sur les file systems
>> enfin, nous limitons à 20G le file system tutu… enfantin, non ?
- Détruisons un peu:
# zfs destroy mypool1/tutu
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
mypool1               1,00G   456G  1,00G  /users
mypool1/titi          24,5K   456G  24,5K  /users/titi
mypool1/toto          24,5K   456G  24,5K  /users/toto
# zpool destroy mypool1
# zpool list
aucun pool disponible
# zfs list
aucun jeu de données disponible
>> on détruie d’abord uniquement le file system tutu
>> puis l’ensemble du storage pool mypool1, on constate alors que les file systems associés sont, de fait, détruits eux aussi
- Créons un pool « mirroré »:
# zpool create mypool2 mirror c0t0d0 c1t0d0
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool2                 464G   52,5K    464G     0%  ONLINE     -
# zpool status -v mypool2
pool : mypool2
état : ONLINE
purger : aucun requis
configuration :
NAME        STATE     READ WRITE CKSUM
mypool2     ONLINE       0     0     0
mirror    ONLINE       0     0     0
c0t0d0  ONLINE       0     0     0
c1t0d0  ONLINE       0     0     0
erreurs : aucune erreur de données connue
>> nous créons ici ce qu’on appelle un miroir two-way: tout ce qui est écrit sur un élément du miroir est dupliqué de façon synchrone sur l’autre élément. (il est aussi possible de faire du three-way, même chose mais duplication sur 2 éléments au lieu d’un seul)
>> nous constatons donc que le volume total du file system est de 464G soit la taille d’un seul disque physique puisque le deuxième sert de copie
- Augmentons nos espaces disponibles:
# zpool add mypool2 mirror c4t0d0 c6t0d0
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool2                 928G   3,00G    925G     0%  ONLINE     -
# zpool status -v mypool2
pool : mypool2
état : ONLINE
purger : aucun requis
configuration :
NAME        STATE     READ WRITE CKSUM
mypool2     ONLINE       0     0     0
mirror    ONLINE       0     0     0
c0t0d0  ONLINE       0     0     0
c1t0d0  ONLINE       0     0     0
mirror    ONLINE       0     0     0
c4t0d0  ONLINE       0     0     0
c6t0d0  ONLINE       0     0     0
erreurs : aucune erreur de données connue
>> nous attachons ici un autre miroir au premier. les données seront donc partagées (stripée) sur les 2 premiers éléments de chacun des miroirs.
>> le volume utile a doublé passant de 460 à 920Go
- Créons un pool RAID:
# zpool create mypool3 raidz c0t1d0 c1t1d0 c4t1d0 c6t1d0 c7t1d0
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
mypool3                2,27T    137K   2,27T     0%  ONLINE     -
# zpool status -v mypool3
pool : mypool3
état : ONLINE
purger : aucun requis
configuration :
NAME        STATE     READ WRITE CKSUM
mypool3     ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c0t1d0  ONLINE       0     0     0
c1t1d0  ONLINE       0     0     0
c4t1d0  ONLINE       0     0     0
c6t1d0  ONLINE       0     0     0
c7t1d0  ONLINE       0     0     0
erreurs : aucune erreur de données connue
# df -h /mypool3
Système de fichiers  taille utilisé  dispo capacité  Monté sur
mypool3                1,8T    39K   1,8T     1%    /mypool3
# zpool add mypool3 spare c0t2d0
# zpool status mypool3
pool : mypool3
état : ONLINE
purger : aucun requis
configuration :
NAME        STATE     READ WRITE CKSUM
mypool3     ONLINE       0     0     0
raidz1    ONLINE       0     0     0
c0t1d0  ONLINE       0     0     0
c1t1d0  ONLINE       0     0     0
c4t1d0  ONLINE       0     0     0
c6t1d0  ONLINE       0     0     0
c7t1d0  ONLINE       0     0     0
spares
c0t2d0    AVAIL
erreurs : aucune erreur de données connue
# zpool offline mypool3 c1t1d0
Mise hors ligne du périphérique c1t1d0
# zpool status mypool3
pool : mypool3
état : DEGRADED
état : un ou plusieurs périphériques ont été mis hors ligne par l'administrateur.
Il existe un nombre suffisant de répliques pour que le pool continue à fonctionner dans un a
état endommagé.
action : mettez en ligne le périphérique en utilisant 'zpool online' ou remplacez-le avec
'zpool replace'.
purger : aucun requis
configuration :
NAME        STATE     READ WRITE CKSUM
mypool3     DEGRADED     0     0     0
raidz1    DEGRADED     0     0     0
c0t1d0  ONLINE       0     0     0
c1t1d0  OFFLINE      0     0     0
c4t1d0  ONLINE       0     0     0
c6t1d0  ONLINE       0     0     0
c7t1d0  ONLINE       0     0     0
spares
c0t2d0    AVAIL
erreurs : aucune erreur de données connue
# zpool replace mypool3 c1t1d0 c0t2d0
# zpool status mypool3
pool : mypool3
état : DEGRADED
état : un ou plusieurs périphériques ont été mis hors ligne par l'administrateur.
Il existe un nombre suffisant de répliques pour que le pool continue à fonctionner dans un a
état endommagé.
action : mettez en ligne le périphérique en utilisant 'zpool online' ou remplacez-le avec
'zpool replace'.
purger : resilver completed avec des erreurs 0 sur Tue Oct  9 16:23:24 2007
configuration :
NAME          STATE     READ WRITE CKSUM
mypool3       DEGRADED     0     0     0
raidz1      DEGRADED     0     0     0
c0t1d0    ONLINE       0     0     0
spare     DEGRADED     0     0     0
c1t1d0  OFFLINE      0     0     0
c0t2d0  ONLINE       0     0     0
c4t1d0    ONLINE       0     0     0
c6t1d0    ONLINE       0     0     0
c7t1d0    ONLINE       0     0     0
spares
c0t2d0      INUSE     currently in use
erreurs : aucune erreur de données connue
>> création d’un storage pool en RAID5 (pour faire du RAID6, il suffit de remplacer raidz par raidz2 dans la commande de création)
>> nous constatons que la volumétrie totale du storage pool est de 2,27To mais que le volume utile n’est que de 1,8To, l’un des disques étant utilisé pour la parité (2 disques en RAID6)
>> nous ajoutons un disque de spare pour augmenter la sécurité et nous testons le tout en faisant tomber un disque… (ici la manip est manuelle, mais dans le cas d’une véritable erreur, la bascule sur le HotSpare est automatique)
Voila pour donner un premier aperçu des possibilités. Reste à voir comment tout cela sera implémenté dans OSx…
