6.3 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=disabled pool/path
Changer un disque
Récupérer le guid du disque qu'on souhaite changer avec zdb
(zpool status
peut aider à récuperer le nom du disque concerné). Une fois que c'est fait
on peut retirer le disque avec : zpool offline pool ${guid}
puis on remplace
l'ancien disque par le nouveau :
zpool replace pool ${guid} ${nouveau disque}
.
Après ça, on peut monitorer la reconstruction avec zpool status
.
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