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 rename
Systemaufrufs) 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=ordered
Modus. (Beachten Sie, dass es in diesem Blog-Beitrag nicht um sich rename
selbst geht, sondern um die Kombination aus Schreiben in eine Datei und Aufrufen rename
dieser 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 rename
atomar sind. Die Kerneldokumentation für ext4 besagt, dass ext4 mit der auto_da_alloc
Option (die in modernen Kerneln die Standardeinstellung ist) sowie ext4 eine Haltbarkeitsgarantie für a write
gefolgt von a bietenrename
, was impliziert, dass rename
in Bezug auf Hardware-Abstürze atomar ist.
Für Btrfs, eine , rename
die eine vorhandene Datei überschrieben wird garantiert in Bezug auf Abstürze Atom sein, aber eine , rename
die 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, fsck
die nicht repariert werden können, selten sind). so ziemlich nichts ist, weshalb bessere Dateisysteme erfunden wurden. Ext3, ext4 und btrfs bieten begrenzte Garantien.
rename
es 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?