我有一个导出 NFS 共享 (NFS3) 的 netapp 服务器。
我正在监视 netapp 服务器上的 fpolicy,这意味着,我监听卷的所有文件读取操作(和共享..)。
在 CentOS 机器上,我挂载 NFS 并执行文件读取 (cat) 操作。
第一次我会做“cat”,在netapp中我可以看到有一个FILE READ事件。
但是,如果我做额外的“cat 文件名”,我不会让事件 FILE READ 计数器增加。
如果我到另一台机器上,挂载 NFS 共享,然后执行 cat,我会看到计数器加一。
我假设 - NFS 客户端具有内部缓存机制。
我想禁用 NFS 客户端缓存。
我使用以下命令安装了 NFS:
mount -o lookupcache=none,actimeo=0,noac 10.10.10.1:/vol/vol0_unix /mnt/nfs1
注意 lookupcache=none,actimeo=0,noac 选项 -取自 link。
我是否缺少其他 NFS 客户端缓存机制?
我的 NFS 客户端是:Linux CENTOS 6.4 2.6.32-358.el6.x86_64
机器 NFS 版本:
[ilan@DevCore-Centos6 nfs1]$ rpm -qa|grep -i nfs
nfs-utils-1.2.3-36.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64
[ilan@DevCore-Centos6 nfs1]$
我假设cachefilesd默认没有运行。
我认为您的问题是正在进行的缓存与 NFS 无关。这是我在五秒钟内第二次
md5sum
执行一个小型 NFS 挂载文件时在网络上看到的内容:内核所做的只是检查文件是否未被修改,使用 a
getattr
(因为它正确地没有缓存任何属性,而是返回服务器获取新的属性)。然后它知道文件没有被修改,因此它可以使用仍然包含内容的核心页面。如果我理解正确的话,这也正是它对本地文件所做的事情。因此,您并不是要关闭NFS 缓存,而是要修改 VM 子系统中的文件缓存,以使其不适用于 NFS 挂载的内容。这可能要困难得多,因为您不是要关闭已经存在的东西,而是要引入一个全新的区别,如果您关注我的话,现在可能不存在。
我想我同意 Andrew Henle 的观点,这听起来像是一个 XY 问题。也许你应该告诉我们你真正想要做什么。
编辑:您断言本地文件访问并非如此。然而,我认为你错了。我已将 HDD 连接到只有一个进程可以访问的桌面,并且在用于监视进出物理设备的流量
md5sum
时,我连续两次使用了一个文件。iostat
第一次:
注意来自驱动器的读取流量 (rkB/s);现在第二次:
所以看起来,VM子系统也阻碍了。因此,目前我认为没有理由认为您没有在您的 netapp 上看到客户端正确生成的所有流量,我再次问,您实际上想在这里做什么? 为什么您“必须禁用 [缓存],并从 redhat 发送实际的 FILE READ ”?因为目前看来,这确实不是问题。
假设您正在测试 fpolicy 并且只是在寻找一种可靠地生成一些流量的方法,我将完全跳过 OS NFS 堆栈,而只使用使用libnfs或其他东西的 python 脚本。您对何时生成 NFS 操作具有完整的、记录在案的控制权。操作系统不是为此而设计的,一个快速的谷歌告诉我,虽然它应该可以工作,但它并不明显,当然也不是默认行为。