我一直在尝试 NFSv4 中的用户/组 ID 映射(转换)。我想要实现的是基于名称的 ID 转换,它与服务器和客户端上的实际 UID/GID 无关。
许多指南和文章都提到,要使 ID 映射正常工作,您必须在客户端模块和服务器上的模块中将nfs4_disable_idmapping
参数设置为0
(又名 N)。但是,我没有找到任何关于此参数具体作用的信息或文档。nfs
nfsd
作为实验,我配置了 NFSv4 服务器和客户端(使用sec=krb5
),并故意将这些参数保留为默认值(禁用映射)。我可以验证服务器上的映射是否已禁用:
$ cat /sys/module/nfsd/parameters/nfs4_disable_idmapping
Y
在客户端上:
$ cat /sys/module/nfs/parameters/nfs4_disable_idmapping
Y
我在服务器上创建了用户bob(uid=1002)
和,在客户端上创建了用户和。如您所见,UID 不匹配,但是用户仍然正确映射。用户在上创建的文件在服务器上被视为所有者,反之亦然。sam(uid=1001)
bob(uid=1003)
sam(uid=1004)
bob
bob
此外,如果我查看客户端上的日志:
nfsidmap[1874]: key: 0x322c739a type: uid value: [email protected] timeout 600
nfsidmap[1874]: nfs4_name_to_uid: calling nsswitch->name_to_uid
nfsidmap[1874]: nss_getpwnam: name '[email protected]' domain 'home.lan': resulting localname 'bob'
nfsidmap[1874]: nfs4_name_to_uid: nsswitch->name_to_uid returned 0
nfsidmap[1874]: nfs4_name_to_uid: final return value is 0
在服务器上:
rpc.idmapd[1717]: nfsdcb: authbuf=gss/krb5p authtype=user
rpc.idmapd[1717]: nfs4_uid_to_name: calling nsswitch->uid_to_name
rpc.idmapd[1717]: nfs4_uid_to_name: nsswitch->uid_to_name returned 0
rpc.idmapd[1717]: nfs4_uid_to_name: final return value is 0
rpc.idmapd[1717]: Server : (user) id "1002" -> name "[email protected]"
它们都表明 ID 映射确实有效“按名字”而不是“按 ID”。
所以我的问题是:nfs4_disable_idmapping
如果参数似乎对 ID 映射没有任何可观察到的影响,那么它的作用是什么?
答案1
你遇到了一个糟糕的测试用例。根据内核文档 nfs4_disable_idmapping
sec=sys
选项仅在使用时才有意义。