====== 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. # 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 # 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 ''//'' ==== 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