我已经设置了 NFS4,并且 idmapd 可以正常工作。ls -l
客户端显示了正确的用户名,即使不同机器之间的用户 ID 不同。
但是,当用户 ID 不匹配时,我尝试访问文件时会收到“权限被拒绝”错误,即使ls -l
显示正确的用户名。当用户 ID 恰好匹配时,一切都正常。
sudo sysctl -w sunrpc.nfsd_debug=1023
对于失败的文件访问,在服务器系统日志中给出以下输出:
nfsd_dispatch: vers 4 proc 1
nfsv4 compound op #1/3: 22 (OP_PUTFH)
nfsd: fh_verify(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsv4 compound op ffff88003d0f5078 opcnt 3 #1: 22: status 0
nfsv4 compound op #2/3: 3 (OP_ACCESS)
nfsd: fh_verify(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsd: fh_verify - just checking
nfsv4 compound op ffff88003d0f5078 opcnt 3 #2: 3: status 0
nfsv4 compound op #3/3: 9 (OP_GETATTR)
nfsd: fh_verify(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsd: fh_verify - just checking
nfsv4 compound op ffff88003d0f5078 opcnt 3 #3: 9: status 0
nfsv4 compound returned 0
nfsd_dispatch: vers 4 proc 1
nfsv4 compound op #1/7: 22 (OP_PUTFH)
nfsd: fh_verify(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsv4 compound op ffff88003d0f5078 opcnt 7 #1: 22: status 0
nfsv4 compound op #2/7: 32 (OP_SAVEFH)
nfsv4 compound op ffff88003d0f5078 opcnt 7 #2: 32: status 0
nfsv4 compound op #3/7: 18 (OP_OPEN)
NFSD: nfsd4_open filename dom_file op_stateowner (null)
renewing client (clientid 4f96587d/0000000e)
nfsd: nfsd_lookup(fh 28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba, dom_file)
nfsd: fh_verify(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsd: fh_verify - just checking
nfsd: fh_lock(28: 00070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba) locked = 0
nfsd: fh_compose(exp 08:01/22806529 srv/dom_file, ino=22809724)
nfsd: fh_verify(36: 01070001 015c0001 00000000 9853d400 2a4892a5 4918a0ba)
nfsd: fh_verify - just checking
fh_verify: srv/dom_file permission failure, acc=804, error=13
nfsv4 compound op ffff88003d0f5078 opcnt 7 #3: 18: status 13
nfsv4 compound returned 13
这对任何人都有用吗?任何有关调试此问题的提示都将不胜感激。
Server kernel: 2.6.32-40-server (Ubuntu 10.04)
Client kernel: 3.2.0-27-generic (Ubuntu 12.04)
我的新服务器运行时也存在同样的问题3.2.0-27-generic (Ubuntu 12.04)
。
谢谢。
答案1
NFSv4 在客户端和服务器之间使用 utf8 字符串主体。因此,在客户端和服务器上使用相同的用户名和 nfs4 域就足够了。uid 可以不同。但是……如果您使用 AUTH_SYS(使用 sec=sys 挂载,这是默认值),您的 RPC 请求(而不是 kerberos 主体)将使用来自客户端主机的 uid 和 gid。在这种情况下,如果客户端和服务器上的 uid 不同,您将被拒绝访问。在 RPCGSS_SEC 的情况下,您的 kerberos 主体被发送,服务器上将使用相同的 idmapd 将其映射到本地 uid 和 gid。ls -l 按预期工作,因为它使用 idmapd 将文件所有者和组 ID 映射到主体,然后将其发送到客户端。