我在本地 NFS 服务器上运行 FreeBSD 12-RELEASE。以前它运行良好,但几天前我们的一些需要文件锁定的工具停止工作。锁定在其他服务器的 NFS 客户端上有效。
以下是我认为可能相关的一些信息:
在我们的 FreeBSD 服务器 san6 上:
root@san6:~ # lsof | grep rpc.lockd
lsof: WARNING: compiled for FreeBSD release 12.0-RELEASE-p5; this is 12.0-RELEASE.
rpc.lockd 1063 root cwd VDIR 2,16 1024 2 /
rpc.lockd 1063 root rtd VDIR 2,16 1024 2 /
rpc.lockd 1063 root txt VREG 2,16 73176 31059299 /usr/sbin/rpc.lockd
rpc.lockd 1063 root txt VREG 2,16 148320 12279169 /libexec/ld-elf.so.1
rpc.lockd 1063 root txt VREG 2,16 49560 31070185 /usr/lib/librpcsvc.so.5
rpc.lockd 1063 root txt VREG 2,16 1949672 46066959 /lib/libc.so.7
rpc.lockd 1063 root 0u VCHR 2,18 0t1091 530 /dev/pts/0
rpc.lockd 1063 root 1u VCHR 2,18 0t1091 530 /dev/pts/0
rpc.lockd 1063 root 2u VCHR 2,18 0t1091 530 /dev/pts/0
rpc.lockd 1063 root 3u unix 0xfffff8013dc176d0 0t0 ->0xfffff8013dec6a38
root@san6:~ # ps aux | grep lockd
root 1063 0.0 0.0 48016 13692 - Ds 11:54 0:00.43 rpc.lockd -d 2
root 3102 0.0 0.0 11256 2736 1 S+ 05:53 0:00.00 grep lockd
root@san6:/usr/ports # rpcinfo -p canada
program vers proto port service
100000 4 tcp 111 rpcbind
100000 3 tcp 111 rpcbind
100000 2 tcp 111 rpcbind
100000 4 udp 111 rpcbind
100000 3 udp 111 rpcbind
100000 2 udp 111 rpcbind
100024 1 udp 58683 status
100024 1 tcp 36401 status
100021 1 udp 33875 nlockmgr
100021 3 udp 33875 nlockmgr
100021 4 udp 33875 nlockmgr
100021 1 tcp 33610 nlockmgr
100021 3 tcp 33610 nlockmgr
100021 4 tcp 33610 nlockmgr
root@san6:~ # dmesg | tail -n 1
NLM: failed to contact remote rpcbind, stat = 5, port = 28416
root@san6:~ # mount | grep nfs
data0 on /data0 (zfs, NFS exported, local, noatime, nfsv4acls)
在我们的一个客户端“加拿大”上运行着 Centos 7.6.1810:
[root@canada ~]# dmesg | tail -n 10
[ 24.205026] virbr0: port 1(virbr0-nic) entered disabled state
[ 588.552140] FS-Cache: Loaded
[ 588.594282] FS-Cache: Netfs 'nfs' registered for caching
[ 888.710226] lockd: server san6 not responding, still trying
[ 1265.871541] lockd: server san6 OK
[ 1265.871551] lockd: unexpected unlock status: 7
[ 1415.519506] nfs: server san6 not responding, still trying
[ 1439.592184] nfs: server san6 OK
[ 2137.130503] nfs: server san6 not responding, still trying
[ 2622.383586] nfs: server san6 OK
[root@canada ~]# mount | grep /projects
auto.direct on /projects type autofs (rw,relatime,fd=29,pgrp=15535,timeout=300,minproto=5,maxproto=5,direct,pipe_ino=87674)
san6:/data0/projects on /projects type nfs (rw,nosuid,noatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.252.48.106,mountvers=3,mountport=816,mountproto=udp,local_lock=none,addr=10.252.48.106)
请注意 lockd 处于“Ds”状态,我不确定它正在等待哪个文件的磁盘 io。当我尝试终止/重新启动它时,以及在运行一段时间后,它似乎进入此状态。我尝试在打开调试标志(ps 日志中的 -d2)的情况下重新启动服务器,但在系统日志中没有看到更多信息。
我还尝试将服务器添加到我们的一个 Centos 7 客户端的受信任区域,看看是否有助于解决“NLM:无法联系远程 rpcbind,stat = 5,端口 = 28416”的问题,但似乎没有改变该客户端是否可以锁定文件。
我非常感谢任何关于这个问题的帮助!
更新:我在另一台服务器上重现了这个问题,症状仍然相同。我仍然不确定这里发生了什么。
答案1
我搞明白了。我以为将服务器添加到防火墙中单个客户端的受信任区域可以修复客户端。但事实是,所有客户端都需要将服务器的 IP/端口列入每个客户端防火墙的白名单。即使只有一个客户端被阻止,似乎也会破坏所有人的锁定。
在 CentOS 7 上,命令是
firewall-cmd --permanent --zone=trusted --add-source=<server's ip>
如果您不介意信任服务器的所有端口。不要忘记重新加载防火墙的配置:
firewall-cmd --reload