documentation/tools/zfs.md

5.8 KiB

ZFS

ZFS c'est quoi ?

ZFS est un système de fichier avec plein de features natives, notamment de la gestion de volume, du RAID (RAID-Z), des snapshots, etc.

ZFS a été ouvert sous licence CDDL incompatible avec la GPL. Par conséquent, ZFS n'est pas supporté nativement par le noyau Linux.

Petit glossaire

  • RAID-Z#N: Le raid de ZFS. Le chiffre #N correspond au nombre de disques que l'on peut perdre (e.g. RAID-Z2 correspond à du RAID 6 classique).
  • Pool: Une pool de stockage est le bloc de base de ZFS. C'est un ensemble logique de données. Une pool ZFS est composée d'un ou plusieurs vdev.
  • Vdev: Un vdev (pour ''virtual device'') est un sous élément d'une pool. Un vdev peut contenir un ou plusieurs disques physiques. Dans le cas où plusieurs disques sont utilisés, les données sont étendues (stripped) sur tous les disques afin d'améliorer sa durée de vie.
  • Dataset: Dataset est le terme générique pour désigner un volume de fichiers ZFS. Chaque dataset a un nom unique de la forme Pool/Dataset. La racine de la pool est techniquement un dataset aussi. Les dataset sont organisés comme des dossiers classique, avec une arborescence, et les enfants héritent des propriétés des parents.

Installation

Il faut ajouter les dépots contrib de debian dans lesquels se trouvent les paquets installés ci-dessous. Pour installer le module noyau ZFS sous Debian et les outils d'administration :

apt install linux-headers-amd64
apt install zfs-dkms 

Il faut ensuite reboot pour loader le module zfs, puis :

apt install zfsutils-linux

Cela installe aussi zfs-zed un daemon permettant de monitorer les pool ZFS. Les headers du noyau doivent être installés à chaque mise à jour du noyau.

Créer une pool ZFS

La première étape de création d'un filesystem ZFS est la création d'une pool. Une pool contient des vdev qui eux même contiennent des disques, la commande suivante permet de créer une pool de nom «pool» et montée dans /pool avec un vdev en RAIDZ-3 :

zpool create -f -m /pool pool raidz3 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03494499 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03563166 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03570970 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03575828 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03614378 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03626582 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03694920 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03704580 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03707506 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03731830 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03734763 \
    ata-WDC_WD2003FYYS-02W0B0_WD-WMAY03734769

Les identifiants de disques peuvent être récupérés dans /dev/disks/by-id/

L'état des pool peut-être consulté avec la commande

zpool status

Créer un dataset

Une fois la pool créée il est préférable de créer des datasets qui permettent une gestion plus fine de la pool. Pour cela on utilise la commande suivante qui créé un dataset du nom de «home» dans la pool «pool» :

zfs create pool/home

Partager un dataset en NFS

ZFS permet de partager un dataset en NFS pour cela il faut installer le paquet nfs-kernel-server :

apt install nfs-kernel-server

Le dataset «home» de la pool «pool» peut ensuite être partager ainsi :

zfs set sharenfs="no_root_squash,rw=@172.16.10.0/24" pool/home

Cette commande partage le dataset au sous-réseau 172.16.10.0/24, l'option no_root_squash permet au root du client NFS d'avoir tous les droits sur les fichiers du dataset.

Il est également préférable d'activer les acl POSIX sur la pool, dans le cas contraire il peut y avoir des problèmes de permissions à la création de fichiers :

zfs set acltype=posixacl pool

Détruire un dataset

Pour détruire le dataset pool/path on utilise la commande

sudo zfs destroy pool/path

Désactiver le sync

Renvoyer une confirmation d'écriture sur le disque après chaque opération diminue énormément les performances du NFS. On peut dire à ZFS de mentir au NFS sur le retour des opérations sync(). Pour ça, on utilise la commande :

sudo zfs set sync=disable pool/path

Chiffrement

ZFS permet de nativement chiffrer un dataset. Attention, il faut que ça soit fait à la creation du dataset. Ça ne peut pas se changer après.

Créer un dataset chiffré

Pour créer un dataset chiffré il suffit de rajouter les options de chiffrement avec encryption=on. Il faut aussi spécifier le format de la clé (raw, hex, passphrase). Par défaut, la clé va être promptée, mais il est possible de la stocker sur le système de fichier, ou bien via une URL. L'option encryption permet aussi de spéficier l'algorithme de chiffrement à utiliser.

Par exemple:

sudo zfs create -o encryption=aes-256-gcm -o keyformat=passphrase pool/dataset

Pour vérifier que tout va bien on peut récupérer la propriété de chiffrement :

sudo zfs get encryption pool/dataset

Pour changer la clé il suffit d'utiliser la commande suivante :

sudo zfs key -c pool/dataset

qui va demander la nouvelle passphrase.

Il est aussi possible de changer la source de la clé (pour aller chercher la clé dans un fichier par exemple).

Monter/démonter un dataset chiffré

Par défaut le dataset sera monté. Pour le démonter il suffit d'utiliser la commande unmount. Attention, la clé de chiffrement sera toujours chargée, et le dataset pourra être remonté sans redemander la clé. Pour ça, il faut décharger la clé :

sudo zfs unmount pool/dataset && sudo zfs unload-key pool/dataset

Pour remonter le dataset il faut alors recharger la clé :

sudo zfs load-key pool/dataset && sudo zfs mount pool/dataset