如果有文件打开进行写入,`mount -o remount,ro` 是否保证失败?

Tom*_*ale 5 linux mount unmounting readonly

我正在研究一种安全且无竞争条件的umount -l可移动设备替代方案:

我打算:

  1. umount --move000权限目录下,因此绝对路径无法打开更多文件
  2. 交互式终止(或正常关闭)进程并打开文件进行写入
  3. 仅在步骤 (2) 完成后以原子方式重新挂载只读
  4. 交互式终止/关闭可能导致问题的只读进程
  5. 终于umount成功了

步骤 (3) 中存在竞争条件,其中可以rw在最后一次交互式 kill 之后和mount -o remount,ro.

mount -o remount,ro如果文件系统上有任何文件打开用于写入,是否保证失败?

手册页对此保持沉默,在发现设备即使在blockdev --setro.

Gil*_*il' 5

是的。相关代码在sb_prepare_remount_readonly(从 Linux 4.0 开始,代码在其他版本上的组织方式可能有所不同)。逻辑是:

  • 对于挂载的每个实例:
    • 如果该实例不是只读的:
      • 防止任何新作者注册 ( MNT_WRITE_HOLD)。
      • 如果有注册的作者,设置错误标志(返回EBUSY)。
  • 如果有任何文件已删除(inode 计数 = 0)但尚未删除(由于文件已打开而仍然存在),请设置错误标志。
  • 如果未设置错误标志,请将分区标记为只读。
  • 对于挂载的每个实例:
    • 停止阻止作家注册。

注册作家打开文件编写以及日常运营的写元数据(mkdirchmod等)。检查mnt_want_write对注册写入器计数增加的调用。

系统的设计确保只读重新挂载是写注册障碍:如果它成功,则没有注册写入器,特别是在重新挂载操作时不能打开任何文件进行写入。重新挂载后,没有文件可以打开写,所以仍然没有文件可以写。