Outils pour utilisateurs

Outils du site


zfs

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
zfs.txt · Dernière modification : 2018/10/13 20:32 de 127.0.0.1