如何在本地网络中获取连接到NFS服务器的客户端列表?

12

我有一个NFS服务器,其文件夹权限如下。有50个客户端需要在同一网络内连接到该服务器。我想知道从服务器查找哪些客户端正在访问此服务器的命令是什么。

NFS服务器配置文件如下。

[root@server ~]# cat /etc/exports
/home/guests    *(rw,sync)
/india          *(rw,sync)

以下是共享文件夹列表。
[root@server ~]# showmount -e
Export list for server.sanith.com:
/india       *
/home/guests *

为了测试目的,我现在已经将一个客户端连接到服务器。下面的输出来自“client2”机器。

[root@client2 ~]# showmount -e 192.168.1.10
Export list for 192.168.1.10:
/india       *
/home/guests *
[root@client2 ~]# mount -t nfs 192.168.1.10:/india /test
[root@client2 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.10:/india on /test type nfs (rw,vers=4,addr=192.168.1.10,clientaddr=192.168.1.12)

我尝试使用showmount -ashowmount -d命令,但不确定我错过了什么,因为它没有列出连接的客户机。

[root@server ~]# showmount -a
All mount points on server.sanith.com:
[root@server ~]# man showmount
[root@server ~]# showmount -d
Directories on server.sanith.com:
[root@server ~]# netstat -an | grep 192.168.1.10:2048
[root@server ~]# netstat -an | grep 192.168.1.10:2049
[root@server ~]# cat /var/lib/nfs/rmtab
[root@server ~]#

注意:在进行测试期间,服务器的防火墙已被暂时禁用。请提供建议。
5个回答

23

您可以在NFS服务器上运行以下命令来查找已连接的NFS客户端:

netstat | grep :nfs

2
这在我的CentOS 6.x上没有起作用。我不得不这样做:sudo netstat -a | grep nfs - Jason Priebe
为避免延迟,请使用netstat -n进行“不解析名称”并搜索: 843(默认端口),而不是:nfs。 - Juanga Covas
默认端口不是2049吗? - deed02392

10

从 Linux 内核版本 5.3 开始,您可以使用特殊目录 /proc/fs/nfsd/clients

您可以通过 uname -r 命令检查内核版本。


7

由于 netstat 并非总是可用,因为它将被替换为 ss,您可能要使用以下命令:

ss -a|grep nfs


5
NFS可以通过UDP和TCP工作,只有打开的TCP连接会显示在netstat或ss中。此外,作为分布式文件系统,它(历史上)遇到了相当多的问题(状态、缓存、锁定、通知、安全等),其中一些问题可以通过额外的RPC功能(例如rpc.statd)得到解决。在Linux NFS服务器上(参见man rpc.mountd),客户端挂载/卸载请求记录在/var/lib/nfs/rmtab中,就像/etc/mtab一样,因此答案应该是:
cat /var/lib/nfs/rmtab

如果为空,则可能存在rpc.mountd问题(因此您应该检查正在运行的RPC服务),或者所有客户端都是不使用此功能的NFSv4。
在我检查过的版本中,rmtab显示为:
10.1.2.0/24:/path/to/export1:0x000...flags
10.1.2.10:/path/to/export1:0x0000...flags
10.1.2.22:/path/to/export1:0x0000...flags
10.1.2.0/24:/path/to/export2:0x000...flags
10.1.2.22:/path/to/export2:0x0000...flags
10.1.2.99:/path/to/export2:0x0000...flags

即,列出每个挂载点,然后列出使用它的客户端。

请注意手册页中的警告:

然而,该文件大多是装饰品。一、客户端可以在调用rpc.mountd的UMOUNT过程后继续使用文件句柄。二、如果客户端在不通知rpc.mountd的情况下重新启动,则rmtab中将保留陈旧的条目。

在较新的内核中,/proc/fs/nfsd/client方法(@Vsevolod Gromov的答案)应该在这方面更好,但因为它仅支持NFSv4客户端,所以应该表现更良好。


2
netstat -a | grep nfs

这对我在Ubuntu GNOME 16.04上的操作有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接