TL;DR — Résumé Rapide
Les snapshots ZFS offrent une protection instantanée. Apprenez pools, datasets, rollback, réplication send/receive et automatisation avec sanoid en production.
Les snapshots ZFS offrent une protection des données quasi instantanée et économe en espace qu’aucun outil de sauvegarde traditionnel ne peut égaler au niveau du système de fichiers. Ce guide couvre les fondamentaux de ZFS jusqu’aux politiques de rétention automatisées avec sanoid.
Prérequis
- Serveur Linux avec Ubuntu 22.04/24.04, Debian 12 ou RHEL 9/Fedora
- Un ou plusieurs périphériques de bloc
- Accès root ou sudo
- Familiarité de base avec la ligne de commande Linux
Fondamentaux de ZFS
Copy-on-Write (CoW): ZFS ne surécrit jamais les données existantes. Lorsqu’un bloc change, ZFS écrit la nouvelle version à un nouvel emplacement et met à jour le pointeur. L’ancien bloc reste jusqu’à la validation de la transaction. C’est pourquoi les snapshots sont instantanés.
Pools, vdevs et datasets:
- Un pool (
zpool) est le conteneur de stockage de niveau supérieur. - Un vdev définit la redondance: disque unique,
mirror,raidz,raidz2ouraidz3. - Un dataset est un système de fichiers montable dans le pool.
Checksums et autocorrection: Chaque bloc stocke un checksum. En lecture, ZFS le vérifie et, si le pool a de la redondance, répare automatiquement les blocs corrompus.
Création de Pools ZFS
# Ubuntu / Debian
sudo apt install zfsutils-linux -y
# Mirror (équivalent RAID-1)
sudo zpool create tank mirror /dev/sdb /dev/sdc
# RAIDZ2 (équivalent RAID-6) — recommandé pour la production
sudo zpool create tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# Vérifier l'état
zpool status tank
Gestion des Datasets
# Créer un dataset avec point de montage personnalisé
zfs create -o mountpoint=/srv/web tank/web
# Compression LZ4 (presque toujours bénéfique)
zfs set compression=lz4 tank/data
# Quota — limite stricte sur la taille du dataset
zfs set quota=500G tank/data
# Ajuster recordsize pour les bases de données
zfs set recordsize=16K tank/databases
# Lister les propriétés
zfs get compression,quota,recordsize tank/data
Snapshots: Création et Gestion
# Snapshot d'un dataset (convention: @AAAA-MM-JJ)
zfs snapshot tank/data@2026-03-23
# Snapshot récursif — capture le dataset et tous ses enfants simultanément
zfs snapshot -r tank@2026-03-23T03:00
# Snapshot avec étiquette descriptive
zfs snapshot tank/data@avant-mise-a-jour-nginx
# Lister tous les snapshots
zfs list -t snapshot
# Afficher l'espace utilisé par chaque snapshot
zfs list -t snapshot -o name,used,referenced,written tank/data
Rollback
# Rollback vers le snapshot le plus récent
zfs rollback tank/data@2026-03-23
# Rollback à travers des snapshots intermédiaires (détruit tout l'intermédiaire)
zfs rollback -r tank/data@avant-mise-a-jour-nginx
Avertissement:
zfs rollback -rdétruit TOUS les snapshots intermédiaires entre la cible et l’état actuel. Créez un clone de l’état actuel si vous pourriez avoir besoin de ces données.
Clones: Alternative Sûre au Rollback
# Créer un clone depuis un snapshot
zfs clone tank/data@2026-03-23 tank/data-clone
# Si le clone doit devenir le principal, le promouvoir
zfs promote tank/data-clone
Send et Receive: Réplication
# Envoi complet initial vers le serveur distant
zfs send tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data
# Envoi incrémentiel (-i: delta entre deux snapshots spécifiques)
zfs send -i tank/data@2026-03-22 tank/data@2026-03-23 | ssh user@backup-server zfs receive backup/data
# Envoi compressé (-c: transfère les blocs déjà compressés)
zfs send -c -i tank/data@snap1 tank/data@snap2 | ssh user@remote zfs receive backup/data
# Envoi chiffré raw (pour datasets avec chiffrement natif)
zfs send -w tank/data@snap1 | ssh user@remote zfs receive backup/data
Chiffrement Natif
# Créer un dataset chiffré
zfs create -o encryption=aes-256-gcm -o keylocation=prompt -o keyformat=passphrase tank/secrets
Snapshots Automatisés avec sanoid
# Ubuntu / Debian
sudo apt install sanoid -y
Éditer /etc/sanoid/sanoid.conf:
[tank/data]
use_template = production
[tank/databases]
use_template = production
recursive = yes
[template_production]
hourly = 24
daily = 30
weekly = 8
monthly = 12
autosnap = yes
autoprune = yes
# Test à blanc
sudo sanoid --cron --verbose --dryrun
# Activer le timer systemd
sudo systemctl enable --now sanoid.timer
Syncoid pour la Réplication
# Répliquer tank/data vers le serveur distant
sudo syncoid tank/data user@backup-server:backup/data
# Réplication récursive
sudo syncoid -r tank user@backup-server:backup
Planification du Scrub
# Scrub manuel
sudo zpool scrub tank
# Planifier un scrub mensuel via systemd
sudo systemctl enable --now zfs-scrub-monthly@tank.timer
# Ou via cron
0 2 1 * * zpool scrub tank
ZFS vs Technologies Alternatives de Snapshots
| Fonctionnalité | ZFS | Btrfs | LVM Snapshots | ext4+LVM | XFS |
|---|---|---|---|---|---|
| Snapshots instantanés | Oui | Oui | Oui | Oui (via LVM) | Non natif |
| Snapshots récursifs | Oui (-r) | Sous-volumes uniquement | Non | Non | Non |
| Réplication send/receive | Oui (natif) | Oui (btrfs send) | Non | Non | Non |
| Checksums autocorrectifs | Oui | Oui | Non | Non | Non |
| Chiffrement natif | Oui (ZoL 0.8+) | Non | Via dm-crypt | Via dm-crypt | Via dm-crypt |
| RAID intégré | Oui (raidz) | Oui (raid1/5/6) | Non | Non | Non |
| Déduplication | Oui (RAM élevée) | Oui (limitée) | Non | Non | Non |
Stratégie de Sauvegarde en Production avec sanoid + syncoid
Niveau 1 — Snapshots locaux (sanoid): Toutes les heures pendant 24 heures, quotidiens pendant 30 jours, hebdomadaires pendant 8 semaines.
Niveau 2 — Réplication vers serveur de sauvegarde (syncoid): Synchronisation quotidienne vers un serveur backup sur le même réseau. Récupération rapide en cas de défaillance matérielle.
Niveau 3 — Réplication hors site (syncoid via SSH): Envoi chiffré hebdomadaire vers un serveur cloud. Protection contre les catastrophes au niveau du site.
Cas Particuliers et Erreurs Fréquentes
Exigence de RAM pour la déduplication: La dédup ZFS nécessite ~5 Go de RAM par To de données dédupliquées. Sans RAM suffisante, cela provoque un swapping intensif. Utilisez la dédup uniquement pour les dépôts avec haute redondance.
Accumulation de snapshots: Les snapshots oubliés conservent des blocs que ZFS ne peut pas libérer. Un pool qui semble “plein” mais a peu de données référencées a généralement des snapshots avec un used élevé. Utilisez toujours sanoid ou zfs destroy explicitement.
Taille de l’ARC: ZFS utilise un cache adaptatif (ARC) pouvant consommer presque toute la RAM. Limitez dans /etc/modprobe.d/zfs.conf: options zfs zfs_arc_max=4294967296 (4 Go).
Résumé
- Le copy-on-write de ZFS rend les snapshots instantanés et sans coût jusqu’à ce que les données divergent.
- Utilisez
raidz2pour les pools de production; mirror pour deux disques. - Ajustez
recordsizeetcompression=lz4par dataset selon la charge de travail. zfs snapshot -rpour les snapshots récursifs atomiques; préférez les clones pour les tests sûrs.zfs send | zfs receivevia SSH fournit une réplication native incrémentielle chiffrée.- sanoid + syncoid est le standard en production pour la rétention et la réplication automatisées.