我有一个存储在 NFSv3 网络挂载上的配置文件config_file
,我想安全地更新该文件。
以下是我工作的条件和限制:
- 必须始终
config_file
为想要阅读的客户提供 - 客户端绝不能从部分重写的文件中读取损坏的数据
- 客户确实不是需要
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!-保持简单,傻瓜!” 这几乎从来都不是坏建议。