Ich versuche, Kopien einiger Dateien / Verzeichnisse anzufertigen, aber von den verschiedenen mir bekannten Möglichkeiten scheinen alle nicht optimal zu sein.
Zum Beispiel kann btrfs mit der Verwendung cp --reflink=auto
von Dateien schnell Kuh-Kopien erzeugen.
Was ich ausprobiert habe:
- Symlinks: Nein gut. Umbenannte Datei, defekter Link.
- Hardlinks: Besser, aber immer noch nicht gut. Änderungen an einer Datei ändern die andere, und ich möchte nicht unbedingt, dass die andere Datei geändert wird.
- Erstellen Sie einen Snapshot des Datasets und klonen Sie den Snapshot: Dies kann funktionieren, ist aber nicht gut. Oft suche ich nicht nach einer Kopie des gesamten Datensatzes oder nach Kopien, die sich wie ein anderer Datensatz verhalten. Dann gibt es die Eltern / Kind-Beziehungen zwischen dem Klon / Schnappschuss / Original, die meines Wissens schwer, wenn nicht unmöglich zu brechen sind.
- Durch Verwenden
zfs send/receive
und Aktivieren von dedup wird das Dataset in ein neues Dataset repliziert: Dies vermeidet die übergeordneten / untergeordneten Beziehungen bei der Verwendung eines Klons, erstellt jedoch immer noch unnötigerweise ein anderes Dataset und leidet weiterhin unter der Verlangsamung, dass die Dateien zu 100% und zu 100% gelesen werden müssen Die Blöcke werden erneut referenziert anstatt geschrieben. - Dateien kopieren und dedup seine Arbeit machen lassen: Dies funktioniert, ist aber langsam, da die Datei (en) zu 100% gelesen und dann die Blöcke erneut referenziert werden müssen, anstatt zu schreiben.
Die Verlangsamung des Sende- / Empfangsvorgangs von ZFS sowie des physischen Kopierens oder Synchronisierens wird weiter verschärft, da die meisten Dinge komprimiert gespeichert werden und während des Lesens dekomprimiert und dann komprimiert werden müssen, bevor dedup auf doppelte Blöcke verweist.
In all meinen Nachforschungen konnte ich nichts finden, das der Einfachheit von --reflink in btrfs im entferntesten ähnelt.
Gibt es eine Möglichkeit, Kuhkopien in ZFS zu erstellen? Oder ist das "physische" Kopieren und das Erledigen von Dedups die einzig wahre Option?
cp --reflink=auto
.Option 5 ist die beste.
In Bezug auf übergeordnete / untergeordnete Datasets in Option 3 können Sie einen Klon heraufstufen, und er wird nicht länger ein untergeordnetes Element des geklonten Datasets sein. Es werden immer noch keine zusätzlichen Blöcke verbraucht.Bearbeiten: Es wurde bemerkt, dass dies nur die Eltern-Kind-Beziehung umkehrt, nicht aber zerstört.In Bezug auf Dinge, die komprimiert / verschlüsselt werden und die die Kopie verlangsamen, ist das völlig falsch. Ihr Prozessor ist weitaus schneller als Ihr Block-Gerät (auch bei Verwendung von SSDs). Nehmen wir zum Beispiel an, es dauert 10 Sekunden, um einen Block zu lesen, aber nur eine Sekunde, um ihn zu dekomprimieren, und 2 Sekunden, um ihn zu entschlüsseln. Block 1 wird in 10 Sekunden gelesen und an die CPU gesendet. Die CPU beginnt mit dem Dekomprimieren und Entschlüsseln, während die Festplatte Block 2 liest. Die CPU beendet ihre Aufgabe in 3 Sekunden und wartet die nächsten 7 Sekunden auf der Festplatte. Die Platte hat in der Zwischenzeit genau die gleiche Zeit mit dem Lesen dieser beiden Blöcke verbracht (20 Sekunden), unabhängig davon, ob die Blöcke komprimiert sind oder nicht.
Ebenso wird beim Schreiben nur der erste Block verzögert. Die CPU komprimiert / verschlüsselt Block 1 und sendet ihn an die Festplatte. Während die Platte Block 1 schreibt, beginnt die CPU, nachfolgende Blöcke zu komprimieren / zu verschlüsseln. Die CPU kaut Blöcke viel schneller durch, als die Festplatte sie beschreiben kann, sodass dies kein Problem darstellt. (Ja, es ist komplexer als das, aber das ist das Wesentliche.)
Entschuldigen Sie die zu lange Erklärung eines kleinen Punktes in Ihrer Frage, aber ich wollte dieses Missverständnis ausräumen.
quelle