Solo i dati appena scritti (aggiunti) vengono suddivisi tra tutti i vdev attualmente attivi, non esiste un'operazione di ribilanciamento esplicita in ZFS.
Due possibili soluzioni:
- Attendi fino a quando tutti i vecchi dati non vengono riscritti (a causa di CoW, questo può richiedere molto tempo, nel peggiore dei casi il doppio del tempo necessario per scrivere completamente il disco).
- Rimuovi tutti i dati e scrivili di nuovo (zfs send/recv è utile per ottenere tutti i dati dal pool e viceversa senza perdere nulla). Questo non deve essere fatto tutto in una volta e può essere fatto nello stesso pool.
Per essere più precisi, sceglierei la seconda soluzione e trasferirei ogni file system separatamente nei momenti in cui il carico del sistema è basso (ad esempio di notte):
- Scatta un'istantanea (
zfs snapshot -r
) di un file system di dimensioni decenti (e file system deceduti, in modo ricorsivo) - Usa
zfs send | zfs recv
con opzioni appropriate per inviare l'istantanea a un file system temporaneo appena creato (può trovarsi sullo stesso pool se lo spazio lo consente); questo file system dovrebbe trovarsi nella stessa posizione nella gerarchia di quello vecchio - Al termine della copia (potrebbe volerci un po' di tempo, perché i dischi devono leggere e scrivere),
zfs destroy
la vecchia istantanea e il vecchio file system zfs rename
il sistema temporaneo al vecchio nome- Controlla e modifica i punti di montaggio con
zfs mount
, riorganizzando la situazione precedente per il tuo file system sostituito - Ripeti finché tutti i file system non vengono spostati
possibile terza soluzione (come menzionato da SirMaster in questo post del forum FreeNAS):
- aggiungi nuovi dischi a zpool
- copia molti file in un'altra nuova directory /mnt/pool/temp/
- cancella i file originali:
rm -rf original/
- rinomina la cartella indietro:
mv temp/ original/
Funziona perché ZFS posizionerà proporzionalmente le scritture su qualunque vdev abbia più spazio libero, in questo caso le unità nuove di zecca che erano vuote. (a partire dalla versione 0.7, zfs favorirà le unità più veloci per le scritture, ma supponiamo che le tue 2 nuove unità abbiano prestazioni uguali o superiori rispetto alle unità originali)
Probabilmente è più lento di zfs send | zfs recv
, ma più semplice perché non devi creare/distruggere istantanee.
Puoi eseguire zpool list -v
prima e dopo per vedere ogni utilizzo di vdev.
Inoltre, ho trovato uno script php che esegue la procedura di copia/eliminazione/rinomina file per file. Questo è stato collegato in una risposta da una domanda simile (ma zvol) di qualche anno più vecchia. (non ho testato personalmente questo script)