ZFS

Mise en place et utilisation de ZFS

Avec l’augmentation de la quantité de données à stocker, le volume nécessaire est souvent plus grand qu’un seul disque et nécessite des sauvegardes ou d’un moyen sécurisé de stocker des données. L’idéal est d’avoir un seul gros disque virtuel formé de plusieurs disques physiques auquel on accède de manière transparente.

Il existe plusieurs mécaniques et couches logicielles mais la plus fiable et la plus souple reste ZFS.

ZFS est un système de fichier 128 bits qui permet de stocker de manière sécurisée un grand nombre de données, un grand nombre de fichiers et est capable de gérer la tolérance de pannes grâce au RAID.

Le terme RAID a été défini en 1987 par l'Université de Berkeley, dans un article nommé A Case for Redundant Arrays of Inexpensive Disks (RAID), soit « matrice redondante de disques peu onéreux ». Aujourd'hui, le mot est devenu l'acronyme de Redundant Array of Independent Disks, ce qui signifie matrice redondante de disques indépendants, car le coût au mégaoctet de tous les disques durs a diminué d'un facteur 1 300 000 en 29 ans, ce qui fait choisir le RAID pour d'autres raisons.1

Cependant, lorsqu'on voit le prix du matériel professionnel gérant du RAID, on constate rapidement qu'il n'est pas à portée de toutes les bourses, surtout à partir de 5 disques.

Dans cet article, nous retiendrons donc surtout RAID comme étant matrice redondante de disques peu onéreux.

Problématique

Si vous avez plusieurs disques USB (ou autre) pour stocker vos données, il est vivement recommandé de tout rassembler sur une seule machine, notamment pour disposer des données au même endroit et ne plus avoir à chercher sur quel disque est placé tel ou tel fichier (et comme l’indique la loi de Murphy, il est forcément sur le dernier disque, quel que soit l’ordre choisi).

Construire un serveur de stockage (baie de disque ou plus communément NAS) est aisé et plus économique que les solutions du marché, tout en étant aussi fiable.

Sur ce serveur, le choix le plus souple et le plus puissant consiste à utiliser ZFS, au moins pour la partie stockage des données. En fonction du nombre de disques, la stratégie n’est pas la même.

Configurations

1 seul disque

Pas d’autre solution possible que du ZFS stockage de base, sans redondance.

Le stockage sans redondance réalise un seul disque virtuel à partir des disques définis. Mais si un disque plante, c’est tout le pool qui est corrompu (car un fichier est réparti sur les différents disques). Il est donc conseillé d’effectuer au moins du mirror.

Capacité disponible

La capacité disque disponible dans cette configuration est égale à la capacité du disque utilisé.

2 disques

ZFS en mode mirror.

Les données sont juste copiées en parallèle sur un autre disque (ou une autre série de disques). En cas de plantage d’un disque, les données sont toujours disponibles sur un autre disque.

Capacité disponible

La capacité disque disponible dans cette configuration est égale à la capacité d'un seul des deux disques. Si les deux disques sont de tailles différentes, il s'agit de la capacité du plus petit des deux.

3 disques et plus

ZFS en mode raid (raidz1 ou raidz2). Sun recommande cependant de ne pas employer plus de 9 disques par pool de stockage.

C'est le mode le plus sécurisé et le plus complet qui répartit le contenu d’un disque sur les autres. En cas de plantage, le replacement du disque permet de restaurer les données perdues. Le processus de remplacement peut même être automatique grâce au disque de réserve.

Le raidz1 permet en plus de réaliser un mode raid + 1 disque de parité séparé. Il permet la corruption d'un seul disque maximum à la fois.

Le mode raidz2 permet de réaliser un mode raid + 2 disques de parité séparés. Il permet la corruption jusqu'à 2 disques maximum à la fois.

Le disque de parité (la parité est obligatoirement sur un disque séparé) permet de contrôler l’intégrité des données écrites et de les reconstituer le cas échéant.

Attention !

