Welche Dateisysteme verwenden beim Schreiben unveränderte Datenblöcke wieder?

441
lash

Angenommen, ich öffne und lese eine vorhandene NBlockdatei wo N > 1.

Dann ändere ich Daten, die innerhalb der Grenzen eines 1 - Blocks liegen.

Beim Zurückschreiben der tatsächlichen Daten könnte vermutlich eine der folgenden Situationen eintreten:

  1. N Blöcke werden überschrieben
  2. 1 Block wird überschrieben
  3. x Blöcke werden dabei überschrieben N > x > 1

Gibt es in weit verbreiteten Dateisystemen Beispiele dafür und welche wären das?

-1
Meistens Variante 2. Es kann jedoch von Zufall zu Zufall variieren, sogar auf demselben Volume, derselben Datei und geändertem Datenblock. Akina vor 5 Jahren 0
4. nichts wird überschrieben, 1 neuer Block wird an anderer Stelle zugewiesen und in die Datei anstelle des Originals eingefügt (z. B. btrfs) jakub_d vor 5 Jahren 1
Eine andere Möglichkeit: Die Anwendung schreibt in eine neue Datei. Siehe [diese Antwort] (https://unix.stackexchange.com/a/75570/108618). Kamil Maciorowski vor 5 Jahren 1
Eine Liste der Dateisysteme, die keine Elemente überschreiben, finden Sie in der Warnung in [man shred] (https://linux.die.net/man/1/shred). jakub_d vor 5 Jahren 0
In vielen Fällen liegt es am Programmierer, was passiert. In C öffnen Sie eine Datei im APPEND-Modus, die zum Ende der Datei springt, und unveränderte Blöcke werden nicht berührt. Sie können eine Datei auch im Binärmodus öffnen und den Befehl search verwenden, um genau an die Stelle zu gelangen, an der die Daten geschrieben werden sollen. Auf der Hardwareebene muss jedoch mindestens ein Sektor geschrieben werden. Wenn Sie also 1 Byte ändern, wird der andere 511 möglicherweise neu geschrieben. Außerdem glaube ich, dass SSDs aus Effizienzgründen 4k-Blöcke im Hintergrund (unterhalb der Sektorebene) verwenden. Die Hardware-Controller könnten weitere Optimierungen aufweisen. cybernard vor 5 Jahren 0
Das Programm kann sich jedoch dafür entscheiden, die geänderten Teile nicht einfach neu zu schreiben, da dies viel mehr Code erfordert. Dann wird die gesamte Datei auf die Festplatte zurückgespielt. Im Festplattencontroller können jedoch weitere Hardware-Optimierungen vorgenommen werden, um das unnötige Überschreiben von Daten zu minimieren. cybernard vor 5 Jahren 0

1 Antwort auf die Frage

1
Austin Hemmelgarn

Angenommen, Sie berühren nur einen Block, dann wird entweder dieser Block überschrieben oder es werden keine Blöcke überschrieben.

Die erste Situation ist bei einer großen Mehrheit der heute weit verbreiteten Dateisysteme sowie bei fast allen historischen Dateisystemen der Fall. Beispiele sind NTFS, FAT, ext4, XFS, HFS, HFS + und UFS. Im Wesentlichen ist dies die einfachste Option, und alle Nachteile sind bekannt und ziemlich trivial zu verstehen.

Die zweite Situation ist, was einige neuere Dateisysteme tun. Dies gilt insbesondere für BTRFS, ZFS, NILFS2, F2FS und ich glaube, ReFS und APFS (und das ehrwürdige Archivierungsdateisystem Fossil von Plan 9 von Bell Labs, das meiner Meinung nach das erste gewesen sein könnte). Ihre Arbeitsweise ist etwas anders. Anstatt den vorhandenen Block direkt zu überschreiben, schreiben sie in einen neuen, derzeit nicht verwendeten, und aktualisieren dann die Metadaten der Datei, sodass sie stattdessen auf diese neue Kopie zeigen, und geben die alte frei. Dies ist etwas komplizierter, stellt jedoch sicher, dass das Schreiben entweder geschieht oder nicht, statt die Möglichkeit zu belassen, dass es möglicherweise nur teilweise abgeschlossen ist.

Sobald Sie jedoch nur mit diesem einen Block arbeiten, wird es kompliziert. Je nach System verfügen Sie möglicherweise nicht über neue Blockzuordnungen für das Schreiben. Möglicherweise haben Sie auch neue Blöcke aufgrund des Anwendungsverhaltens anstelle des Dateisystems zugewiesen. Auf vielen UNIX-ähnlichen Systemen schreibt eine Anwendung häufig die geänderte Version einer Datei aus, die in eine temporäre Datei aktualisiert wird, und ersetzt dann die alte durch Umbenennen der temporären Datei, da dadurch sichergestellt wird, dass das Update entweder geschieht oder nicht t