Copy-on-Write (CoW, dt. "Kopieren-beim-Schreiben") ist ein Optimierungsprinzip der Datenverarbeitung, bei dem Änderungen nicht direkt am bestehenden Datenbestand vorgenommen, sondern immer in eine neue Kopie geschrieben werden. Als Kernstück der Speicherstrategie des Dateisystems ZFS sorgt CoW – in Kombination mit Transaktionsgruppen – dafür, dass ein unterbrochener Schreibvorgang niemals zu einem inkonsistenten Dateisystem führen kann. Das hebt ZFS von klassischen Dateisystemen ab, die Daten direkt überschreiben.
Bei Schreibvorgängen nach dem CoW-Prinzip werden Datenblöcke bei Änderungen nicht überschrieben. Stattdessen werden neue Datenblöcke mit den Änderungen beschrieben und die alten Datenblöcke nur abgelöst. Um die Konsistenz der Daten zu erhalten, arbeitet CoW mit einem Referenz-System, das als Hash-Tree (oder auch Merkle-Tree)[1] bekannt ist. Mithilfe dieses Systems wird sichergestellt, das Fehler in der Datenintegrität zu jedem Zeitpunkt erkannt werden können.

In Abbildung 1 ist eine vereinfachte Ansicht eines Hash-Trees zu sehen:
zpool einzigartig und wird nach jedem Schreibvorgang neu errechnet. Er enthält die Prüfsumme, aus welcher sich alle im zpool enthaltenen Daten verifizieren lassen.ZFS hält die Daten zunächst in sogenannten Transaktionsgruppen (txg) im RAM des Systems. Nach einem festgelegten Zeitrahmen – die Standardeinstellung ist 5 Sekunden – oder wenn ausreichend Daten angesammelt wurden, werden alle in der Transaktionsgruppe gesammelten Änderungen gleichzeitig committed[2].
Durch diese Vorgehensweise ist sichergestellt, dass ein inkonsistenter Datenstand durch einen unterbrochenen Schreibvorgang ausgeschlossen ist.
Entweder wird die txg committed: Dann wurde ein neuer uberblock gebildet und das Dateisystem ist konsistent.
Oder die txg wurde nicht committed: Dann gilt der alte uberblock als aktuell und das Dateisystem ist ebenfalls konsistent (nur älter).

In Abbildung 2 ist der Zustand des Dateisystems nach einem Schreibvorgang mit Copy-on-Write zu sehen. Folgende Schritte haben zu diesem Ergebnis geführt:
D4 zu ersetzenD4' wird erstellt, welcher die neuen Daten enthältinode2 zu bilden, welches hier mit inode2' bezeichnet ist. Dieser Schritt ist notwendig, weil die Prüfsumme für alle übergeordneten Knoten neu gebildet werden mussroot und uberblock neu gebildetDurch die Einbindung des neuen Datenblocks wurden der alte Datenblock D4 genau wie alle übergeordneten Knoten ersetzt und freigegeben. Solange kein Snapshot den alten Block noch referenziert, kann dieser bei zukünftigen Schreibvorgängen wieder verwendet werden.
Durch CoW ergeben sich einige der wichtigsten Funktionen von ZFS als logische Konsequenz. Allerdings ergeben sich so gleichermaßen auch einige der Schwächen von ZFS. Diese sind im Folgenden als Vorteile und Nachteile kurz gelistet.
fsck ist obsolet, da CoW immer für einen konsistenten Pool sorgt.zpool wird, desto schwieriger wird es außerdem, ausreichend zusammenhängende Blöcke für sequenzielle Schreibvorgänge zu finden.recordsize langsam sein, da immer der gesamte Datensatz gelesen werden muss. Bei einem Datensatz mit recordsize=128k , in dem 8 KB geändert werden sollen, müssen z.B. 128 KB gelesen, 8 KB im Speicher geändert und dann wieder als neuer Record mit 128 KB geschrieben werden.ZFS, Teil 1: Konzepte und Grundlagen von Michael Plura (heise.de, 2017)
Die Zeitmaschine im Kernel-Space: ZFS-Workflows unter Ubuntu 24.04 (linux-magazin.de, 2026)
"ZFS: the last word in file systems." by Jeff Bonwick (web.archive.org, 2026)
|
Autor: Stefan Bohn Stefan Bohn ist seit 2020 bei der Thomas-Krenn.AG beschäftigt. Ursprünglich als Berater für IT-Lösungen im PreSales beheimatet, wechselte er 2022 zum Product Management. Dort widmet er sich dem Wissenstransfer und treibt dabei auch das Thomas-Krenn Wiki voran. |