Linux
是否保證嵌套文件系統在包含文件系統之前同步同步(1)?
我在一個文件中有一個 luks 加密的 ext4,用於儲存敏感數據(讓我們將此 FS 稱為“內部”)。該文件本身再次位於另一個 ext4 上,該 ext4 位於物理 SSD 上。讓我們稱其為“外部”。內部 FS 使用指向外部 FS 上文件的環回設備掛載。
當我呼叫 sync(1) 時,是否可以保證 Inner FS 的所有掛起寫入都被持久化?
如果同步以不幸的順序發生,則(在我的理解中)可能會發生以下情況:
- 數據寫入內部 FS。
sync
呼叫。- 外部 FS 記憶體的寫入被寫入磁碟。
- 內部 FS 記憶體的寫入被寫入外部 FS 上的文件。
- 外部 FS 上的內部 FS 寫入仍在記憶體中。
- 崩潰發生。
- 儘管發生在
sync
.同步是否保證不會發生這種情況,或者我是否必須多次呼叫同步才能確定嵌套的文件系統層?
我要求使用 Linux,但如果 POSIX 對此有消息,我也會對此感興趣。
不幸的是,Debian 手冊頁上
sync(1)
沒有sync(2)
關於這種情況的資訊。
是的,這是有保證的。
您沒有明確說明您是如何執行嵌套文件系統的,但我將假設您使用的是塊環回設備。
在這種情況下,可以在核心原始碼中看到關鍵位:
static int lo_req_flush(struct loop_device *lo, struct request *rq) { struct file *file = lo->lo_backing_file; int ret = vfs_fsync(file, 0); if (unlikely(ret && ret != -EINVAL)) ret = -EIO; return ret; }
注意對 的呼叫
vfs_fsync(file, 0)
。這意味著環回驅動程序在支持環回塊設備的文件上顯式呼叫同步。