Seules les données nouvellement écrites (ajoutées) sont réparties entre tous les vdevs actuellement actifs, il n'y a pas d'opération de rééquilibrage explicite dans ZFS.
Deux solutions possibles :
- Attendez que toutes les anciennes données soient à nouveau écrites (à cause de CoW, cela peut prendre très longtemps, dans le pire des cas le double du temps qu'il faudrait pour écrire complètement le disque).
- Supprimez toutes les données et réécrivez-les (zfs send/recv est utile pour récupérer toutes les données du pool et les récupérer sans rien perdre). Il n'est pas nécessaire de tout faire en une seule fois, et cela peut être fait sur le même pool.
Pour être plus précis, je choisirais la deuxième solution et transférerais chaque système de fichiers séparément aux moments où la charge du système est faible (par exemple la nuit) :
- Prendre un instantané (
zfs snapshot -r
) d'un système de fichiers de taille décente (et des systèmes de fichiers descendants, récursivement) - Utilisez
zfs send | zfs recv
avec les options appropriées pour envoyer l'instantané à un système de fichiers temporaire nouvellement créé (peut être sur le même pool si l'espace le permet) ; ce système de fichiers doit se trouver au même emplacement dans la hiérarchie que l'ancien - Une fois la copie terminée (cela peut prendre un certain temps, car les disques doivent lire et écrire),
zfs destroy
l'ancien instantané et l'ancien système de fichiers zfs rename
le système temporaire à l'ancien nom- Vérifiez et modifiez les points de montage avec
zfs mount
, en réorganisant la situation précédente pour votre système de fichiers remplacé - Répéter jusqu'à ce que tous les systèmes de fichiers soient déplacés
3ème solution possible (comme mentionné par SirMaster dans ce post du forum FreeNAS) :
- ajouter de nouveaux disques à zpool
- copier de nombreux fichiers dans un autre nouveau répertoire /mnt/pool/temp/
- supprimer les fichiers d'origine :
rm -rf original/
- renommer le répertoire :
mv temp/ original/
Cela fonctionne car ZFS placera proportionnellement les écritures sur le vdev qui a le plus d'espace libre, dans ce cas les tout nouveaux disques qui étaient vides. (à partir de la version 0.7, zfs favorisera les disques plus rapides pour les écritures, mais supposons que vos 2 nouveaux disques ont des performances identiques ou supérieures à celles des disques d'origine)
C'est probablement plus lent que zfs send | zfs recv
, mais plus simple car vous n'avez pas à créer/détruire des instantanés.
Vous pouvez exécuter zpool list -v
avant et après pour voir chaque utilisation de vdev.
En outre, j'ai trouvé un script php qui effectue la procédure de copie/suppression/renommage fichier par fichier. Cela était lié à une réponse d'une question similaire (mais zvol) quelques années plus tôt. (n'a pas testé ce script personnellement)