是否有可能从服务器端找出 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
或选项导出的内部文件系统,则可能会找到多个条目 - 在这种情况下文件名可能有助于识别正确的条目。)crossmnt
find