安全更新存储在 NFSv3 挂载上的配置文件

安全更新存储在 NFSv3 挂载上的配置文件

我有一个存储在 NFSv3 网络挂载上的配置文件config_file,我想安全地更新该文件。

以下是我工作的条件和限制:

  1. 必须始终config_file为想要阅读的客户提供
  2. 客户端绝不能从部分重写的文件中读取损坏的数据
  3. 客户确实不是需要config_file立即更新。只要满足限制 #1 和 #2,等待一两分钟让缓存更新是完全没问题的

两端的NFSv3实现都是RHEL(Red Hat Enterprise Linux)。

以下是我目前想到的:

客户端应用程序从 读取/mount/path/config_file,这实际上是一个符号链接/mount/path/config_file_current

让:

NEW = Path to the new configuration file that I'm try to install ( /path/to/my/workspace/config_file )
SYM = The path to the symlink ( /mount/path/config_file )
CURRENT = The path to the current version of config_file ( /mount/path/config_file_current )
TMP = The path to a temporary version of config_file ( /mount/path/config_file_tmp )
cp ${NEW} ${TMP}       # Initial copy of the new configuration file over the temporary file
ln -f ${TMP} ${SYM}    # Point the symlink to the temporary file [1]
rm ${CURRENT}          # To prevent torn reads, delete the previous file so that the file handle is "stale"
cp ${TMP} ${CURRENT}   # Copy the newest version of config_file back to ${CURRENT}
ln -f ${CURENT} ${SYM} # Point the symlink back to ${CURRENT}

[1]Symlink创建是 RFC 1813(NFSv3 规范文件)中定义为原子的仅有的两个 NFSv3 操作之一

此过程在运行本地文件系统的 RHEL 系统上应该是安全的,但在任何和所有 NFSv3 实现中却不是安全的,因为客户端可能会尝试从陈旧的文件句柄中读取。

我对 Server Fault 社区的问题是:对于客户端和服务器都运行 RHEL 的 NFSv3 实现,此过程是否安全?

我的大部分观点都基于以下两篇文章:

https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingUnixFiles

https://utcc.utoronto.ca/~cks/space/blog/sysadmin/SafelyUpdatingNFSFiles

答案1

在我看来,你把这件事弄得比实际更难/更复杂了。你显然在玩命名游戏,从我这个已经 40 年的系统管理员的角度来看,这不仅是不必要的,而且还会阻止你跟踪一些可能有用的信息,尽管你可能有其他方法来进行跟踪。

具体来说,这会更简单:

ConfigDir=/some/path/for/new/and/old/config_files
NewFile=${ConfigDir}/<file_basename>.yyyymmddhhmmss # Tracking, here by timestamp
cp ${NEW} ${NewFile}    # Save the new config file where you're going to link to it
ln -f ${NewFile} ${SYM} # Point the symlink to the new configuration file
# The following is only necessary if you need to hurry along finding the new config
rm ${CURRENT}           # To prevent torn reads, delete the previous file so that the file handle is "stale"
CURRENT=${NewFile}

我不知道您是否在循环结构中运行它,所以也许您需要以不同的方式设置 CURRENT 和/或 NewFile,但我想您会明白的。... 古老的格言是智慧:“KISS it!-保持简单,傻瓜!” 这几乎从来都不是坏建议。

相关内容