Attention, il n’est pas possible de créer un mode et de le convertir ensuite en un autre. Pour réaliser une conversion, il faut créer un second pool puis copier les données du premier vers le deuxième avant de supprimer l’ancien (et de réaffecter les disques).

Le plus simple est donc de réaliser à l’origine la configuration nécessaire.

Il est vivement conseillé d’utiliser la méthode raidz pour disposer de toute la puissance de ZFS.

Il est aussi déconseillé d’utiliser ZFS par-dessus un autre système de fichier. Employer donc directement ZFS sur des disques formatés en ZFS.

Capacité disponible

La capacité disque disponible dans cette configuration est égale à la capacité de N-1 disques. Si les plusieurs disques sont de tailles différentes, il s'agit la capacité de N-1 fois le plus petit.

Construction du serveur

Contraintes

Les recommandations de SUN sont :

  • au moins 768Mo de RAM (1Go de RAM conseillé);

  • 3 disques au minimum (contrainte due au RAID) de taille équivalente (pour exploiter l'espace disque de manière optimale).

Cependant, à l'usage, il devient évident qu'il faut disposer d'une machine avec suffisamment de ressources processeur pour exploiter pleinement le ZFS. Si la machine n'est pas assez puissante, il y aura un phénomène de saturation :

Phénomène de saturation
Phénomène de saturation

Le débit réseau est très limité (par rapport au 1Gb/s disponible) et instable.

Côté serveur, une commande top permet de voir que idle est égal à 0, c'est que le processeur à tellement de choses à faire qu'il n'a pas le temps d'attendre. Le processeur n'est pas assez puissant.

Une machine 32 bits ne sera pas suffisante. D'ailleurs, une simple consultation dmesg vous en donnera un aperçu :

ZFS NOTICE: Prefetch is disabled by default on i386 -- to enable,
            add "vfs.zfs.prefetch_disable=0" to /boot/loader.conf.
ZFS WARNING: Recommended minimum kmem_size is 512MB; expect unstable behavior.
             Consider tuning vm.kmem_size and vm.kmem_size_max
             in /boot/loader.conf.
ZFS filesystem version 13
ZFS storage pool version 13

ZFS le dit lui-même : une architecture i386 peut avoir un comportement instable. Optez directement pour un modèle 64 bits, avec 2 Go minimum de RAM.

Matériel

Remarque

Le matériel utilisé sera en partie du matériel recyclé car un serveur de disque ne nécessite pas une bête de course, même si la restauration d'un disque nécessite de nombreux calculs.

Tout le matériel nécessaire repose sur deux paramètres essentiels :

  • La capacité de stockage recherchée

  • La capacité optimale d'un disque, c'est-à-dire le meilleur rapport capacité/coût du moment.

Calcul du nombre de disques

Pour notre exemple, nous aurons besoin d'un serveur disposant de 10 To de mémoire de masse.

Le meilleur rapport capacité/coût du moment est obtenu pour les disques de 1,5 To. Leur consommation est de 6 W en pleine charge. Ce qui fait qu'il faudra le stockage de 7 disques de 1,5 To.

Ce qui fait 8 disques nécessaires (7 disques plus le disque de parité).

La capacité nominale du serveur sera de 10,5 To (7*1,5).

A cela, il faut ajouter un disque de parité et il restera même de la place pour un disque de réserve.

Pour le serveur en lui-même, il faudra un disque système. Un petit disque, même IDE, suffira largement, ainsi qu'un autre petit disque, de quelques Go, utilisé par ZFS comme cache disque. Ces deux disques, seront des disques de récupération.

Particularité

Sur les vieilles machines, il convient de pouvoir améliorer un peu les performances en utilisant un disque système séparé performant. Ce disque sera en réalité une carte Compact Flash, ayant un débit en lecture et un temps d'accès moyen plus élevés qu'un disque IDE classique. Cela permet, de plus, de ne pas monopoliser d'emplacement disque de stockage et de laisser cet espace aux données.

Cette carte CF peut être remplacée par une clef USB si la carte mère est capable de booter dessus.

Calcul de la puissance requise

La consommation électrique de cette machine est :

  • disques de données : 9*6 W = 54W ;

  • disque système : 12 W (moins si c'est un disque récent);

  • disque de cache : 12 W (moins si c'est un disque récent);

  • carte mère : 20 W

  • processeur : 65 W (en fonction du processeur);

  • 40 W pour le reste (carte réseau, ventilateurs, cartes controlleur, etc.)

Soit un total de 185 W. Une alimentation de 250 W est suffisante (sauf sur conseil du contructeur de votre matériel).

Matériel nécessaire

Ces contraintes imposent :

  • carte mère 64 bits, gérant le S-ATA de préférence, avec 2 ports PCI au minimum afin de pouvoir ajouter des controlleurs S-ATA bon marché (si la carte mère ne gère pas le SATA, adapter en fonction du contexte);

  • si pas de port RJ45 présent sur la carte mère, 1 carte réseau éthernet gigabit (ou plusieurs pour augmenter le débit si le réseau le nécessite. Dans ce cas, augmenter le nombre de port PCI en conséquence);

  • 2 cartes controlleur PCI 4*SATA (plus ou moins, en fonction du nombre de port SATA gérés par la carte mère) : 9 disques SATA à gérer;

  • boîtier capable de supporter un grand nombre de disque;

  • une alimentation de 250W. Pour des raisons de consommation d'énergie, une alimentation récente 80+ est conseillée. En fonction de la carte mère, le constructeur peut conseiller d'utiliser une alimentation plus puissante encore pour des raisons de stabilité.

Coût du matériel de base

Le matériel de base correspond à ce qu'il faut pour monter le serveur et le lancer, en dehors des disques dont le nombre peut être modulé, qui peuvent être remplacés, etc.

La configuration de base comprend tout ce qu'il faut pour démarrer un serveur avec la configuration minimale (sans ZFS), sachant que le matériel supplémentaire peut être ajouté au fur et à mesure.

Nous considérerons que nous construisons la machine à partir de rien. Bien entendu, si du matériel est recyclé et réutilisé, il faudra le déduire ou adapter la configuration en conséquence.

La configuration de base (sans les disques de stockage) coûte donc :

Libellé

nombre

montant unitaire (€)

total (€)

boîtier 9 baies Cooler Master

1

60

60

adapateur baie (cooler Master) 3-->4
(pour passer de 9 à 12 disques)

1

15

15

carte réseau gigabit éthernet

0 (inclus dans la carte mère)

25

0

carte controlleur SATA Promise PCI
(4 disques SATA par carte)
(câbles SATA fournis avec la carte)

0 (5 ports S-ATA présents sur la carte mère)

75

0

carte mère

1

60 (entrée de gamme)

60

processeur 64 bits

1

75

75

RAM : barrette DDR3, 2Go
(en fonction de la carte mère)

1

50

50

disque système
(disque S-ATA 750 Go)

1

55

55

Total

315

La configuration complète comprend tout ce qu'il faut pour charger un pool complet de disques.

La configuration complète de base (sans les disques de stockage) coûte donc :

Libellé

nombre

montant unitaire (€)

total (€)

boîtier 9 baies Cooler Master

1

60

60

adapateur baie (cooler Master) 3-->4
(pour passer de 9 à 12 disques)

3

15

45

carte réseau gigabit éthernet

0 (incluse dans la carte mère)

25

0

carte controlleur SATA Promise PCI
(4 disques SATA par carte)
(câbles SATA fournis avec la carte)

2

75

150

carte mère

1

60 (entrée de gamme)

60

processeur 64 bits

1

75

75

RAM : barrette DDR3, 2Go
(en fonction de la carte mère)

1

50

50

disque système
(disque S-ATA 750 Go)

1

55

55

Total

495

Remarque !

Comme pour les disques, le nombre de cartes controlleur peut être modulé en fonction du nombre de disques nécessaires. Si le serveur commence avec 3 ou 4 disques, il ne sera pas nécessaire d'acheter 3 cartes d'un seul coup. Cependant, il ne faut pas oublier que le marché évoluant assez rapidement, la technologie pourra être remplacée par une autre et les cartes (PCI, etc.) devenir de plus en plus difficiles à trouver.

À partir de là, le reste dépend de l'objectif, de la capacité de stockage nécessaire et du coût.

Cependant, il n'est pas nécessaire de remplir la machine dès le départ. On peut commencer avec le nombre minimal de disque puis ajouter le reste au fur et à mesure, en fonction du besoin.

À partir de cette configuration de base, il ne reste plus qu'à ajouter les disques en fonction du besoin...

Configuration minimale

La configuration minimale pour le RAID-Z est 3 disques (2 disques de redondance + 1 disque de parité), pour un espace de stockage de 2 disques.

Le total sera donc de 2 * 80 € = 240 €

Configuration minimale recommandée

La configuration minimale recommandée comprend 2 disques de redondance, 1 disque de parité et un disque de réserve soit 4 disques, pour un espace de stockage de 2 disques.

Le total sera donc de 4 * 80 € = 320 €

Configuration maximale

La configuration maximale de stockage dépend de l'espace disponible dans la machine. Ici, 12 emplacements, moins 2 pour les disques système et cache (disques de récupération), soit 10 emplacements, pour un espace de stockage de 9 disques.

Le total sera donc de 10 * 80 € = 800 €

Configuration maximale recommandée

La configuration maximale recommandée de stockage dépend de l'espace disponible dans la machine. Ici, 12 emplacements, moins 2 pour les disques système et cache (disques de récupération), soit 10 emplacements. Nous en conserverons 1 pour un disque de réserve, pour un espace de stockage de 8 disques.

Le total sera donc de 10 * 80 € = 800 €

A ce niveau, nous disposons d'une belle machine capable de rivaliser avec le matériel du marché, pour moins cher et tout aussi performante.

Boîtier Cooler Master avec ses extensions, de profil...
Boîtier Cooler Master avec ses extensions, de profil...
Boîtier Cooler Master avec ses extensions, de face.
Et de face

Configuration du serveur

Un système ZFS en configuré en deux temps. Tout d'abord le système de base chargé de motoriser la machine et de gérer la partie logicielle (ZFS), l'autre partie concerne ZFS en lui-même.

Configuration du système de base

Le système d'exploitation employé sera FreeBSD 8.0 car c'est un système ouvert, gratuit (développé par l'Université de Berkeley, encore elle !) et le ZFS y est intégré en mode de production.

Dans notre cas, pour des raisons de performances, nous avons opté pour l'utilisation de deux disques. Un pour la racine, l'autre pour /usr, /tmp, /var, /dev et le swap système.

Répartition des disques

Disque racine :

La totalité du disque sera employé pour la racine, soit le système FreeBSD, même si celui-ci ne requiert que 500 Mo au maximum.

Il sera conseillé par la suite de protéger ce disque contre les modifications en modifiant le fichier /etc/fstab :

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad0s1a             /               ufs     ro              1       1

Remarque !

En protégeant le disque système contre les modifications, le fichier fstab est alors lui aussi protégé en écriture. Le passage en mode lecture seule semble alors irréversible.

Heureusement, il est possible de modifier cet état sans passer par le fichier fstab et de revenir à un état lecture/écriture, uniquement par les commandes :

# mount -uw partition

Puis de revenir au mode lecture seule :

# mount -ur partition

Après l'installation, la configuration et le verrouillage du disque, il faudra effectuer une référence du système grâce à mtree afin d'avoir une vision du système à l'origine et de pouvoir contrôler toute modification inhabituelle (en cas de corruption).

Second disque :

La configuration par défaut de FreeBSD pour ce disque est plus que suffisante.

Configuration des services de base

Pour les services de base, nous activerons FTP et SSH, de façon à libérer la machine du clavier et de l'écran une bonne fois pour toutes.

Compilation

Même si cela n'est pas nécessaire, pour alléger le noyau et améliorer un peu ses performances, nous compilerons un noyau sur mesure.

Cette compilation désactivera tout ce qui n'est pas nécessaire (par exemple tous les pilotes de cartes réseau qui ne sont pas sur le système, ou bien le wifi, etc.). En cas de doute sur un matériel ou une option, il vaut mieux la laisser.

Pour des raisons de sécurité, nous ajouterons un pare-feu au noyau et nous désactiverons tous les outils qui ne seront pas nécessaires (par exemple sendmail, etc.) grâce à une configuration plus pointue du make.conf et src.conf et des options WITHOUT_xx.

Les directives de compilation sont disponibles sur le site officiel.

Configuration de ZFS

Comme nous l'avons vu, un système ZFS raidz nécessite au minimum 3 disques. Pour une utilisation optimale, ces trois disques ont la même taille.

Nous commencerons donc avec trois disques, puis nous ajouterons des disques au fur et à mesure du besoin.

Configuration initiale

Au niveau du système, la seule chose à faire est d'ajouter une ligne dans le fichier /etc/rc.conf :

zfs_enable="YES"

puis, soit de redémarrer le système, soit de le lancer directement :

# zfs start

Remarque

Si le noyau a été compilé avec les options ZFS, alors le service est lancé automatiquement au démarrage et il n'est pas nécessaire de de configurer dans /etc/rc.conf.

A partir de là, le reste de la configuration et de la gestion des disques sera exécutée sous ZFS, de la façon suivante :

# zfs [commande] [options] ...

Optimalisation du débit

Avec la configuration de base et 2 Go de RAM, le débit subissait encore un effet yoyo. Afin d'obtenir un transfert constant, certains paramètres ont été modifiés comme suit :

vm.kmem_size_max="1024M"
vm.kmem_size="1024M"
vfs.zfs.arc_max="500M"
vfs.zfs.txg.timeout=10

Le paramètre de plus sensible étant arc_max, il vaut mieux manipuler celui-ci afin d'affiner les performances.

Création du pool

un petit dmesg permet de déterminer les disques ajoutés :

# dmesg

...
ad4: 1430799MB <SAMSUNG HD154UI 1AG01118> at ata2-master SATA300
ad6: 1430799MB <SAMSUNG HD154UI 1AG01118> at ata3-master SATA300
ad8: 1430799MB <SAMSUNG HD154UI 1AG01118> at ata4-master SATA300
...

Créons un pool nommé pool1 de type raidz1 :

# zpool create pool1 raidz /dev/ad4 /dev/ad6 /dev/ad8

Puis vérifions qu'il a bien été créé :

# df
Filesystem  1K-blocks    Used      Avail Capacity  Mounted on
/dev/ad0s1a    3793158 305760    3183946     9%    /
devfs                1      1          0   100%    /dev
/dev/ad2s1e     507630     14     467006     0%    /tmp
/dev/ad2s1f   11149374 916898    9340528     9%    /usr
/dev/ad2s1d    1633166    392    1502122     0%    /var
pool1       2881127936      0 2881127936     0%    /pool1

Nous retrouvons bien notre disque virtuel de taille 3 To (N-1 disque de 1,5 To).

Et le détail technique du pool :

# zpool status pool1
  pool: pool1
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool1       ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad4     ONLINE       0     0     0
            ad6     ONLINE       0     0     0
            ad8     ONLINE       0     0     0

errors: No known data errors

Ajout d'un disque de cache

Performances

Pour l'amélioration des performances de la baie de disques, le cache pourra être constitué de disque SSD.

Nous avions réservé un petit disque (ici ad3) afin qu'il puisse servir de cache pour ZFS. Ajoutons ce disque :

# zpool add pool1 cache /dev/ad3
# zpool status pool1
  pool: pool1
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool1       ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad4     ONLINE       0     0     0
            ad6     ONLINE       0     0     0
            ad8     ONLINE       0     0     0
        cache
          ad3       ONLINE       0     0     0

errors: No known data errors

Remarque

Le cache n'augmente pas la taille du pool.

Remarque

Seuls les disques de cache et de log peuvent être ajoutés et supprimé d'un pool grâce aux commandes add/remove. Pour les autres disques, c'est plus compliqué...

Découpage

ZFS permet de réaliser des découpage d'un pool. Ce découpage apparaît comme un nouveau disque.

Par exemple, créons un découpage home sur ce nouveau disque :

# zfs create pool1/home

Et vérifions la création du répertoire :

# cd /pool1
# ls -l
total 2
drwxr-xr-x  2 root  wheel  2 Jul  2 20:10 home

Et vérifions le découpage au niveau du système :

# df
Filesystem  1K-blocks    Used      Avail Capacity  Mounted on
/dev/ad0s1a    3793158 305760    3183946     9%    /
devfs                1      1          0   100%    /dev
/dev/ad2s1e     507630     14     467006     0%    /tmp
/dev/ad2s1f   11149374 916898    9340528     9%    /usr
/dev/ad2s1d    1633166    390    1502124     0%    /var
pool1       2881127936      0 2881127936     0%    /pool1
pool1/home  2881127936      0 2881127936     0%    /pool1/home

Nous remarquons la présence du répertoire /pool1/home accessible comme un disque.

Déplaçons tout le contenu de /usr/home dans /pool1/home :

# mv * /pool1/home/

Puis détruisons /home et recréons un lien vers le nouveau répertoire /pool1/home :

cd /usr
# rm home
# ln -s /pool1/home

Le répertoire /home est désormais déplacé sur le disque virtuel protégé par redondance...

Il ne reste plus qu'à utiliser la machine comme avant et configurer les services nécessaires (samba, NFS, etc.)

Maintenance du serveur

Ajout d'un disque à un pool

Seuls les disques de cache et de log peuvent être ajoutés ou supprimés à la volée. Pour les autres disques, ZFS n'autorise un ajout ou une suppression que sur des périphériques virtuels (vdev). L'ajout standard se passe de la façon suivante :

Au départ, nous avons un pool de 3 disques...

# zpool status pool1
  pool: pool1
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool1       ONLINE       0     0     0
          raidz1    ONLINE       0     0     0
            ad4     ONLINE       0     0     0
            ad6     ONLINE       0     0     0
            ad8     ONLINE       0     0     0

			errors: No known data errors

auquel nous voulons ajouter du disque (raidz1). Comme nous l'avons vu, le raidz1 nécessite au moins 3 disques. Il faut donc ajouter au minimum 3 disques pour ajouter des disques à un pool raidz existant. Soit :

# zpool add pool1 raidz ad10 ad12 ad14
# zpool status pool1
  pool: pool1
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        pool1       ONLINE       0     0     0
         raidz1     ONLINE       0     0     0
            ad4     ONLINE       0     0     0
            ad6     ONLINE       0     0     0
            ad8     ONLINE       0     0     0
	  raidz1     ONLINE       0     0     0
            ad10    ONLINE       0     0     0
            ad12    ONLINE       0     0     0
            ad14    ONLINE       0     0     0

			errors: No known data errors

Pour ajouter juste un seul disque à un pool existant, il faudrait réaliser l'opération suivante :

  1. Sauvegarder le pool.

  2. Détruire le pool ( zpool destroy ...).

  3. Recréer le pool avec le disque supplémentaire.

  4. Restaurer la sauvegarde.

Il faudrait pour cela disposer de suffisamment d'espace disque pour effectuer la sauvegarde, ou disposer d'un autre serveur de stockage de même type. Cette opération pourrait être réaliser dans le car d'une migration (changement de serveur). Mais il serait plus économique d'ajouter un nouveau périphérique virtuel au pool.

Supprimer un disque d'un pool

A part un disque de log ou de cache, cette opération est impossible, à moins d'utiliser la même méthode de migration que pour l'ajout d'un disque.

ZFS