Nur neu geschriebene (angehängte) Daten werden zwischen allen derzeit aktiven vdevs aufgeteilt, es gibt keinen expliziten Rebalance-Vorgang in ZFS.
Zwei mögliche Lösungen:
- Warten Sie, bis alle alten Daten neu geschrieben sind (wegen CoW kann dies sehr lange dauern, im schlimmsten Fall doppelt so lange wie es dauern würde, die Platte komplett zu beschreiben).
- Entfernen Sie alle Daten und schreiben Sie sie neu (zfs send/recv ist hilfreich, um alle Daten aus dem Pool und zurück zu bekommen, ohne etwas zu verlieren). Dies muss nicht auf einmal erfolgen, sondern kann im selben Pool erfolgen.
Genauer gesagt würde ich die zweite Lösung wählen und in Zeiten geringer Systemlast (z. B. nachts) jedes Dateisystem separat übertragen:
- Machen Sie einen Schnappschuss (
zfs snapshot -r
) eines anständig großen Dateisystems (und rekursiv nachfolgender Dateisysteme) - Verwenden Sie
zfs send | zfs recv
mit geeigneten Optionen zum Senden des Snapshots an ein neu erstelltes temporäres Dateisystem (kann sich im selben Pool befinden, wenn der Platz es zulässt); dieses Dateisystem sollte sich in der Hierarchie an derselben Stelle wie das alte befinden - Nachdem die Kopie fertig ist (kann einige Zeit dauern, da die Disketten lesen und schreiben müssen),
zfs destroy
der alte Snapshot und das alte Dateisystem zfs rename
das temporäre System auf den alten Namen- Überprüfen und ändern Sie die Einhängepunkte mit
zfs mount
, indem Sie die vorherige Situation für Ihr ersetztes Dateisystem neu anordnen - Wiederholen, bis alle Dateisysteme verschoben sind
mögliche 3. Lösung (wie von SirMaster in diesem FreeNAS-Forenbeitrag erwähnt):
- neue Festplatte(n) zu zpool hinzufügen
- Viele Dateien in ein anderes neues Verzeichnis /mnt/pool/temp/ kopieren
- Originaldateien löschen:
rm -rf original/
- Verzeichnis umbenennen zurück:
mv temp/ original/
Dies funktioniert, weil ZFS Schreibvorgänge proportional auf das vdev mit dem meisten freien Speicherplatz platziert, in diesem Fall auf die brandneuen Laufwerke, die leer waren. (ab 0.7 bevorzugt zfs schnellere Laufwerke für Schreibvorgänge, aber nehmen wir an, Ihre 2 neuen Laufwerke haben die gleiche oder eine höhere Leistung als die ursprünglichen Laufwerke)
Es ist wahrscheinlich langsamer als zfs send | zfs recv
, aber einfacher, da Sie keine Snapshots erstellen/löschen müssen.
Sie können zpool list -v
ausführen vor und nach, um jede vdev-Nutzung zu sehen.
Außerdem wurde ein PHP-Skript gefunden, das das Kopieren/Löschen/Umbenennen auf Dateibasis durchführt. Dies wurde in einer Antwort auf eine ähnliche (aber zvol) Frage einige Jahre älter verlinkt. (habe dieses Skript nicht persönlich getestet)