Outils pour utilisateurs

Outils du site


zfs

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
zfs [2017/09/29 19:58] luczfs [2018/10/13 20:32] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 +====== 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 [[https://github.com/zfsonlinux/zfs/wiki/Debian|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. 
 +
 +<code bash>
 +# 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
 +</code>
 +
 +On doit pouvoir monter dans un dossier spécifique, de base ils sont à la racine ''/<pool_name>/''
 +
 +==== Alors, ces zpool ? ====
 +
 +<code bash>
 +# voir les zpool importés/montés
 +zpool list
 +# voir comment se portent les zpool
 +zpool status
 +</code>
 +
 +
 +===== dataset =====
 +
 +Et là, c'est la commande ''zfs'' qu'il faut regarder
 +
 +==== Lister, Créer, modifier, supprimer un dataset ====
 +
 +<code bash>
 +# lister les dataset
 +zfs list
 +
 +# créer un dataset
 +zfs create -o mountpoint=/path/to/dir POOL_NAME/DATASET_NAME
 +
 +
 +
 +</code>
 +
 +==== Paramètres des dataset ====
 +
 +<code bash>
 +# 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 ...
 +
 +</code>
 +
 +
 +==== snapshot ====
 +
 +Ce sont des copies en read-only d'un dataset.
 +
 +<code bash>
 +# 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 ..
 +
 +
 +</code>
 +
 +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''
 +<code>
 +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 //
 +</code>
 +
 +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''
 +<code BASH>
 +# 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
 +</code>
 +
 +et pour détruire des lots de snapshots :
 +
 +<code bash>
 +zfs list -H -o name -t snapshot | grep hourly | xargs -n1 zfs destroy
 +</code>
 +
 +==== clones ====
 +
 +Les clones sont des copies write/read du système de fichiers, uniquement créées à partir des snapshot
 +
 +<code bash>
 +# 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
 +</code>
 +
 +==== 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.
 +
 +<code bash>
 +# lancer un scrub
 +zpool scrub ZPOOL
 +
 +# arrêter un scrub
 +zpool scrub -s ZPOOL
 +</code>
 +
 +
 +==== Des trucs en vrac, à trier ====
 +
 +<code>
 +
 +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
 +
 +</code>
 +
 +<code>
 +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
 +</code>