【问题标题】:NFS - mv command from two clients file corruption?NFS - 来自两个客户端文件损坏的 mv 命令?
【发布时间】:2017-01-10 21:19:02
【问题描述】:

我有一个基本脚本,我想执行以下操作:

  1. 如果 new/file.txt 存在
  2. mv new/file.txt current/file.txt

现在 - 如果 2 台服务器要同时运行相同的脚本(可以访问相同的 NFS 文件共享):

  • 服务器 1 - 步骤 1. 检查文件是否存在。是的
  • 服务器 2 - 步骤 1. 检查文件是否存在。是的
  • 服务器 1 - 步骤 2. 开始执行“mv”命令
  • 服务器 2 - 第 2 步。????

从我在网上找到的信息来看,似乎服务器 2 会抛出一个错误 - 但没有文件损坏或任何值得关注的问题: http://nfs.sourceforge.net/

文件句柄指的是已删除的文件。文件被删除后 服务器,客户端在尝试访问文件之前不会发现 使用他们从以前的 LOOKUP 中缓存的文件句柄。使用 rsync 或 mv 来替换正在另一个客户端上使用的文件 是 导致 ESTALE 错误的常见情况。

我已尝试模拟此操作以确认但未能成功 - 所以我想在实施此策略之前检查这里:

问题: 我的理解是否准确 - 还是我需要使用不同的策略来确保 file.txt 不会损坏?

其他细节: 亚马逊 Linux 操作系统。安装的驱动器是 nsf4。文件最大可达 100MB

【问题讨论】:

  • 如果您要投反对票,请您提供一个理由,以便我可以相应地调整问题。

标签: linux race-condition nfs corruption file-locking


【解决方案1】:

check-if-file-exists 是一个典型的TOCTTOU 问题。

最简单的解决方法是检查,然后尝试mv。 如果没有要移动的文件,mv 将失败(并且不执行任何操作)。

【讨论】:

  • 好的,有道理。是否有可能服务器 1 开始执行 mv 并且服务器 2 在服务器 1 完成之前尝试 mv (即我猜该文件在源目录中仍然可见)?或者这是通过文件系统级别的一些互斥锁/锁来控制的?
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2014-04-09
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多