Linux

是否保證嵌套文件系統在包含文件系統之前同步同步(1)?

  • June 21, 2018

我在一個文件中有一個 luks 加密的 ext4,用於儲存敏感數據(讓我們將此 FS 稱為“內部”)。該文件本身再次位於另一個 ext4 上,該 ext4 位於物理 SSD 上。讓我們稱其為“外部”。內部 FS 使用指向外部 FS 上文件的環回設備掛載。

當我呼叫 sync(1) 時,是否可以保證 Inner FS 的所有掛起寫入都被持久化?

如果同步以不幸的順序發生,則(在我的理解中)可能會發生以下情況:

  1. 數據寫入內部 FS。
  2. sync呼叫。
  3. 外部 FS 記憶體的寫入被寫入磁碟。
  4. 內部 FS 記憶體的寫入被寫入外部 FS 上的文件。
  5. 外部 FS 上的內部 FS 寫入仍在記憶體中。
  6. 崩潰發生。
  7. 儘管發生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)。這意味著環回驅動程序在支持環回塊設備的文件上顯式呼叫同步。

引用自:https://unix.stackexchange.com/questions/450786