[Proxmox] Comment migrer de LVM+Ext4 a ZFS

Pour les besoins de mon lab sur mon MicroServer HP ProLiant Gen8, ZFS est apparement la meilleure option par rapport à une configuration classique LVM + ext4. Je vais donc repartir de zéro et supprimer tout ce que j’avais configuré dans mon lab précédent.

Qu’est ce que c’est que ZFS?

ZFS est un système de fichiers et gestionnaire de volumes logiques combinés … publié en tant que logiciel libre sous la licence Common Development and Distribution License (CDDL) dans le cadre du projet OpenSolaris en novembre 2005.

ZFS est évolutif et offre une protection étendue contre la corruption des données, une prise en charge de très grandes capacités de stockage, une compression efficace des données, l’intégration des concepts de système de fichiers et de gestion de volumes, des instantanés (snapshots) et des clones en écriture différée (copy-on-write), une vérification continue de l’intégrité des données avec réparation automatique (…).

Pour en savoir plus, je vous recommande la page du wiki Debian sur ZFS.

Vérification de la compatibilité matérielle

Avant de reconfigurer notre stockage de données, vérifions que le matériel est adapté à ZFS.

Mémoire vive (RAM)

  • Minimum recommandé : 16 Go pour un pool de plus de 512 Go.
  • RAM ECC fortement conseillée

Vérification de la prise en charge ECC :

# dmidecode -t memory | grep -i "ecc"
Error Correction Type: Single-bit ECC

Disques

  • Système d’exploitation : installé sur une partition LVM + ext4 (séparée du pool ZFS).
  • Données : stockées sur un pool ZFS dédié.

Sur un HP ProLiant MicroServer Gen8 (BIOS/Legacy), il vaut mieux ne pas installer ZFS sur le système de fichiers racine (/) ou /boot, car GRUB ne supporte ZFS que partiellement. Par contre, sur les machines modernes qui prennent en charge de démarrage en mode UEFI, il n’y aurait pas de problème à le faire.

Ma configuration :

├── sda (SSD 128 Go) → système Proxmox (LVM+ext4)
├── sdb (SSD 256 Go) → sdb + sdc : miroir ZFS
├── sdc (SSD 256 Go) → sdb + sdc : miroir ZFS
└── sdd (HDD 320 Go) → stockage de sauvegarde

Mise-en place du système

Avant toute chose, sauvegarder toutes les données importantes.

Étape 1 : Démonter les points de montage

# umount /mnt/app
# umount /mnt/backup

Vérifie que rien ne les utilise :

# lsof /mnt/app
# lsof /mnt/backup

Après avoir lancé ces commandes, si rien ne s’affiche, c’est bon.

Étape 2 : Supprimer les stockages dans l’UI Proxmox

1. Accéder à l’interface web Proxmox, Datacenter > Storage
2. Trouve les entrées :

app (type Directory, path: /mnt/app)
backup (type Directory, path: /mnt/backup)

3. Clique sur “Remove” pour chacune de ces entrées.

Étape 3 : Nettoyer les entrées dans /etc/fstab

# vim /etc/fstab

Supprime les lignes correspondant à :

/dev/vg_ssd/lv_app
/dev/vg_hdd/lv_backup

Étape 4 : Supprimer les Logical Volumes (LV)

# lvremove /dev/vg_ssd/lv_app
# lvremove /dev/vg_hdd/lv_backup

Étape 5 : Supprimer les Thin Pools

# lvremove /dev/vg_ssd/thinpool_ssd
# lvremove /dev/vg_hdd/thinpool_hdd

Étape 6 : Supprimer les Volume Groups (VG)

# vgremove vg_ssd
# vgremove vg_hdd

Après avoir supprimé les LV (lvremove) et les VG (vgremove), ces stockages Proxmox sont maintenant « orphelins » : ils pointent vers des ressources qui n’existent plus.

1. Ouvre l’interface web Proxmox, Datacenter > Storage
2. Trouve les entrées :

hdd_thin (type LVM-Thin)
ssd_thin (type LVM-Thin)

3. Clique sur “Remove” pour chacune de ces entrées.

Étape 7 : Supprimer les Physical Volumes (PV)

# pvremove /dev/sdb
# pvremove /dev/sdc
# pvremove /dev/sdd

Étape 8 : Nettoyer les signatures disques (optionnel mais recommandé)

# wipefs -a /dev/sdb
# wipefs -a /dev/sdc
# wipefs -a /dev/sdd

Étape 9 : Vérification finale

Assurez-vous que tout est propre :

  • La commande lsblk doit montrer que les disques sdb, sdc, sdd sont vides, sans partitions ni mapper
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 117.4G 0 disk
├─sda1 8:1 0 1007K 0 part
├─sda2 8:2 0 1G 0 part
└─sda3 8:3 0 116.4G 0 part
├─pve-swap 252:2 0 8G 0 lvm [SWAP]
├─pve-root 252:3 0 39.1G 0 lvm /
├─pve-data_tmeta 252:4 0 1G 0 lvm
│ └─pve-data 252:11 0 52.8G 0 lvm
└─pve-data_tdata 252:5 0 52.8G 0 lvm
└─pve-data 252:11 0 52.8G 0 lvm
sdb 8:16 0 238.5G 0 disk
sdc 8:32 0 238.5G 0 disk
sdd 8:48 0 298.1G 0 disk
  • La commande pvs ne doit plus lister que /dev/sda3
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 pve lvm2 a-- <116.38g 14.50g
  • La commande vgs ne doit lister que pve
