Table des matières
zfs
Il parait que c'est LE système de fichiers ultime, avec un focus sur l'intégrité des données, les backup et très 'scalable'. Son problème : pour bien faire il faudrait de la RAM ECC…
On trouve sur le net plein de docs sur les caractéristiques et fonctionnalités de zfs, je ne vais pas revenir dessus.
Allez, un petit rappel de la hierarchie :
- vdev – les vdev regroupent des disques durs avec ou non des redondances appelées RAIDZx, x étant le nombre de disques qu'on peut perdre sans perdre le vdev. Tous les disques d'un vdev doivent avoir la même taille, à défaut le surplus d'un disque par rapport à l'autre sera perdu.
- zpool – un ou plusieurs vdev peuvent être regroupés dans des volumes appelés zpool (on peut les voir comme des partitions), rajouter un vdev rajoute de la capacité, perdre un vdev revient à perdre tout le zpool
- dataset – au sein d'un zpool, on peut créer un ou plusieurs dataset sur lesquels on peut assigner des permissions/quotas/paramètres (snapshot, scrub..) différents
En revanche, j'ai eu besoin de quelques commandes pour mettre en place mon système et j'ai eu du mal à les trouver, d'où cette section sur zfs : comment utilise-t-on en pratique zfs sur une debian ?
Installation de zfs (sur debian 9)
Il y a des petites histoires d'incompatibilités de licences entre zfs (CDDL) et linux (GPL), d'où un processus un peu tordu.
On suit le wiki de zfs_onlinux.
Il faut autoriser le dépot contrib
, puis installer les paquets linux-headers-xx
adaptés, puis zfs-dkms
.
zpool
Sans surprise, c'est la commande zpool
qu'il faut utiliser.
Créer et Importer des zpool existants
C'est la commande zpool
qu'il faut utiliser.
# liste les zpool existants sur les disques durs mais pas encore montés zpool import # l'option -d est indispensable pour ne pas utiliser l'identification via /dev/sda qui est susceptible de changer d'un boot à l'autre : zpool import -d /dev/disk/by-id # importer le zpool (et le monte automatiquement) zpool import -d /dev/disk/by-id <pool_name> # créer un zpool zpool create (-f) -m MOUNT_POINT POOL_NAME (raidzX/mirror) DISK_IDs
On doit pouvoir monter dans un dossier spécifique, de base ils sont à la racine /<pool_name>/
Alors, ces zpool ?
# voir les zpool importés/montés zpool list # voir comment se portent les zpool zpool status
dataset
Et là, c'est la commande zfs
qu'il faut regarder
Lister, Créer, modifier, supprimer un dataset
# lister les dataset zfs list # créer un dataset zfs create -o mountpoint=/path/to/dir POOL_NAME/DATASET_NAME
Paramètres des dataset
# lire un paramètre (sur un dataset / zpool) zfs get zfs get PARAMETER zfs get PARAMETER ZPOOL/DATASET # régler un paramètre zfs set ...
snapshot
Ce sont des copies en read-only d'un dataset.
# lister les snapshots zfs list -t snapshot # créer un snapshot zfs snapshot (-r) ZPOOL/DATASET # -r : recursive, tous les dataset enfants sont concernés # détruire un snapshot zfs destroy ZPOOL/SNAPSHOT # renommer un snapshot zfs rename ZPOOL/OLD_NAME_SNAPSHOT ZPOOL/NEW_NAME_SNAPSHOT # déplacer un snapshot (crée une "image stream" vers la sortie standard --> pipe) zfs send ZPOOL/SNAPSHOT > /PATH/TO/FILE # et la réciproque zfs receive ZPOOL/SNAPSHOT < /PATH/TO/FILE # Pour envoyer et recevoir en une seule commande zfs send -i ZPOOL/SNAPSHOT | ssh SERVER zfs receive ANOTHER_POOL/DATASET # pour n'envoyer que le différentiel zfs send -i ZPOOL/SNAPSHOT | ssh SERVER zfs recv ANOTHER_POOL/DATASET # pour ne récupérer qu'un seul fichier en accédant au dossier snapshot du dataset : # ''.zfs/snapshot/snapshot_name created under the file system for which snapshot was taken ls .. cp ..
Il existe la possibilité de rollback, mais c'est dangereux, on préfèrera faire des clones
auto-snapshot
Le paquet zfs-auto-snapshot
est disponible sur debian et archlinux permet de faire comme son nom l'indique des snapshot autoamatiquement et d'en faire une gestion automatique (supprimer les anciennes).
En réalité, c'est un script cron qui s'occupe de tout ça : sur debian, il est ici /etc/cron.d/zfs-auto-snapshot
PATH="/usr/bin:/bin:/usr/sbin:/sbin" */5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 // 00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 // 59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 // 59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 // 00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //
On peut aussi rajouter le paramètre -r recursive
, et –default-exclude
pour exclure les dataset dont la sauvegarde n'a pas été explicitement autorisée via le paramètre zfs com.sun:auto-snapshot
# zfs get all DATASET_NAME NAME PROPERTY VALUE SOURCE DATASET_NAME com.sun:auto-snapshot true local DATASET_NAME com.sun:auto-snapshot:monthly true local DATASET_NAME com.sun:auto-snapshot:weekly true local DATASET_NAME com.sun:auto-snapshot:hourly true local DATASET_NAME com.sun:auto-snapshot:frequent true local DATASET_NAME com.sun:auto-snapshot:daily true local
et pour détruire des lots de snapshots :
zfs list -H -o name -t snapshot | grep hourly | xargs -n1 zfs destroy
clones
Les clones sont des copies write/read du système de fichiers, uniquement créées à partir des snapshot
# créer un clone zfs clone ZPOOL/SNAPSHOT ZPOOL/DATASET/CLONE # lister les clones zfs list -r # détruire un clone zfs destroy ZPOOL/DATASET/CLONE
scrub
Pour inspecter un zpool (et le réparer automatiquement si une erreur est trouvée et qu'il y a de la redondance).
1 seul scrub n'est possible à la fois, ça consomme trop de ressources sinon.
# lancer un scrub zpool scrub ZPOOL # arrêter un scrub zpool scrub -s ZPOOL
Des trucs en vrac, à trier
Transfer ZFS Snapshot Over Network zfs send mypool/testarea@first-snapshot | gzip > /mnt/backup/snapshot.img.gz ## save snapshot as image zfs send mypool/testarea@first-snapshot | ssh host "zfs receive remotepool/blabla" ## send snaphsot to remote host zfs send -p -R ... ## transmit settings like compression zfs send mypool/testarea@first-snapshot mypool/testarea@second-snapshot ... ## send just incremental changes ## speedup receive zfs send -i mypool/testarea@first-snapshotman s | ssh host "mbuffer -s 128k -m 1G | zfs receive -F tank/pool ## speedup send & receive: # Start the receiver first. This listens on port 9090, has a 1GB buffer, and uses 128kb chunks (same as zfs): mbuffer -s 128k -m 1G -I 9090 | zfs receive data/filesystem # Now we send the data, also sending it through mbuffer: zfs send -i data/filesystem@1 data/filesystem@2 | mbuffer -s 128k -m 1G -O 10.0.0.1:9090
aptitude install zfs-auto-snapshot zfs-auto-snapshot --quiet --syslog --label=daily --keep=31 pool1/dataset1 ## make daily snapshots, keep for 31 days zfs-auto-snapshot --quiet --syslog --label=monthly --keep=12 pool1/dataset1