ZFS: Komprimiert vorhandene Dateien nach Änderung des Komprimierungsalgorithmus neu

14

Ich habe einen Pool, der im Jahr 2011 mit erstellt wurde lzjb compression, und erst ein paar Jahre später konnte ich die Komprimierung durch ein Upgrade auf einstellen lz4. Ich schätze, dass mindestens 20% des Inhalts (nach Speicherplatz) auf dem Array vor 2013 erstellt wurden, was bedeutet, dass es immer noch mit komprimiert wird lzjb.

Ich kann mir ein paar Optionen vorstellen, um dies zu beheben und (etwas) Platz zurückzugewinnen:

  1. Sichern Sie und stellen Sie in einem neuen Pool wieder her. Nicht wirklich praktisch, da ich nicht genügend redundanten Speicherplatz habe, um die temporäre Kopie zu speichern. Für die Wiederherstellung muss der Pool auch mehrere Stunden offline sein.

  2. Schreiben Sie ein Skript, um alle Dateien mit einem Zeitstempel, der älter als 2013 ist, erneut zu kopieren. Dies ist potenziell riskant, insbesondere, wenn Leerzeichen oder andere Sonderzeichen unterdrückt werden und der ursprüngliche Name beschädigt wird.

Gibt es eine Möglichkeit, ZFS dazu zu bringen, vorhandene Blöcke mit dem aktuellen Komprimierungsalgorithmus neu zu komprimieren? Ein bisschen wie ein Peeling, aber die Kompression heilen.

Eine verwandte Frage: Gibt es eine Möglichkeit, die Verwendung jeder Art von Komprimierungsalgorithmus zu erkennen? zdb zeigt nur die Gesamtkomprimierungsstatistik an, anstatt sie in einzelne Algorithmen aufzuteilen.

rowan194
quelle
2
Ich bin mir ziemlich sicher, dass Sie die beiden einzigen Optionen genannt haben. Lesen Sie auch die Diskussion in Ausgabe 3013, warum diese Funktionalität nicht vorhanden ist und Sie dies möglicherweise überhaupt nicht tun möchten.
Michael Hampton
2
lz4 ist angeblich höchstens 10% besser beim Komprimieren als lzjb. Wenn 20% Ihrer Daten 10% besser komprimiert werden können, erhalten Sie höchstens 2% mehr freien Speicherplatz. Lohnt es sich?
Pipe
1
Wenn Sie für das Kopieren ein Shell-Skript schreiben, fügen Sie es export LC_ALL=Can den Anfang des Skripts hinzu, und alle Nicht-ASCII-Sonderzeichen in Dateinamen bleiben erhalten. Es ist schwieriger, Leerzeichen und Bindestrich intakt zu halten. Verwenden Sie doppelte Anführungszeichen und --z cp -- "$SOURCE" "$TARGET".
pts
4
@pipe Space ist ein (sehr) kleiner Vorteil, aber ich bin mehr an der Dekomprimierungsgeschwindigkeit interessiert. Aus der Manpage zu FreeBSD zpool-features: "Normalerweise ist die lz4-Komprimierung bei komprimierbaren Daten um ca. 50% und bei inkomprimierbaren Daten um ca. 200% schneller als bei lzjb. Außerdem ist sie bei der Dekomprimierung um ca. 80% schneller und bietet eine um ca. 10% bessere Komprimierungsrate. "
Rowan194
@pts Ich würde das Befolgen grundlegender Shell-Programmierregeln (doppelte Anführungszeichen um Variablen oder Verwendung --) nicht als "kniffliger" bezeichnen. Das ist genauso wichtig wie beispielsweise die Vermeidung von SQL-Injection.
Glglgl

Antworten:

14

Sie müssen die Daten (vollständig oder teilweise) erneut kopieren oder zfs sendet / empfängt die Daten an einen neuen Pool oder ein neues ZFS-Dateisystem.

Es gibt keine anderen Optionen.

ewwhite
quelle