# vgs
VG #PV #LV #SN Attr VSize VFree
pve 1 3 0 wz--n- <116.38g 14.50g
  • La commande blkid ne doit plus montrer de TYPE= »LVM2_member » pour sdb/sdc/sdd
# blkid
/dev/mapper/pve-swap: UUID="..." TYPE="swap"
/dev/sda2: UUID="..." BLOCK_SIZE="512" TYPE="vfat" PARTUUID="..."
/dev/sda3: UUID="..." TYPE="LVM2_member" PARTUUID="..."
/dev/mapper/pve-root: UUID="..." BLOCK_SIZE="4096" TYPE="ext4"
/dev/sda1: PARTUUID="..."

Installer et configurer ZFS

Étape 1 : Installation des outils ZFS

Avec proxmox, les outils ZFS devraient déjà être installés. Si ce n’est pas le cas, installez-les :

# zpool version
# apt install -y zfsutils-linux

Étape 2 : Création de pools

Vous pouvez créer un pool ZFS directement depuis l’interface web de Proxmox (à partir de la version 8.4), ou manuellement en ligne de commande.

Pool SSD en miroir :

# zpool create -f -o ashift=12 -O compression=lz4 -O atime=off tank-ssd mirror /dev/sdb /dev/sdc

Pool HDD, disque unique non redondant :

# zpool create -f -o ashift=12 -O compression=lz4 tank-hdd /dev/sdd

Par contre, il ne faut jamais mélanger des disques SSD et HDD dans un même pool ZFS, car c’est une très mauvaise idée.

Petite note sur les différentes alternatives pour disque HDD unique, que je vais utiliser comme stockage externe. J’ai le choix entre ces deux options :

  1. Le formater en ext4
    # mkfs.ext4 /dev/sdd1
    # mkdir /mnt/backup-sdd
    # mount /dev/sdd1 /mnt/backup-sdd
  2. Créer un pool ZFS sans redondance (choix retenu ici, pour bénéficier des snapshots, etc.)

Étape 3 : Intégration dans Proxmox

Vous pouvez ajouter tank-ssd comme stockage ZFS uniquement si vous souhaitez héberger directement des disques de VMs/LXC sur ZFS.

Depuis l’interface de Proxmox,

  1. Allez dans Datacenter > Storage > Add > ZFS
  2. Ajoutez :
ID : zfs-ssd (nom unique, utilisé en interne)
Pool : tank-ssd(doit apparaître dans la liste déroulante)
Content : Container, Disk image
Thin provision: Coché

Dans mon cas, je vais utiliser ZFS pour stocker des fichiers et non des images de disques. De ce fait, je n’ai pas besoin de stockage ZFS.

Si vous avez créé un stockage Proxmox de type ZFS (zfs-ssd), vous pouvez le supprimer à partir de l’interface de Proxmox si vous ne l’utilisez pas.

Étape 5 : Arborescence ZFS

Voici à quoi devrait ressembler mon pool ZFS final:

  • tank-ssd (mirror SSD) :
    • infra/ → services critiques (GitLab, Traefik)
    • ci-cd/ → volumes Docker, builds
    • apps/ → applications web persistantes
  • tank-hdd (HDD seul) :
    • backups/ → sauvegardes hors ligne (non critiques)

Étape 5 : Création des datasets

Un dataset dans ZFS est une unité logique de stockage, semblable à un système de fichiers ou à un répertoire, mais avec des propriétés, des quotas, des snapshots et des permissions gérables de façon indépendante.

Les datasets, je vais les utiliser comme volumes montés dans mes conteneurs LXC, éventuellement dans mes VMs.

Sur mon pool SSD (tank-ssd):

# zfs create tank-ssd/infra
# zfs create tank-ssd/ci-cd
# zfs create tank-ssd/apps

Sur mon pool HDD (tank-hdd)

# zfs create tank-hdd/backups

Options recommandées :

# zfs set compression=lz4 tank-ssd tank-hdd
# zfs set atime=off tank-ssd tank-hdd

Verification :

# zfs list -o name,mountpoint

Étape 6 : Ajout des datasets comme stockage Directory dans Proxmox

Dans l’interface Proxmox,

  1. Allez dans Datacenter > Storage > Add > Directory
  2. Créer un stockage par dataset :
    • Pour les données persistantes (SSD) :
      ID
      Directory
      Content
      Allow snapshots
      Shared
      Utilisation
      infra-ssd
      /tank-ssd/infra
      Container template
      GitLab, Traefik configs
      ci-cd-ssd
      /tank-ssd/ci-cd
      Container template
      Volumes Docker, builds CI
      apps-ssd
      /tank-ssd/apps
      Container template
      Au choix
      Données persistantes apps

      Container Template est ce qu’il nous faut pour stocker des données accessibles via bind mounts dans les conteneurs LXC.

    • Pour les backups (HDD) :
      ID
      Directory
      Content
      Allow snapshots
      Shared
      Utilization
      backups-hdd
      /tank-hdd/backups
      Backup
      Au choix
      Sauvegardes hors ligne

Dans l’onglet “Backup Retention” de l’interface Proxmox. Tu peux alors définir :

  • Nombre de backups à garder
  • Rotation quotidienne/hebdomadaire, etc.

Sources

The Basic Guide to Working with ZFS
ZFS on Linux