Kann das Dateisystem inkonsistent werden, wenn es beim Verschieben einer Datei unterbrochen wird?

13

Ich habe zwei Ordner auf derselben Partition (EXT2) Wenn ich mv folder1/file folder2und eine Unterbrechung auftreten (z. B. Stromausfall), könnte das Dateisystem jemals inkonsistent werden?

Ist die mvOperation nicht atomar?

Update: Bisher habe ich im IRC folgende Perspektiven bekommen:

  1. es ist atomar, so dass Inkonsistenzen nicht auftreten können
  2. Zuerst kopieren Sie den Verzeichniseintrag in das neue Verzeichnis und löschen dann den Eintrag im vorherigen Verzeichnis, sodass möglicherweise die Inkonsistenz besteht, dass auf eine Datei zweimal verwiesen wird, die Anzahl der Verweise jedoch 1 beträgt
  3. Es löscht zuerst den Zeiger und kopiert dann den Zeiger, sodass die Inkonsistenz darin besteht, dass die Datei die Referenz 0 hat

Kann das jemand klären?

graphtheory92
quelle

Antworten:

11

Lassen Sie uns zuerst einige Mythen zerstreuen.

es ist atomar, so dass Inkonsistenzen nicht auftreten können

Das Verschieben einer Datei innerhalb desselben Dateisystems (dh des renameSystemaufrufs) ist in Bezug auf die Softwareumgebung unteilbar. Atomicity bedeutet, dass jeder Prozess, der nach der Datei sucht, diese entweder am alten oder am neuen Speicherort sieht. Keiner der Prozesse kann feststellen, dass die Datei eine andere Linkanzahl aufweist oder dass die Datei im Quellverzeichnis vorhanden ist, nachdem sie im Zielverzeichnis vorhanden ist, oder dass die Datei im Zielverzeichnis nicht vorhanden ist, nachdem sie in der Quelle nicht vorhanden ist Verzeichnis.

Wenn das System jedoch aufgrund eines Fehlers, eines Festplattenfehlers oder eines Stromausfalls abstürzt, kann nicht garantiert werden, dass sich das Dateisystem in einem konsistenten Zustand befindet, geschweige denn, dass die Verschiebung nicht zur Hälfte abgeschlossen ist. Linux bietet im Allgemeinen keine Garantie für die Atomizität in Bezug auf Hardware-Ereignisse.

Zuerst kopieren Sie den Verzeichniseintrag in das neue Verzeichnis und löschen dann den Eintrag im vorherigen Verzeichnis, sodass möglicherweise die Inkonsistenz besteht, dass auf eine Datei zweimal verwiesen wird, die Anzahl der Verweise jedoch 1 beträgt

Dies bezieht sich auf eine bestimmte Implementierungstechnik. Da sind andere.

Es kommt also vor, dass ext2 unter Linux (ab Kernel 3.16) diese spezielle Technik verwendet. Dies bedeutet jedoch nicht, dass der Festplatteninhalt die Sequenz [alter Speicherort] → [beide Speicherorte] → [neuer Speicherort] durchläuft, da die beiden Vorgänge (Neuen Eintrag hinzufügen, Alten Eintrag entfernen) auch auf Hardwareebene nicht uneinheitlich sind : Es ist möglich, dass einer von ihnen unterbrochen wird und das Dateisystem in einem inkonsistenten Zustand bleibt. (Hoffentlich repariert fsck es.) Außerdem kann die Blockebene Schreibvorgänge neu anordnen, sodass die erste Hälfte kurz vor dem Absturz auf die Festplatte geschrieben werden kann und die zweite Hälfte dann nicht ausgeführt worden wäre.

Es wird nie beobachtet, dass der Referenzzähler von 1 abweicht, solange das System nicht abstürzt (siehe oben), aber diese Garantie gilt nicht für einen Systemabsturz.

Es löscht zuerst den Zeiger und kopiert dann den Zeiger, sodass die Inkonsistenz darin besteht, dass die Datei die Referenz 0 hat

Dies bezieht sich wiederum auf eine bestimmte Implementierungstechnik. Eine baumelnde Datei kann nicht beobachtet werden, wenn das System nicht abstürzt. Dies ist jedoch zumindest in einigen Konfigurationen eine mögliche Folge eines Systemabsturzes.


Laut einem Blog-Beitrag von Alexander Larsson gibt ext2 keine Garantie für die Konsistenz bei einem Systemabsturz, ext3 jedoch im data=orderedModus. (Beachten Sie, dass es in diesem Blog-Beitrag nicht um sich renameselbst geht, sondern um die Kombination aus Schreiben in eine Datei und Aufrufen renamedieser Datei.)

