特定用户在指定客户端访问NFS共享遇Remote I/O error排查求助
环境配置
NFS服务器: NFSServerHOST NFS共享目录: NFSServerHOST:/MYSHARE NFS客户端1: CLNT1 NFS客户端2: CKNT2 NFS客户端3: CLNT3 客户端操作系统: RHEL 7 和 8 客户端用户: User1、User2 客户端本地挂载点: /var/NFSSHARE mount -t nfs4 NFSServerHOST:/MYSHARE /var/NFSSHARE
问题现象
所有客户端均成功挂载NFS共享,User1和User2原本可在3台客户端上对/var/NFSSHARE进行读写操作。之后CLNT1出现未知变化(暂未确认是否与服务器补丁或定时任务相关),仅User1无法在CLNT1上对/var/NFSSHARE执行读写操作,User2仍可正常操作;两位用户在CLNT2和CLNT3上均能正常读写。
User1在CLNT1执行读写时的错误为:Remote I/O error
重启CLNT1后问题消失,User1可恢复正常操作。
已完成的检查项
- 无版本不匹配:NFS客户端与服务器均配置为NFS V4;
- 白名单正常:3台客户端IP均已加入NFS服务器白名单;
- inode及lsof使用量均在正常范围内;
- 执行
nfs4_getafacl /var/NFSSHARE结果:# file: /var/NFSSHARE A::EVERYONE@:rwaDxtTnNcy - 以User1身份在CLNT1上执行
getfacl /var/NFSSHARE结果:# file: var/MQHA/ # owner: nobody # group: nobody user::rwx group::rwx other::rwx - 对比CLNT1(失败)与CLNT2(成功)执行I/O操作时的rpcdebug日志:
kernel: NFS: nfs_update_inode(0:57/3963604504 fh_crc=0xbf9e74c8 ct=2 info=0x427e7f) kernel: NFS: (0:57/3963604504) revalidation complete kernel: NFS: permission(0:57/3963604504), mask=0x1, res=0 kernel: NFS: permission(0:57/3963604504), mask=0x3, res=0 kernel: NFS: atomic_open(0:57/3963604504), Abhi kernel: --> nfs_put_client({2}) kernel: --> nfs4_alloc_slot used_slots=0002 highest_used=1 max_slots=1024 kernel: <-- nfs4_alloc_slot used_slots=0003 highest_used=1 slotid=0 日志从此处开始出现差异,此前成功与失败日志基本一致,仅数值不同。 Client1(失败) kernel: nfs4_free_slot: slotid 0 highest_used_slotid 1 kernel: NFS: permission(0:57/3963604504), mask=0x81, res=-10 kernel: --> nfs4_alloc_slot used_slots=0002 highest_used=1 max_slots=1024 kernel: <-- nfs4_alloc_slot used_slots=0003 highest_used=1 slotid=0 kernel: decode_attr_type: type=00 Client2(成功) kernel: decode_attr_type: type=0100000 kernel: decode_attr_change: change attribute=7148460619683717735 kernel: decode_attr_size: file size=0
问题咨询
现寻求问题排查建议:请问在客户端或服务器端还可开启哪些更详细的日志,以进一步定位错误原因?
客户端侧可开启的详细日志
细化NFS及RPC调试类别
在现有rpcdebug基础上,追加更针对性的调试项:# 开启NFS V4全类别调试 rpcdebug -m nfs -s nfs4 # 开启权限、inode、缓存相关调试 rpcdebug -m nfs -s permission,inode,cache # 开启RPC传输层调试,跟踪网络交互细节 rpcdebug -m rpc -s xprt调试完成后用
rpcdebug -m nfs -c all和rpcdebug -m rpc -c all关闭。系统调用跟踪
用strace捕获User1执行读写操作的完整系统调用流程,定位具体错误触发点:strace -o user1_nfs_trace.log -f -e trace=file,network,ioctl <User1执行的读写命令>NFS缓存状态监控
开启nfs_cache调试,同时记录问题发生时/proc/fs/nfsfs/volumes和/proc/net/rpc/nfs下的缓存状态文件内容。
服务器侧可开启的详细日志
NFS服务器V4详细日志
修改RHEL系统NFS配置,开启服务端 verbose 日志:# 编辑/etc/sysconfig/nfs,添加或修改 RPCNFSDARGS="-vvv" RPCMOUNTDARGS="-vvv" # 重启服务生效 systemctl restart nfs-server日志会输出到
/var/log/messages,重点关注User1来源请求的权限校验、会话处理过程。NFS服务器ACL与权限调试
开启服务端权限与ACL相关调试:rpcdebug -m nfsd -s acl,auth关闭调试用
rpcdebug -m nfsd -c all。客户端会话状态跟踪
监控服务器端NFS客户端会话信息,对比异常与正常客户端的差异:nfs4-sysstat cat /proc/fs/nfsd/clients
内容的提问来源于stack exchange,提问作者Abhishek

