在某些檔案系統上,建立檔案時,不僅需要對檔案本身呼叫 fsync(),還要對父目錄呼叫 fsync(),以使檔案建立持久。否則,目錄條目可能會因不乾淨的卸載而遺失;文件 inode 將被孤立。
對於 ext4 來說仍然如此嗎?
許多應用程式(例如 vim,由 strace 驗證)似乎僅在檔案上呼叫 fsync。這樣安全嗎?
更新:在提交 14ece1028b3ed53ffec1b1213ffc6acaf79ad77c對於內核,ext4 被專門更改,以便,停用日記功能,當對檔案本身進行 fsync() 處理時,父目錄條目會自動進行 fsync() 處理。但是啟用日記功能又如何呢?目錄 fsync() 是否是隱式的,因為它與建立新 inode 屬於相同交易的一部分?
答案1
我想說「這取決於」部分原因,因為 ext4 可以更改其日誌選項,以便記錄整個文件或僅記錄元數據,而這些文件是否立即提交部分取決於硬體配置。
在 ext4 至少安裝了元資料日誌且子系統不快取寫入的情況下,我建議您不需要 fsync 目錄。
應該注意的是,POSIX,甚至 ext4 都不能保證即使使用 fsync,檔案也能在系統崩潰時倖存下來。
這不是完整的回复,但相關部落格文章詳細闡述了日誌記錄和資料遺失問題。雖然不是最近的事,但我相信它仍然代表了當今 ext4 的狀態,並且他關於何時使用或不使用 fsync 的評論是有價值的。