2016-08-01 35 views
1

Ich habe ein Projekt, wo ich die Daten auf der Festplatte sehr häufig im Falle eines Stromausfalls aktualisieren müssen. Beim Überschreiben von genau 512b (1 Sektor meines Laufwerks) in der Datei mit Daten gleicher Länge markiert das Dateisystem die Sektoren, die geändert wurden, und aktualisiert sie auf der Festplatte, wenn sie zum Leeren bereit sind? Oder schreibt es die ganze Datei jedes Mal, wenn es eine Änderung löscht? Ich bin hauptsächlich mit ext4 beschäftigt, aber ich bin neugierig, ob es das gleiche mit jedem Dateisystem ist.Dateisystem: Überschreiben von Daten gleicher Länge

Wenn der Standard Änderungen nicht nachverfolgt, sondern die gesamte Datei überschreibt, gibt es eine Möglichkeit, dies zu ändern? Einige Schreiboptionen?

Antwort

1

Im Allgemeinen werden Linux-Dateien im Seitencache zwischengespeichert, und ob Seiten verschmutzt sind, wird auf Seitenebene verfolgt. Auf Intel x86-Plattformen beträgt die Seitengröße 4k. Wenn Sie also eine 4k-Seite verschmutzen, wird die 4k-Seite zurückgeschrieben.

Wenn Sie nur einen einzelnen 512-Byte-Sektor überschreiben und eine Festplatte mit 512-Byte-Sektoren haben möchten, können Sie die Datei mit dem O_DIRECT-Flag und bei einem 512-Byte-Schreibvorgang mit einem Dateioffset öffnen ist ein Vielfaches von 512 Bytes, und wenn der Speicherpuffer, von dem aus Sie den Schreibvorgang ausführen, ebenfalls 512 Byte ausgerichtet ist, können Sie den Seitencache umgehen, und der Schreibvorgang wird direkt auf den Datenträger übertragen (daher O_DIRECT).

Beachten Sie, dass eine Reihe von modernen Festplatten tatsächlich einen physischen 4k-Sektor verwenden, aber aus Gründen der Abwärtskompatibilität 512-Byte-Sektoren emulieren. Diese Platten werden manchmal 512e Sektoren (e für emuliert) genannt. Wenn Sie auf diesen Laufwerken einen 512-Byte-Sektor schreiben, führt die Festplatte einen Lese-Modifizier-Schreib-Zyklus aus, da das Laufwerk intern nur 4k gleichzeitig schreiben kann. Dies wird für Sie als Performance-Hit sichtbar sein, aber aus einer funktionalen Perspektive wird es ansonsten genauso aussehen wie eine traditionelle, altmodische 512-Sektoren-HDD.

+0

Und in einer 1mb-Datei, wenn ich 300b eines 512b-Sektors schrieb, würde es immer noch nur den einen Sektor überschreiben? Es würde nur einen Lesevorgang für den anderen 212b durchführen, bevor es den zu überschreibenden Sektor löscht? – Shenanigans

+0

Wenn Sie direkte E/A verwenden, müssen Sie eine direkte E/A-Leseoperation ausführen, gefolgt von einer direkten E/A-Schreiboperation, und die direkten E/A-Operationen müssen den direkten E/A-Regeln folgen um einen 512 ausgerichteten Lesevorgang auszuführen, ändern Sie die 300 Bytes und führen Sie dann einen direkten E/A-Schreibvorgang aus, der auch den direkten E/A-Regeln folgt, also muss der Puffer an einer 512-Byte-Grenze ausgerichtet sein schreiben müssen 512 Byte ausgerichtet sein, und die Länge muss ein Vielfaches von 512 Bytes sein. –

+0

Wenn Sie einen gepufferten Schreibvorgang durchführen, wird der Seitencache durchlaufen, was einen Lese-, Änderungs- und Schreibzyklus von 4k bedeutet. –