Theodore Ts'o, der Hauptautor der Dateisysteme ext2, ext3 und ext4, schrieb einen Blogbeitrag zum selben Thema . In diesem Blogbeitrag werden die Atomizität (nur in Bezug auf die Softwareumgebung) und die Haltbarkeit (Atomizität in Bezug auf Abstürze sowie eine Garantie für die Verpflichtung, dh das Wissen, dass die Operation ausgeführt wurde) erörtert . Leider kann ich allein keine Informationen zur Atomizität in Bezug auf Abstürze finden. Die Haltbarkeitsgarantien für ext4 setzen jedoch voraus, dass sie renameatomar sind. Die Kerneldokumentation für ext4 besagt, dass ext4 mit der auto_da_allocOption (die in modernen Kerneln die Standardeinstellung ist) sowie ext4 eine Haltbarkeitsgarantie für a writegefolgt von a bietenrename, was impliziert, dass renamein Bezug auf Hardware-Abstürze atomar ist.

Für Btrfs, eine , renamedie eine vorhandene Datei überschrieben wird garantiert in Bezug auf Abstürze Atom sein, aber eine , renamedie keine Datei überschrieben werden können vorhandene in keinem der beiden Datei oder beide Dateien führen.


Zusammenfassend lässt sich sagen, dass die Antwort auf Ihre Frage lautet, dass eine Datei nicht nur in Bezug auf Abstürze auf ext2 nicht atomar verschoben wird, sondern auch nicht garantiert wird, dass die Datei in einem konsistenten Zustand bleibt (obwohl Fehler, fsckdie nicht repariert werden können, selten sind). so ziemlich nichts ist, weshalb bessere Dateisysteme erfunden wurden. Ext3, ext4 und btrfs bieten begrenzte Garantien.

Gilles 'SO - hör auf böse zu sein'
quelle
13

Der Umbenennungsvorgang ist auf jedem Dateisystem sehr schnell, so dass es unwahrscheinlich ist, dass er unterbrochen wird. Auf einem klassischen Dateisystem kann er jedoch unterbrochen werden. Wenn zuerst der Ziellink erstellt wird, können zwei Links in einer Datei verbleiben. Dies ist zulässig. Die Datei glaubt jedoch, nur eine zu haben, was zu Problemen führen kann, wenn eine Datei später gelöscht wird. Wenn die Quellverknüpfung jedoch zuerst entfernt wird, kann die Datei verloren gehen. Wenn Sie fsck ausführen, wird in der Regel eine der beiden Bedingungen erkannt und behoben. Wenn die Datei jedoch verloren geht, wird sie in einem "Fundsachen" -Verzeichnis mit einem beliebigen Namen und nicht am gewünschten Speicherort abgelegt. Wenn zwei Links vorhanden sind, wird die Anzahl der Links einfach berechnet aktualisiert werden, sodass die Datei an zwei Speicherorten vorhanden ist, wenn das Dateisystem dies unterstützt.

Wenn Sie ein Dateisystem benötigen, das bei Stromausfällen robust ist, sollten Sie ein Journal-Dateisystem wie NTFS, EXT3 oder XFS verwenden. Die meisten modernen Systeme verwenden standardmäßig ein Journal-Dateisystem. Beachten Sie jedoch, dass FAT kein Journal-Dateisystem ist, wenn Sie es für externe Laufwerke verwenden.

Ein Journal-Dateisystem verwendet ein "Double-Entry" -System. Es schreibt die beabsichtigte Verschiebung in die Journaldatei und führt dann die Verschiebung durch. Wenn das Dateisystem beim Start überprüft wird und unterbrochen wurde, stellt es fest, dass die Verschiebung nicht abgeschlossen wurde, und führt sie anschließend erneut aus.

Es gibt zwei Arten von Journal-Dateisystemen: Metadaten-Journaling und Full-Journaling. Metadaten-Journaling bedeutet, dass Änderungen am Dateiinhalt im Journalsystem nicht protokolliert werden (sodass Sie möglicherweise den Inhalt verlieren, wenn Sie in eine Datei schreiben). Wichtige Informationen zum Dateisystem, z. B. der Verzeichnisinhalt, werden jedoch weiterhin protokolliert , Dateieigenschaften usw.


Wenn die Leute davon sprechen, dass der Umbenennungsvorgang atomar ist, meinen sie, dass er nicht während des Übergangs von einem anderen Prozess auf dem System beobachtet werden kann und nicht zur Hälfte abgeschlossen werden kann, indem z. B. der mvBefehl selbst mit unterbrochen wird ^C. Der physische Vorgang des Schreibens in jedes Verzeichnis, dessen Speicherplatz sich möglicherweise an sehr unterschiedlichen Orten auf der Festplatte befindet, kann auf Hardwareebene möglicherweise keine wirklich atomare Operation sein.


