Ich habe die Frage im #btrfs IRC gestellt, sie sagten, should be ok if your hw isn't "buggy"
wo nicht "Buggy" bedeutet your hw has correct flush/barrier semantics
.
TL; DR: Dies bedeutet, dass btrfs ähnlich wie ZFS vor Datenbeschädigung aufgrund von Stromausfall geschützt ist.
Hier ist der Grund: Die allgemeine Idee hinter ZFS und btrfs ist ähnlich. Beide verwenden Merkle-Bäume als Datenstruktur . Für Schreibvorgänge müssen möglicherweise mehrere Blöcke auf den Datenträgern aktualisiert werden. Das Dateisystem behandelt dies, indem es die neuen Daten in leere Blöcke schreibt (auch wenn eine vorhandene Datei geändert wird, sodass keine Blöcke geändert werden müssen, die den alten Status widerspiegeln) und einen neuen aktualisierten Baum erstellt. Sobald das ganze schwere Heben abgeschlossen ist und Daten + der aktualisierte Baum auf die Festplatte geschrieben wurden, wird der Kopfzeiger auf den neuen Baum aktualisiert, wodurch die Änderung sichtbar wird.
So sollen sich die Dinge beim Schreiben in eine Datei verhalten:
- Schreiben Sie Daten in freie Blöcke auf der Festplatte.
- Erstellen Sie eine Kopie des Merkle-Baums * und aktualisieren Sie ihn gemäß den in (1) beschriebenen Änderungen.
- Bitten Sie die Hardware, Daten auf die Festplatte zu leeren. Die Hardware schreibt alle ausstehenden Daten.
- Kopfzeiger auf neuen Merkle-Baum aktualisieren.
- Kostenlose alte Blöcke, die nicht mehr benötigt werden.
Wenn nach (4) die Stromversorgung unterbrochen wird, ist die Transaktion abgeschlossen. Wenn während der Schritte (1) bis (3) die Stromversorgung unterbrochen wird, zeigt das Dateisystem den alten Status an (die in Schritt (1) geschriebenen Daten gehen verloren, aber das Dateisystem ist konsistent). Beachten Sie, dass nicht nach Dateisystemfehlern gesucht werden muss, was bedeutet, dass das Dateisystem sofort verfügbar ist, was ein großer Vorteil ist (das Überprüfen großer Dateisysteme kann sehr lange dauern!).
Hier ist ein Beispiel, wie mit "fehlerhafter" Hardware etwas schief gehen kann:
- Schreiben Sie Daten in freie Blöcke auf der Festplatte.
- Erstellen Sie eine Kopie des Merkle-Baums * und aktualisieren Sie ihn gemäß den in (1) beschriebenen Änderungen.
- Bitten Sie die Hardware, Daten auf die Festplatte zu leeren. Die Hardware bestätigt den Abschluss, spült jedoch nicht vollständig (z. B. verbleiben die Daten möglicherweise im Rückschreibcache der Festplatte).
- Kopfzeiger auf neuen Merkle-Baum aktualisieren. Diese Daten werden vor anderen ausstehenden Daten auf die Festplatte geschrieben (z. B. weil sich der Kopf der Festplatte zufällig an der richtigen Stelle befindet).
- In den Schritten (1) und (2) geschriebene Daten werden auf die Festplatte geschrieben.
- Kostenlose alte Blöcke, die nicht mehr benötigt werden.
Das Dateisystem wird inkonsistent, wenn zwischen (4) und (5) oder während der Ausführung von Schritt (5) die Stromversorgung unterbrochen wird. Infolgedessen werden der Merkle-Baum und / oder die Daten möglicherweise nur teilweise geschrieben, wodurch das Dateisystem inkonsistent wird.
In der Praxis müssen Sie bei der Verwendung von RAID-Controllern besonders vorsichtig sein . Normalerweise deaktivieren sie die Rückschreibcaches auf der Festplatte und verwenden stattdessen ihren eigenen Rückschreibcache. Hier gibt es zwei Möglichkeiten, wie etwas schief gehen kann:
* Ich vereinfache die Dinge hier. Es ist eigentlich nicht notwendig, den gesamten Baum zu kopieren. Es müssen nur die Teile hinzugefügt werden, die geändert wurden. Die verbleibenden Teile können zwischen dem alten und dem neuen Baum geteilt werden .
zpool clear -F
Befehl wiederherzustellen