rss logo

Comment installer et utiliser ZFS sur Debian

Logo OpenZFS

Introduction

ZFS est un système de fichiers open source combiné à un gestionnaire de volumes logiques, conçu pour offrir une haute intégrité des données, une grande évolutivité et des fonctionnalités avancées de stockage. Il est distribué sous licence Common Development and Distribution License (CDDL).

Initialement développé par Sun Microsystems sous la direction de Jeff Bonwick, ZFS est aujourd’hui maintenu par la communauté OpenZFS.

Fonctionnalités principales

  • Grande capacité de stockage : prend en charge des pools et systèmes de fichiers de très grande taille.
  • Gestion intégrée des volumes : combine système de fichiers et gestionnaire de volumes en une seule solution.
  • Intégrité des données : vérification de bout en bout avec détection automatique des erreurs et auto-réparation.
  • Instantanés et clones : sauvegardes rapides et peu gourmandes en espace, avec duplication simplifiée des données.
  • Déduplication : élimine les blocs de données dupliqués pour économiser de l’espace (à utiliser avec précaution).
  • Compression : compression transparente (lz4, zstd) améliorant l’efficacité du stockage et parfois les performances.

Installation

Sur Debian, ZFS peut être installé depuis les dépôts officiels. Assurez-vous que le dépôt contrib est activé, puis installez le paquet nécessaire :

root@host:~# apt update && apt install zfsutils-linux

Pour des instructions détaillées et à jour, consultez la documentation officielle OpenZFS : https://openzfs.github.io/openzfs-docs

Commandes ZFS

Cette section présente les principales commandes ZFS pour créer, gérer et surveiller des pools de stockage.

Créer un pool ZFS

  • Lister les identifiants des disques disponibles :
root@host:~# ls -lah /dev/disk/by-id/
  • Créer un point de montage :
root@host:~# mkdir /zfs

🚨 Attention : le RAID 0 (stripe) n’offre aucune redondance. Les données seront perdues si un seul disque tombe en panne.

  • Créer un pool de stockage (RAID 0 / stripe) :
root@host:~# zpool create -f -o ashift=12 -m /zfs pool01 stripe \
scsi-SATA_WDC_WD20EARS-07_WD-WCAZA796741 \
scsi-SATA_WDC_WD20EARS-07_WD-WCAZB7569258 \
scsi-SATA_WDC_WD20EARS-07_WD-WCPZB7464217
  • zpool create : crée un nouveau pool de stockage
  • -f : force la création (à utiliser avec précaution)
  • -o ashift=12 : optimise l’alignement pour les disques modernes (secteurs 4K)
  • -m : définit le point de montage (par défaut /)
  • pool01 : nom du pool
  • stripe : RAID 0 (sans redondance)
  • disk IDs : périphériques listés dans /dev/disk/by-id/
  • Ajouter un disque de secours (hot spare) :
root@host:~# zpool add pool01 spare /dev/sdX
  • Lister les pools disponibles :
root@host:~# zpool list
  • Afficher l’historique du pool :
root@host:~# zpool history pool01
  • Modifier le point de montage :
root@host:~# zfs set mountpoint=/zfs pool01
  • Si le pool ne se monte pas sur un nouveau système :
root@host:~# zpool export pool01
root@host:~# zpool import -a
  • Ou forcer l’import :
root@host:~# zpool import -f pool01
  • Désactiver atime (recommandé pour les performances) :
root@host:~# zfs set atime=off pool01
  • Activer la compression lz4 (recommandée) :
root@host:~# zfs set compression=lz4 <pool>
  • Activer la compression zstd (meilleur taux de compression, plus gourmande en CPU) :
root@host:~# zfs set compression=zstd <pool>
  • Détruire un pool de stockage :

🚨 Attention : cette commande supprime définitivement toutes les données contenues dans le pool.

root@host:~# zpool destroy <pool>

Maintenance

Vérification du système de fichiers (scrubbing)

Remarque : ZFS n’utilise pas de vérification classique du système de fichiers comme fsck. Il utilise à la place un processus appelé scrubbing pour vérifier et réparer l’intégrité des données.

  • Lancer un scrub (vérification de l’intégrité des données) :
root@host:~# zpool scrub pool01
  • Vérifier l’état du scrub et la santé du pool :
root@host:~# zpool status
  • Effacer les erreurs du statut du pool :
root@host:~# zpool clear pool01

Afficher les propriétés

  • Lister toutes les propriétés ZFS :
root@host:~# zfs get all <pool>

Remplacer un disque défaillant

  • Remplacer un disque dans un pool :
root@host:~# zpool replace pool01 <old_disk> <new_disk>

Supervision

  • Afficher toutes les propriétés du pool :
root@host:~# zpool get all pool01
  • Vérifier l’état du pool et la santé des périphériques :
root@host:~# zpool status -v pool01
  • Surveiller les statistiques d’entrées/sorties (I/O) :
root@host:~# zpool iostat <interval> <count>
root@host:~# zpool iostat 5 10

Chiffrement ZFS

💡 Remarque : les versions récentes de ZFS prennent en charge le chiffrement natif au niveau des datasets. Cette approche est généralement préférable aux solutions externes comme dm-crypt.

Chiffrement avec dm-crypt (LUKS)

Chiffrer les disques

root@host:~# cryptsetup luksFormat /dev/sdb1
root@host:~# cryptsetup luksFormat /dev/sdc1
root@host:~# cryptsetup luksFormat /dev/sdd1

Ouvrir les disques chiffrés

root@host:~# cryptsetup luksOpen /dev/sdb1 zfs01
root@host:~# cryptsetup luksOpen /dev/sdc1 zfs02
root@host:~# cryptsetup luksOpen /dev/sdd1 zfs03

Créer un pool ZFS sur les périphériques chiffrés

root@host:~# zpool create -f -m /zfs pool01 mirror \
/dev/mapper/zfs01 \
/dev/mapper/zfs02

Chiffrement natif ZFS

💡 Remarque : le chiffrement dans ZFS s’applique au niveau des datasets, et non au niveau du pool.

Créer un pool ZFS

Commencez par créer un pool ZFS qui accueillera le dataset chiffré.

root@host:~# zpool create -f -m /zfs pool01 /dev/sdX

Créer un dataset chiffré

Il existe plusieurs façons de protéger un dataset chiffré. Les plus courantes sont la phrase de passe et le fichier de clé (keyfile).

Phrase de passe
  • Créer un dataset chiffré avec une phrase de passe :
root@host:~# zfs create -o encryption=on -o keyformat=passphrase pool01/dataset01
Fichier de clé (keyfile)
  • Générer un fichier de clé sécurisé :
root@host:~# head -c 32 /dev/urandom > /root/keyfile
root@host:~# chmod 600 /root/keyfile
  • Créer un dataset chiffré en utilisant le fichier de clé :
root@host:~# zfs create -o encryption=on -o keyformat=raw -o keylocation=file:///root/keyfile pool01/dataset01

Charger la clé et monter un dataset chiffré

Après un redémarrage, ou lors de l’accès au pool depuis un autre système, il est nécessaire de charger la clé de chiffrement puis de monter le dataset. L’exemple suivant montre comment monter un dataset protégé par un fichier de clé.

  • Vérifier l’emplacement de la clé configurée :
root@host:~# zfs get keylocation pool01/dataset01
NAME              PROPERTY     VALUE                 SOURCE
pool01/dataset01  keylocation  file:///root/keyfile  local
  • Charger la clé de chiffrement :
root@host:~# zfs load-key pool01/dataset01
  • Monter le dataset :
root@host:~# zfs mount pool01/dataset01