Der Vollständigkeit halber werde ich bemerken, dass mit einer Umbenennung auch einige zufällige E / A-Vorgänge verbunden sind, zusätzlich zum Erstellen des neuen Links im Zielverzeichnis und zum Entfernen des alten Links - Aktualisieren der M-Zeit beider Verzeichnisse und möglicherweise Erweitern des Zuordnungsgröße des Zielverzeichnisses, Ändern der ..Verknüpfung und der Verknüpfungsanzahl der übergeordneten Verzeichnisse, wenn die Datei ein Verzeichnis ist. Ich bin mir auch nicht sicher, ob der Zeitpunkt der Datei selbst betroffen ist.

Random832
quelle
Ein Journal garantiert keine Atomizität bei Stromausfällen. Ich denke, dass ext3 und ext4 garantieren, dass renamees atomar ist, aber btrfs entspricht nicht dem Wiki (siehe meine Antwort). Es ist auch möglich, die Atomizität ohne ein Tagebuch zu garantieren (ich kenne keine Beispiele unter Linux, aber vielleicht gibt es einige). Haben Sie zuverlässige Informationen zu ext2?
Gilles 'SO- hör auf böse zu sein'
@Gilles hast du irgendwelche informationen darüber, wie es theoretisch sogar ohne ein journal garantiert werden kann? Ich meine, auf der Basisebene geht es darum, Schreibvorgänge in zwei verschiedene Dateien zu synchronisieren, um sicherzustellen, dass Sie nie das Ergebnis erhalten, dass nur eine von ihnen ausgeführt wurde.
Random832
Protokollstrukturierte Dateisysteme gewährleisten die Konsistenz, indem sie nicht verwendete Blöcke überschreiben. Dies eignet sich gut für Flash-Medien, bei denen das Überschreiben vorhandener Daten kostspielig ist. Das Protokoll ist nicht wirklich wie ein Tagebuch, da beim Mounten nichts wiedergegeben wird - obwohl man sagen könnte, dass das gesamte Dateisystem das Tagebuch ist (mit der Ausnahme, dass beim Mounten niemals das gesamte Objekt im Speicher abgespielt wird, da es zu langsam wäre). Die Beschreibung von LogFS in Wikipedia bietet einen guten Überblick.
Gilles 'SO- hör auf böse zu sein'
1

Diese Frage wurde Super User etwas anders gestellt. Die Wikipedia-Seite zum mvBefehl erklärt es auch recht gut:

Das Verschieben von Dateien innerhalb desselben Dateisystems erfolgt im Allgemeinen anders als das Kopieren der Datei und das anschließende Entfernen des Originals. Auf Plattformen, die das Umbenennen von syscall nicht unterstützen, wird dem neuen Verzeichnis ein neuer Link hinzugefügt und das ursprüngliche Verzeichnis gelöscht. Auf die Daten der Datei wird nicht zugegriffen.

Linux hat den Umbenennungs-Syscall und benennt die Datei daher als atomare, dh nicht unterbrechbare Operation um. Nein, das Dateisystem kann in der von Ihnen beschriebenen Situation nicht inkonsistent werden.

Benjamin B.
quelle
2
ist der umbenennungs sys eine os abstraktion? Aus hardwaretechnischen Gründen konnte ich immer eine Reihe von Vorgängen unterbrechen, da das Umbenennen eine Reihe von Vorgängen sein muss
graphtheory92
Nein, es handelt sich nicht um eine Betriebssystemabstraktion, aber ich dachte, die Angabe "daher ist es sehr unwahrscheinlich, dass das Dateisystem inkonsistent wird ..." würde die Dinge übermäßig komplizieren. Ich stimme dir allerdings zu.
Benjamin B.
2
Diese Antwort lässt mich fragen, warum der renameSystemaufruf nicht dazu führen kann, dass sich das Dateisystem in einem inkonsistenten Zustand befindet, selbst wenn ein Stromausfall vorliegt. Ich hatte das Gefühl, dass dies der Kern der Frage von @ graphtheory92 war.
Tanner Swett
1
@ graphtheory92: Wenn ein Systemaufruf atomar ist, bedeutet dies nicht, dass die resultierende Plattenoperation (oder eine Reihe von Plattenoperationen!) auch atomar ist. ------ Ich kann mir vorstellen, dass durch das Verschieben einer Datei (Anzahl fester Links 1) und das Abschalten der Stromversorgung, der Festplattenverbindung oder das Abstürzen des Kernels zum richtigen Zeitpunkt zwei feste Links entstehen (die ursprüngliche und die neue) ) auf die Datei mit der Anzahl der festen Links, die immer noch 1 beträgt. ------ Ich denke, es gibt zwei grundlegende Lösungen für das Problem: a) Software - Journaling FS, das sich automatisch von inkonsistenten Zuständen erholt. b) HW-unterstützte Transaktionen.
Pabouk
2
Die Garantie der Atomizität, auf die Sie sich beziehen, bezieht sich auf die Beobachtung durch andere Prozesse. Es hält nicht an, wenn das System abstürzt.
Gilles 'SO- hör auf böse zu sein'