https://arstechnica.com/information-technology/2020/05/zfs-101-understanding-zfs-storage-and-performance/
https://unixdigest.com/articles/battle-testing-zfs-btrfs-and-mdadm-dm.html
https://openzfs.org/wiki/Newcomers
https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html
Généralités
ZFS est une architecture qui combine des fonctionnalités de gestion de volumes, et de système de fichiers.
Recommandé de conserver au moins ~10% d’espace libre (ou 500Go, le + petit des 2 devrait être ok) dans le pool pour éviter de sérieusement dégrader les performances.
Architecture
Le plus gros ensemble sous ZFS s’appelle un zpool
. Il est constitué de 1 ou plusieurs vdevs, chaque vdev étant constitué d'1 ou plusieurs périphérique (disque physique, ou éventuellement fichier).
Une fois crée, le zpool peut directement être monté en tant que système de fichier, mais il est aussi possible d’y créer des dataset
, qui peuvent eux-même être montés.
On peut aussi créer un dataset enfant sous un dataset parent, avec la possibilité d’hériter des propriétés du parent.
On peut également créer des volumes
au sein d’un zpool, qui pourra être accédé comme un périphérique bloc : il sera possible de le formater avec un autre FS (par exemple ext4).
zpool
C’est un ensemble logique complet pouvant être utilisé avec ZFS. Il est constitué de 1 ou plusieurs vdev.
Au sein d’un zpool, les données sont réparties entre les différents vdev de stockage (ou de support).
Il n’y a pas de redondance au sein d’un zpool : si un seul vdev vient à manquer, l’ensemble du zpool est perdu !
C’est au sein de chaque vdev que l’on va s’assurer d’une redondance si nécessaire.
Le zpool contient directement un dataset, qui peut être monté. Il est aussi possible d’y créer des dataset enfants et sous-enfants.
Il y a un héritage des propriétés (qui peut être modifié).
vdev
Un vdev représente une unité de stockage, au sein du zpool.
Il y’a plusieurs types de vdev, etre autres :
- ceux de stockage, qui peuvent être en simple disque, en mirror (équivalent RAID1), en RAIDZ (équivalent RAID5-6)
- ceux de support :
- CACHE
- LOG
- SPECIAL
device
dataset
snapshot
clone
Install
Recommandé de l’installer depuis les backports
Besoin de la section contrib
sudo apt install -t stable-backports zfsutils-linux zfs-dkms
Commande zpool
Permet de gérér les pools et les vdev.
Les vdev sans chemin absolu sont cherchés dans /dev/
Création d’une pool
man zpool create
De la forme
poolname = "myzpool"
sudo zpool create -m mountpoint $poolname dev1 dev2 [redundancy] dev3 dev4 [redundancy] dev5 dev6 dev7
On peut spécifier une nature de redondance pour chaque vdev, puis on spécifie les devices (ou fichiers) qui entreront dans ce vdev.
Dans le cas ci-dessus, nous aurons 4 vdev : dev1, dev2, une redondance entre dev3 et dev4, et une redondance entre dev5 et dev6.
Nous aurons probalement un message d’erreur nous informant que la redondance n’est pas régulière entre les différents vdev.
La redondance peut prendre entre autres ce valeurs : mirror
raidz1
raidz2
, raidz3
.
Cas simple : un seul périphérique :
sudo zpool create $poolname /dev/disk/by-id/ata-XXX
Note il est conseillé de choisir une méthode + fiable que /dev/sdX pour définir les vdev, car en cas de changement de lettre, il faudra supprimer le fichier /etc/zfs/zpool.cache
(ou exporter la pool) puis réimporter la pool.
ashift
Lister les pools
zpool status
Les chiffres READ WRITE et CKSUM comptent le nombre d’erreurs de chaque catégorie sur chaque vdev.
Sortir les données en json :
zpool status -j | jq
donne beaucoup d’infos détaillés sur chaque composant.
man zpool status
Beaucoup d’options intéressantes
-s
: pour identifier les vdev lents
zpool list -v -P
Permet de voir l’usage disque de chaque pool et même de chaque vdev.
Santé et remplacement d’un RAIDZ-2
Dans cet exemple, j’ai un pool constitué d’un seul vdev, lui-même constitué de 8 fichiers en RAIDZ-2 (+ facile pour tester).
J’ai volontairement corrompu ce vdev en supprimant 2 fichiers.
Lorsque l’on liste les pools et les vdev, le pool ainsi que le vdev se trouvent dans l’état DEGRADED.
Chacun des 2 devices (en l’occurence fichiers) se trouve dans l’état FAULTED.
FAULTED signifie que le device sous-jacent est toujours pris en compte dans le vdev, mais inaccessible ou défectueux (par exemple disque en panne, ou débranché, ou fichier supprimé).
Il y a aussi l’état OFFLINE, qui signifie que le device sous-jacent a été sorti du vdev, qui est en attente d’un remplacement pour ce device.
On peut volontairement passer un device en OFFLINE avec la commande :
sudo zpool offline $poolname device
Lorsqu’un device est sain (“ONLINE”), son nom/chemin est indiqué dans la sortie de zpool status
ou zpool list -v -P
.
Lorsqu’un device est absent (FAULTED ou OFFLINE), ce sera son GUID qui sera indiqué.
On peut obtenir les GUID de tous les device, même les sains, avec zpool list -v -P -g
.
Pour remplacer une disque/fichier offline ou faulted :
sudo zpool replace $poolname $oldGUID /dev/sdX
sudo zpool replace $poolname $oldGUID ./file.dat
Ça devrait automatiquement lancer un resilvering. Pendant ce temps, un device replacing-1
apparaît dans le vdev, qui a lui-même son propre GUID et est composé de l’ancien et du nouveau device.
Il peut y avoir l’erreur cannot replace OLD_GUID with sdX: sdX is busy
J’ai eu ça en essayant de réajouter un disque qui avait déjà fait partie du pool. Même après wipefs -af
sur les partitions puis sur la table de partition, le disque restait “busy”.
J’ai résolu l’erreur en réinitialisant le SSD comme ceci
Je suppose qu’en écrivant l’ensemble du SSD avec des 0 ça peut foncitonner aussi.
zpool attach / detach
zpool attach $poolname device new_device
permet d’ajouter un disque/fichier à un device.
S’il s’agit d’un miroir ou directement d’un disque, le disque sera ajouté en tant que miroir.
S’il s’agit d’un RAIDZ, le RAIDZ est agrandi en prenant en compte le nouveau disque, et en conservant son niveau fonctionnel (un raidz2 reste un raidz2, mais avec 1 disque en plus.
Pour ça, l’ensemble des données est réécrite sur le raidz
sudo zpool detach $poolname device
Permet de supprimer un disque d’un miroir ou d’un “replacing-X”.
Pool suspendu
Si un vdev vient à manquer, le pool est suspendu.
S’il est encore disponible (par exemple un disque qui a été déconnecté mais qui fonctionne correctement), il devrait de le rebrancher, puis d’entrer la commande
sudo zpool clean $poolname
ça devrait “resynchroniser” le pool, et remettre le compteur d’erreurs à 0 partout.
Dans mon expérience, même en déconnectant un disque en plein milieu d’une copie de fichier vers le pool, si on le reconnecte et que l’on cleane, le transfert se finit correctement et le fichier ne sera pas corrompu.
À condition que le chemin du device soit le même que précédemment ! D’où l’intérêt d’utiliser des chemins fixes (by-id).
Si le vdev est définitivement perdu, il ne sera pas possible de récupérer les données du pool.
Lister les propriétés d’une pool
zpool get all $poolname
ou plus finement
zpool get property1,property2 $poolname
Ajouter un vdev à une pool
zpool add $poolname device
Détacher une pool
sudo zpool export $poolname
Trouver et importer des pools inactives
sudo zpool import
va lister les pools détectés
Par défaut, ça va chercher sur les périphériques dispos dans /dev/
. Les informations concernant l’appartenance à un pool sont trouvées dans la table de partition du périphérique.
On peut spécifier un dossier ou device à chercher avec l’option -d
. Nécessaire pour importer un pool créé sur des fichiers.
sudo zpool import $poolname [newpoolname]
Permet de la rendre disponible, éventuellement en changeant son nom.
Commande zfs
Monter un dataset
zfs mount $poolname
va monter dans le chemin défini dans la propriété mountpoint
Lister les montages ZFS
zfs mount
Lister les propriétés des datasets
zfs get all [mydataset]
ou + finement
zfs get property1,property2 [mydataset]
Les propriétés dont la source est “default” sont définies à la volée, selon les valeurs par défaut (par exemple, le mountpoint sera /datasetname
).
Les propriétés définies explicitement sur le dataset auront comme source “local”, et font partie intégrante du dataset, mêem si celui-ci est branché sur une autre machine.
zfs list
man zfs list
zfs list -t all -r
Définir des propriétés des datasets
sudo zfs set property=value mydataset
ARC
RAIDZ
Le RAIDZ est un système de parité analogue au RAID (bien que fonctionnant différemment).
Le RAIDZ-1 contient 1 disque de parité (analogue au RAID5). Le RAIDZ-2 contient 2 disques de parité (analogue au RAID6).
Il existe aussi le RAIDS-3 avec 3 disque de parité.
ZFS peut aussi fonctionner en mode miroir (analogue au RAID1), mais il ne me semble pas que cette fonctionnalité soit appelée “RAIDZ”.
Deduplication
Permet d’économiser de l’espace de stockage lorsque l’on stocke plusieurs fois des blocs de données identiques.
Nécessiter beaucoup de ressources : beaucoup de RAM, et il est conseillé d’avoir des SSD dédiés pour stocker la table de dédup (DDT).
Globalement il n’est pas conseillé de l’activer, sauf cas spécifiquement adapté.
scrub :
Gérer Mémoire mac allouée :
AFS peut être gourmand en RAM
CoW et VMs
Le CoW crée une légère baisse de perf, qui peut vraiment s’amplifier pour des fichiers avec des écritures fréquentes, comme les VMs ou les BDD
voir pour désacitver CoW pour certains fihiers/dossiers/volumes ?