Linux

如果有文件打開以供寫入,mount -o remount,ro 是否保證失敗?

  • August 17, 2017

我正在研究一種安全且無競爭條件的umount -l可移動設備替代方案:

我正在計劃:

  1. umount --move000權限目錄下,因此無法通過絕對路徑打開更多文件
  2. 以互動方式殺死(或正常關閉)打開文件以進行寫入的程序
  3. 僅在步驟 (2) 完成時以只讀方式自動重新掛載
  4. 以互動方式殺死/關閉可能導致問題的只讀程序
  5. 終於umount成功了

在步驟 (3) 中存在競爭條件,其中可以rw在最後一次互動式 kill 之後和mount -o remount,ro.

mount -o remount,ro如果文件系統上有任何文件打開寫入,是否保證失敗?

手冊頁對此保持沉默,在發現設備即使在blockdev --setro.

是的。相關程式碼在sb_prepare_remount_readonly(從 Linux 4.0 開始,程式碼在其他版本上的組織方式可能不同)。邏輯是:

  • 對於每個掛載實例:

    • 如果該實例不是只讀的:

      • 阻止任何新作者註冊 ( MNT_WRITE_HOLD)。
      • 如果有註冊的作家,設置錯誤標誌(返回EBUSY)。
  • 如果有任何文件被刪除(inode count = 0)但尚未刪除(由於文件打開而仍然存在),請設置錯誤標誌。

  • 如果未設置錯誤標誌,則將該分區標記為只讀。

  • 對於每個掛載實例:

    • 停止阻止作家註冊。

已註冊的寫入者是為寫入而打開的文件以及寫入元數據(、、等)的正在進行的mkdir操作chmod。檢查呼叫mnt_want_write哪個是註冊作者的計數增加的地方。

系統的設計確保只讀重新掛載是一個寫註冊屏障:如果成功則沒有註冊的寫者,特別是在重新掛載操作時不能有任何文件打開寫。重新掛載後,無法打開任何文件進行寫入,因此仍然沒有可以打開的文件進行寫入。

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