使用C,在Linux下运行,我试图弄清楚如何让2个不同的进程访问位于NFSv4文件系统上的同一个文件。具体来说,我想让一个程序打开一个文件进行读取,然后让第二个程序打开该文件进行写入。我打算使用AWS的新EFS(弹性文件系统),而EFS只是NFSv4。
程序的性质使得作者本质上只会附加到文件中。在作者完成并调用fflush之前,读者永远不会访问新附加的信息。
NFSv4是否支持这种情况?
或者是否有更好的方法来实现这种并发的NFSv4文件访问?
答案 0 :(得分:2)
NFS v4确实支持文件的字节范围锁定(如RFC 3530 "NFS version 4 protocol"摘录中所述):
<强> 1.4.5。文件锁定
使用NFS版本4协议,对字节范围文件锁定的支持是NFS协议的一部分。文件锁定支持的结构使得不需要RPC回调机制。这与以前版本的NFS文件锁定协议Network Lock Manager(NLM)不同。与文件锁相关联的状态在基于租约的模型下维护在服务器上。服务器为NFS客户端保留的所有状态定义单个租约期。如果客户端未在定义的时间段内续订其租约,则服务器可以释放与客户端租约相关联的所有状态。客户可以使用
RENEW
操作续订租约,也可以使用其他操作(主要是READ
)隐式更新租约。
有关锁定和基于租约的模型的更多详细信息,请参阅同一RFC的第8节。
您的程序需要使用fcntl
来管理锁定。我的建议是编写一个测试来检查EFS提供的NFS v4的实际实现是否支持按预期进行锁定(某些方面在规范中是可选的)。您可以参考this lock testing suite的源代码,它支持多客户端测试。