Bei der Entwicklung von FreeBSD wurde kürzlich ein Fehler entdeckt, der beim Speichern von Dateien auftritt und offenbar mit der neuen Version 2.2.0 des Dateisystems OpenZFS zusammenhängt. Nach einer gründlichen Untersuchung verdächtigen die Entwickler die neu implementierte Block-Cloning-Optimierung von OpenZFS als Ursache für das Problem.
Auch Terin Stocks vom Gentoo Linux-Team stieß auf Fehler im Zusammenhang mit der Datenspeicherung, als er den Go-Compiler auf einem Gentoo Linux mit OpenZFS installierte. Nachdem die Binärdateien über die Paketverwaltung Portage erstellt wurden, enthielten zahlreiche der erzeugten Dateien Nullen oder Datenmüll. Besonders frustrierend ist dabei, dass der Integritätsprüfer “scrub” von ZFS diese Fehler nicht erkannte.
Am 13. Oktober wurde OpenZFS 2.2.0 veröffentlicht. Eine der neuen Funktionen ist die Block-Cloning-Funktion. Statt tatsächlich kopierte Blöcke einer Datei anzulegen, werden sie nur zusätzlich referenziert. Erst wenn entweder die originalen oder die kopierten Daten geändert werden, wird ein zweiter physischer Datenblock erstellt. Der cp-Befehl von GNU/Linux macht bereits von dieser Funktion Gebrauch.
Das FreeBSD-Team beschloss daraufhin, das Block Cloning für FreeBSD 14 zu deaktivieren, was zunächst das Problem zu lösen schien. Diese Vorgehensweise wurde auch bei OpenZFS 2.2.1 sowie bei den kürzlich veröffentlichten Versionen von Proxmox Virtual Environment 8.1 und Proxmox Backup Server 3.1 angewendet, die ebenfalls OpenZFS für ihre Speicherbereiche verwenden.
Allerdings scheint der eigentliche Fehler nicht unbedingt in der Block-Cloning-Funktion selbst zu liegen. Viele Entwickler vermuten, dass das Problem möglicherweise bereits in früheren Versionen von OpenZFS vorhanden war, jedoch durch die Block-Cloning-Funktion stärker hervortritt.
Ed Maste von der FreeBSD Foundation rät daher allen OpenZFS-Nutzern dringend davon ab, das Block Cloning vorerst zu aktivieren. Um den Workaround für FreeBSD 14.0 und 13.2 zu implementieren, bei dem “Enable forcing txg sync to find holes” deaktiviert wird, können folgende Schritte ausgeführt werden:
Die Datei “/etc/sysctl.conf” öffnen und die Zeile “vfs.zfs.dmu_offset_next_sync=0” hinzufügen.
Den Befehl “sysctl vfs.zfs.dmu_offset_next_sync=0” als Root-Benutzer ausführen.
Um zu überprüfen, ob das Block Cloning unter FreeBSD 14 aktiviert ist, können folgende Schritte durchgeführt werden:
Den Befehl “sysctl -d vfs.zfs.bclone_enabled” ausführen, um eine Beschreibung des Parameters “vfs.zfs.bclone_enabled” zu erhalten.
Den Befehl “sysctl vfs.zfs.bclone_enabled” ausführen, um den aktuellen Wert von “vfs.zfs.bclone_enabled” abzurufen. Wenn der Wert 0 ist, ist das Block Cloning deaktiviert.
Es sollte beachtet werden, dass ältere Versionen von OpenZFS möglicherweise einen Fehler melden (sysctl: unknown oid vfs.zfs.bclone_enabled) und standardmäßig deaktiviert sind.
Da die Entwickler noch nicht vollständig sicher sind, ob der Fehler ausschließlich auf die neue Block-Cloning-Funktion zurückzuführen ist, wird vermutet, dass das Block Cloning einen tief im System von OpenZFS verankerten Fehler verursacht.
Bronek Kozicki bemüht sich, die Ursache genauer zu beschreiben: Wenn eine Datei oder eine Änderung asynchron geschrieben wird und der Schreibvorgang noch nicht abgeschlossen ist, könnte ein weiterer Prozess, der versucht, diese Daten zu lesen, anstelle der geänderten Daten Nullen erhalten. Der Prozess schreibt diese Nullen dann auf den Datenträger, was für OpenZFS und den scrub-Vorgang korrekt ist. Dadurch werden inkorrekte Daten korrekt in das OpenZFS-Dateisystem geschrieben. Um sicherzustellen, dass die Daten korrekt sind, können Prüfsummen verwendet oder sie mit früheren Backups abgeglichen werden.
Tony Hutter hat auf Github ein nützliches Skript veröffentlicht, mit dem eigene OpenZFS-Dateisysteme umfassend überprüft werden können. Das Skript erzeugt zahlreiche Dateien, kopiert sie und prüft ihre Integrität. Es ist jedoch wichtig zu beachten, dass das Skript lediglich als Hilfsmittel betrachtet werden sollte, um eine potenziell fehlerhafte Version von OpenZFS zu erkennen. Nur weil keine Fehler auftreten, bedeutet das nicht zwangsläufig, dass der Fehler nicht doch im System verborgen ist.
Schlagwörter: FreeBSDTeam + OpenZFS + BlockCloningFehler
Wie bewerten Sie den Schreibstil des Artikels?