尝试从 nfs 服务器端确定在只读 nfs 共享上正在访问哪些文件/目录

尝试从 nfs 服务器端确定在只读 nfs 共享上正在访问哪些文件/目录

是否有可能从服务器端找出 nfs 共享上正在使用的文件和应用程序?

我们从(只读)nfs 共享向用户提供文件/应用程序。过去 10 年里它从未被清理过。我能否在不监控客户端的情况下了解用户仍在使用什么?

我尝试查看访问时间,但它们在服务器上没有更新。我尝试查看锁定守护进程,但似乎没有文件/目录被锁定。我猜是因为它以只读方式安装的。

编辑
服务器基本是最新的,我们每年更新一到两次,无人值守升级正在运行以进行安全更新。数据已经积累了 10 年。Debian
9
内核 4.9.0-4-amd64
nfs-kernel-server 1:1.3.4-2.1

答案1

如何使用 Wireshark 捕获或过滤 NFS 端口?

您将能够看到不同的操作和所请求的内容。

答案2

你可以使用lsof -N <share> 它,它只会显示当前正在使用的文件。但你也许可以在几天内编写一些脚本来构建文档列表。只是一个想法

答案3

我只找到了两种方法可以做到这一点。一种是在服务器上使用 Systemtap。

另一种方法是使用 lsof -N 查询每个 NFS 客户端。您可以通过运行 showmount 获取客户端列表。如果您已设置 ssh 密钥,则此脚本是一个起点。如果您正在寻找特定的卷/挂载,则可以添加一个模式以进行 grep。

#!/bin/bash
mkdir /var/tmp/output.$$
for ip in `showmount --no-headers` ; do
  ssh -n $ip /usr/sbin/lsof -N > /var/tmp/output.$$/$ip &
done
wait
cat /var/tmp/output.$$/* | awk '{print $9,$10}' | sort -u
rm -rf /var/tmp/output.$$

答案4

除了使用 Wireshark(apt-get install tshark在 Debian 系统上;然后使用类似的方法tshark -f 'port 2049 && host 1.2.3.4' -i eth0 -w savefile -P -t ad,例如稍后使用 Wireshark 阅读),可能还想应用密件抄送-- 例如,使用跟踪.py效用如下:

# trace.py -n nfsd \
  'vfs_open(const struct path *pP, struct file * pF)  (pP->dentry) "%s (%d)", pP->dentry->d_name.name,pP->dentry->d_inode->i_ino'

PID     TID     COMM            FUNC             -
12333   12333   nfsd            vfs_open         testfile (1337)
12333   12333   nfsd            vfs_open         testdir (1336)

这是一个简单的cd testdir; echo 'abc' >testfile 在客户端上安装共享。

d_name.name这里当然是文件的名称,并且d_inode->i_ino是其 inode 编号。因此,如果已知导出的文件系统,则可以通过例如找到单个文件find $path -inum $inode

(如果在同一个根目录下有使用nohide或选项导出的内部文件系统,则可能会找到多个条目 - 在这种情况下文件名可能有助于识别正确的条目。)crossmntfind

相关内容