如果有打开的文件可供写入,“mount -o remount,ro”是否一定会失败?

如果有打开的文件可供写入,“mount -o remount,ro”是否一定会失败?

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

我正在计划:

  1. umount --move000权限目录下,因此无法通过绝对路径打开更多文件
  2. 以交互方式终止(或正常关闭)进程并打开文件进行写入
  3. 仅当步骤 (2) 完成时才以只读方式原子重新挂载
  4. 交互式终止/关闭可能导致问题的只读进程
  5. 终于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)但尚未删除(由于文件已打开而仍然存在),请设置错误标志。
  • 如果未设置错误标志,则将该分区标记为只读。
  • 对于安装的每个实例:
    • 停止阻止作家注册。

注册写入器是打开用于写入的文件以及写入元数据(mkdirchmod等)的持续操作。查看呼叫mnt_want_write这是注册作家数量增加的地方。

系统的设计确保只读重新安装是写入注册屏障:如果成功,则没有注册的写入器,特别是在重新安装操作时不能有任何打开的文件用于写入。重新挂载后,无法打开任何文件进行写入,因此仍然没有打开用于写入的文件。

相关内容