Welche Dateisystem-Metadatenoperationen werden tatsächlich in ext4 & xfs aufgezeichnet?

9

Ich kann keine einfache, eindeutige Antwort darauf finden, welche Dateisystem-Metadatenoperationen tatsächlich in den ext4 & xfs-Dateisystem-Journalen beibehalten werden. Beachten Sie, dass ich nicht nach dem frage, was POSIX als "atomar" deklariert. Ich bin mehr besorgt darüber, welche Teilmenge der atomaren Dateisystemoperationen effektiv dauerhaft ist, da sie mit einem aktivierten Journal ausgeführt werden, ohne sich fsync(2)ständig nach hinten beugen zu müssen .

Operationen Ich bin mir ziemlich sicher, zählen:

  • creat(2)
  • link(2)
  • unlink(2)
  • rename(2)
  • mkdir(2)
  • rmdir(2)

Operationen Ich bin mir nicht ganz sicher:

  • symlink(2)

Der symlink(2)Fall ist am problematischsten, da es keinen einfachen Weg zu fsync(2)oder fdatasync(2)den zugrunde liegenden Datenblöcken zu geben scheint, in denen der Inhalt eines Symlinks gespeichert ist. Zu wissen, dass das Tagebuch sich für mich darum kümmert, wäre eine Erleichterung.

rboyer
quelle

Antworten:

1

Aus Leistungsgründen schreibt ext4 standardmäßig nur Metadaten des Dateisystems über das Journal.

Ich glaube, XFS protokolliert auch alle Metadatentransaktionen, es sei denn, Sie haben das Dateisystem optimiert.

John Westlund
quelle
Ja, aber was sind "Metadaten" konkret? Die Blöcke eines Verzeichnisses: sicher. Die Inodes selbst: yep. Symlinks mit einem Ziel, das klein genug ist, um in den Inode selbst zu passen: wahrscheinlich? Symlinks, bei denen das Ziel in Hilfsblöcke übergeht: ??????
Link würde helfen
Asdmin
1

Ich bin mehr besorgt darüber, welche Teilmenge der atomaren Dateisystemoperationen effektiv dauerhaft ist, da sie mit einem aktivierten Journal ausgeführt werden, ohne sich ständig nach hinten und fsync (2) beugen zu müssen.

Keiner. Wenn Sie sicherstellen möchten, dass die Änderungen nach einem Absturz bestehen bleiben, müssen Sie fsync, period. Das Journaling garantiert nur, dass im Falle eines Absturzes keine der von Ihnen aufgelisteten Vorgänge zur Hälfte ausgeführt wird.

psusi
quelle
Ich weiß, dass ich, wenn es mich interessiert, Dateien und Verzeichnisse fsync muss, um sicher zu sein, ob die Blöcke auf rotierenden Rost gestoßen sind, aber es gibt keine Methode, mit der ich die Blöcke fsync kann, die einen Symlink unterstützen, wenn er ausläuft die Inode. An diesem Punkt kann ich mich nur auf das Tagebuch verlassen oder nie wieder Symlinks für irgendetwas verwenden, das wichtig ist.
Rboyer
@naelyn, ein fsync () löscht alle Blöcke, die sich auf eine Datei beziehen, einschließlich eines nicht schnellen Symlinks.
Psusi
1
Wie öffne ich einen geeigneten Dateideskriptor zur Verwendung in einem fsync, der die Blöcke eines nicht schnellen Symlinks leeren würde?
Rboyer
@naelyn, oh ja ... guter Punkt ... muss vielleicht nach dem auf der Linux-fsdevel-Mailingliste gefragt werden ... mit harten Links Ich glaube, du öffnest und synchronisierst das Verzeichnis, das es enthält, vielleicht funktionieren Symlinks genauso?
Psusi
0

Sie wissen, dass das ext4-Journal nach Blocknummer und nicht nach Betrieb arbeitet, richtig? "Metadaten" sind alles andere als die tatsächlichen Datenblöcke für den angegebenen Inode, unabhängig davon, mit welcher Operation Sie den betreffenden Block geändert haben.

Bratchley
quelle
0

xfstests scheint zu behaupten, dass fsync () in einem Verzeichnis alle darin enthaltenen Symlinks beibehalten sollte.

Ich habe dies nicht überprüft. Möglicherweise habe ich etwas verpasst.

xfstests wird von vielen Entwicklern von Linux-Dateisystemen verwendet. Dieser Test befindet sich im "generischen" Verzeichnis. Dies bedeutet, dass es für alle Linux-Dateisysteme gelten sollte. (Oder zumindest alle Dateisysteme für Blockgeräte. Der Test funktioniert mit einem speziellen virtuellen Blockgerät.)

https://github.com/kdave/xfstests/blob/master/tests/generic/348

# Test creating a symlink, fsync its parent directory, power fail and mount
# again the filesystem. After these steps the symlink should exist and its
# content must match what we specified when we created it (must not be empty
# or point to something else).
sourcejedi
quelle