Vor einiger Zeit gab es einige Diskussionen darüber, dass ext4 nach einem unreinen Unmount möglicherweise leere Dateien hinterlässt, was in diesem Artikel ziemlich gut zusammengefasst wurde . Grundsätzlich können Schreibvorgänge aufgrund der verzögerten Zuweisung viel länger als das Standard-Festschreibungsintervall des ext-Journals (5 Sekunden) im Schreibcache gespeichert werden.
Die Probleme scheinen in einem Patch behoben worden zu sein, der in bestimmten Situationen die Blockzuweisung erzwingt und dadurch die Daten standardmäßig nach höchstens 5 Sekunden auf die Festplatte zwingt.
Ich frage mich, was passiert, wenn eine Anwendung vorhandene Teile einer Datei überschreibt, ohne die Datei selbst abzuschneiden oder anzufügen. Wird das auch innerhalb von 5 Sekunden auf die Festplatte gebracht?
Dies scheint eine andere Situation zu sein als das Anhängen an eine Datei: Beim Anhängen ändert sich die Dateigröße. Dies ist eine Metadatenänderung. Daher muss innerhalb von 5 Sekunden ein Journal-Commit durchgeführt werden. Aufgrund von data = orders müssen die Daten aus Sicherheitsgründen zuvor geschrieben werden (andernfalls können Teile der gelöschten Dateien anderer Benutzer für den Eigentümer des angehängten Dokuments angezeigt werden Datei).
Wenn Sie nur Dateidaten überschreiben, gibt es keinen Grund, warum das Schreiben der Daten vor dem Festschreiben des Metadatenjournals erfolgen muss, da die alten Daten demselben Benutzer gehören wie die neuen. Tritt der Schreibvorgang trotzdem vor dem Festschreiben auf, oder kann er länger als das Festschreibungsintervall für das Journal verzögert werden? Wenn ja, wie lange?
Update: Ich weiß, dass all dies irrelevant ist, wenn man das Richtige tut, also fsync () verwendet. (Dies war der Hauptgrund für alle Diskussionen über ext4 und Datenverlust - das Problem betraf nur Anwendungen, die nicht fsync () sind oder nicht im richtigen Moment.) Ich schreibe keine eigene Anwendung, frage ich, weil ich Ich weiß nicht, ob alle meine Anwendungen das Richtige tun, und ich möchte einen ungefähren Zeitrahmen für solche "gefährlichen" Schreibvorgänge kennen. Der Grund für die Frage ist, dass mein Grafiktreiber regelmäßig Kernel-Panics verursacht, und ich möchte wissen, ob ich mir Gedanken über mehr als die letzten 5 Sekunden beim Schreiben von Daten machen muss.
quelle
sync
(oder auch beim Auslösen des Commit-Intervall-Timers) völlig irrelevant ist. Zum Zeitpunkt dersync
Fertigstellung sind absolut keine unsauberen Daten, Metadaten oder Journalseiten vorhanden. Alle Änderungen am Dateisystem während der synchronen Datenübertragung werden blockiert, bis sie abgeschlossen sind.commit=...
undsync
sind NICHT gleichwertig? Oder bedeutete dies auch, dass selbst mit async
keine nicht zugewiesenen Seiten festgeschrieben werden ? Ich kann mir nicht vorstellen, dass dies der Fall ist, da dies gegen POSIX-Spezifikationen verstoßen würde. Vielleicht könnten Sie , dass Bash - Skript verwende ich für eine bessere Datensicherheit zur Verfügung gestellt: PWas auch immer die Antwort auf Ihre Frage ist, es spielt keine Rolle.
Das garantierte exponierte Verhalten des ext4-Dateisystems ist, dass "Daten nach einem erfolgreichen
sync
/fsync
Aufruf auf der Disc sein werden ". Wenn Sie also eine Anwendung haben, mit der Sie diese Frage stellen, sollten Sie Synchronisierungsaufrufe an den kritischen Stellen einfügen, an denen die Datenintegrität sichergestellt werden muss. Wenn Sie ein Benutzer sind, der sich wegen desselben Problems Sorgen macht, können Sie dassync
Befehlszeilendienstprogramm aufrufen, bevor Sie das gefährliche Verhalten ausführen, das zu einem unsauberen Herunterfahren führen kann.quelle