我正在研究一种安全且无竞争条件的umount -l
可移动设备替代方案:
我正在计划:
umount --move
在000
权限目录下,因此无法通过绝对路径打开更多文件- 以交互方式终止(或正常关闭)进程并打开文件进行写入
- 仅当步骤 (2) 完成时才以只读方式原子重新挂载
- 交互式终止/关闭可能导致问题的只读进程
- 终于
umount
成功了
步骤 (3) 中存在竞争条件,其中可以rw
在最后一次交互式终止之后和mount -o remount,ro
.
mount -o remount,ro
如果文件系统上有任何文件打开用于写入,是否一定会失败?
手册页对此没有提及,在发现这一点后我有点偏执即使在之后设备也是可写的blockdev --setro
。
答案1
是的。相关代码在sb_prepare_remount_readonly
(从 Linux 4.0 开始,代码在其他版本上的组织方式可能有所不同)。逻辑是:
- 对于安装的每个实例:
- 如果该实例不是只读的:
- 阻止任何新作者注册 (
MNT_WRITE_HOLD
)。 - 如果有已注册的写入器,则设置错误标志(返回
EBUSY
)。
- 阻止任何新作者注册 (
- 如果该实例不是只读的:
- 如果有任何文件已被删除(inode 计数 = 0)但尚未删除(由于文件已打开而仍然存在),请设置错误标志。
- 如果未设置错误标志,则将该分区标记为只读。
- 对于安装的每个实例:
- 停止阻止作家注册。
注册写入器是打开用于写入的文件以及写入元数据(mkdir
、chmod
等)的持续操作。查看呼叫mnt_want_write
这是注册作家数量增加的地方。
系统的设计确保只读重新安装是写入注册屏障:如果成功,则没有注册的写入器,特别是在重新安装操作时不能有任何打开的文件用于写入。重新挂载后,无法打开任何文件进行写入,因此仍然没有打开用于写入的文件。