Sicheres Speichern bzgl. plötzlichem Stromausfall?



  • Hi!
    Ich programmiere auf einem Embedded Board (Intel Edison), und ich versuche das Speichern einer Datei dahingehend abzusichern, dass genau während des Speichervorganges ein Stromausfall eintritt.
    Was gibt es da für Strategien? Einfach zweimal hintereinander speichern? Prüfsummen?

    Danke für etwaige Tipps!

    Christoph



  • Wenn Du eine neue Datei mit einem neue Namen anlegst, dann bleibt die alte so lange erhalten, bis die neue komplett geschrieben wurde. Anschliessend die alte Datei löschen und die neue umbenennen. Die Lücke, die bleibt ist, dass der Strom ausfällt, nach dem die alte Datei gelöscht aber die neue noch nicht umbenannt wurde. Das kannst Du aber beim Wiederanlauf erkennen und den Vorgang fortsetzen.



  • Oft kann man den "umbenennen" Schritt ohne vorheriges Löschen machen - so dass es zu keinem Zeitpunk die Zieldatei nicht gibt.



  • SchlitzInDaHaus schrieb:

    und ich versuche das Speichern einer Datei dahingehend abzusichern, dass genau während des Speichervorganges ein Stromausfall eintritt.

    Also brauchst schonmal externe Hardware für den Stromausfall. Und einen hook ins Filesystem, der beim Schreiben aber nicht beim Lesen triggert. Ganz schwierig. Würde ein Handler in der Anwendung reichen? Die Schaltung, daß der Stromausfall dann genau eintritt, ist das nächste Problem, wie lange soll der Stromausfall mindestens sein, da dessen Dauer wohl nicht vom µC gesteuert wird?



  • Ja richtig. Wie dumm von mir. Ich hatte die Frage falsch verstanden. Er will ja einen Stromausfall provozieren. Wohl um ein überschreiben der alten Datei zu verhindern. Da würde es doch reichen, einfach nicht zu speichern 😃 . Prüfsummen oder mehrmaliges speichern sind da eher kontraproduktiv.

    Ach ja:

    Shade Of Mine schrieb:

    Oft kann man den "umbenennen" Schritt ohne vorheriges Löschen machen - so dass es zu keinem Zeitpunk die Zieldatei nicht gibt.

    Es gibt kein "oft kann man". Es gibt ein definiertes Verhalten bei Linux. Und tatsächlich habe ich nachgelesen. Rename entfernt die Zieldatei wenn sie bereits exisitiert.


  • Mod

    tntnet schrieb:

    Ach ja:

    Shade Of Mine schrieb:

    Oft kann man den "umbenennen" Schritt ohne vorheriges Löschen machen - so dass es zu keinem Zeitpunk die Zieldatei nicht gibt.

    Es gibt kein "oft kann man". Es gibt ein definiertes Verhalten bei Linux. Und tatsächlich habe ich nachgelesen. Rename entfernt die Zieldatei wenn sie bereits exisitiert.

    Aber rename entfernt sie! Dein Vorschlag klingt so, als ob du erst die alte Datei löschen möchtest und danach die neue Datei umbenennen möchtest. Das ist, wie Shade of Mine erklärte, nicht gut. rename wird hingegen die Änderung atomistisch vornehmen. Erst wird gemacht, dass der Name auf die neue Datei zeigt, dann wird die alte Datei freigegeben. Es gibt keinen Zeitpunkt, zu dem die Zieldatei nicht existiert. Das ist eine Garantie, die dir Linux macht.



  • So geht es nicht:

    1. "newfile" öffnen.
    2. Neue Daten in "newfile" schreiben.
    3. "newfile" schließen.
    4. rename("newfile", "oldfile")

    Es gibt keine Garantie, dass die Daten in newfile schon geschrieben sind, bevor das rename ausgeführt wird. Mindestens ein fsync auf "newfile" ist nach Schritt 3 notwendig, wenn ich das richtig verstehe.

    Viele Programme sind darauf reingefallen, als ext4 angefangen hat, aus Performance-Gründen Schritt 2 und 4 umzusortieren. Das Ergebnis waren leere Dateien nach einem Stromausfall. Siehe z.B. http://www.heise.de/open/meldung/Moeglicher-Datenverlust-bei-Ext4-205664.html


Log in to reply