Linux如果有文件打開以供寫入,
如果有文件打開以供寫入,mount -o remount,ro
是否保證失敗?
我正在研究一種安全且無競爭條件的
umount -l
可移動設備替代方案:我正在計劃:
umount --move
在000
權限目錄下,因此無法通過絕對路徑打開更多文件- 以互動方式殺死(或正常關閉)打開文件以進行寫入的程序
- 僅在步驟 (2) 完成時以只讀方式自動重新掛載
- 以互動方式殺死/關閉可能導致問題的只讀程序
- 終於
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
哪個是註冊作者的計數增加的地方。系統的設計確保只讀重新掛載是一個寫註冊屏障:如果成功則沒有註冊的寫者,特別是在重新掛載操作時不能有任何文件打開寫。重新掛載後,無法打開任何文件進行寫入,因此仍然沒有可以打開的文件進行寫入。