我尝试在两个不共享 UID/GID 的系统上使用 NFSv4 挂载。这是针对系统迁移的,旧环境使用任何可用的 UID/GID,而它们现在在新环境中发生冲突。我已在新环境中为所有用户提供了新的非冲突 ID。
我的问题是 NFS 挂载。我尝试使用 NFSv4,因为它将 ID 传递为字符串,而不是数字(这应该有助于映射)。我可以在旧环境中挂载一个文件系统,当我执行 时ls -l
,我在两边都看到了正确的名称(因此映射正在运行)。
当我尝试以用户身份(在两个系统上都存在且具有不同 UID 的用户)接触文件时,权限被拒绝。该用户是两个系统上正确组的成员(该组在两个环境中具有不同的 GID,但该用户在双方都是正确成员)。
还有其他选项可以解决我的问题(使用 NFSv3 并重新映射 UID/GID),但如果可以避免的话,我不想这样做。
这是我的配置和一些测试,以向您展示我所看到的内容......
服务器配置:
# chnfsdom
Current local domain: red.act.ed
# cat /etc/exports
/usr/sap/trans -vers=4,sec=sys,rw,root=172.29.4.56:172.29.4.55:172.29.4.65
# ls -ld /usr/sap/trans/data
drwxrwxr-x 2 d01adm sapsys 118784 Apr 23 08:25 /usr/sap/trans/data
# ls -nld /usr/sap/trans/data
drwxrwxr-x 2 300 300 118784 Apr 23 08:25 /usr/sap/trans/data
客户端配置:
# chnfsdom
Current local domain: red.act.ed
# mount | grep trans
devbox /usr/sap/trans /usr/sap/trans nfs4 Apr 23 09:01 vers=4
qabox:/ # ls -ld /usr/sap/trans/data
drwxrwxr-x 2 d01adm sapsys 118784 Apr 23 09:25 /usr/sap/trans/data
qabox:/ # ls -nld /usr/sap/trans/data
drwxrwxr-x 2 8 14 118784 Apr 23 09:25 /usr/sap/trans/data
根据这些信息,UID/GID 转换似乎运行正常。以下是问题所在(在客户端上)...
qabox:q01adm> pwd
/usr/sap/trans
qabox:q01adm> ls -ld .
drwxrwxr-x 14 d01adm sapsys 4096 Apr 23 09:56 .
qabox:q01adm> id
uid=12(q01adm) gid=14(sapsys) groups=0(system),7(security),4294967294(nobody),15(oper),16(dba)
qabox:q01adm> touch file
touch: 0652-046 Cannot create file.
以下是我可以在同一个客户端上使用 root 权限执行的操作:
qabox:/usr/sap/trans # pwd
/usr/sap/trans
qabox:/usr/sap/trans # id
uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit),11(lp),14(sapsys)
qabox:/usr/sap/trans # touch file
qabox:/usr/sap/trans # chown q01adm:sapsys file
qabox:/usr/sap/trans # ls -l file
-rw-r--r-- 1 q01adm sapsys 0 Apr 23 09:59 file
qabox:/usr/sap/trans # ls -nl file
-rw-r--r-- 1 12 14 0 Apr 23 09:59 file
在服务器框上,我看到了这个:
# ls -l /usr/sap/trans/file
-rw-r--r-- 1 q01adm sapsys 0 Apr 23 08:59 /usr/sap/trans/file
# ls -nl /usr/sap/trans/file
-rw-r--r-- 1 302 300 0 Apr 23 08:59 /usr/sap/trans/file
因此,从我所看到的一切来看......UID/GID 转换工作正常,我只是无法以非 root 用户身份在客户端上写入文件。
答案1
据我有限的知识,NFSv4 ID 映射仅适用于 stat() 结果和通过 NFS 本身发送的其他信息,即 由 发送chown
、由ls
或返回的文件所有者stat
等。
但是,身份验证由较低级别 SunRPC 处理,它仍然使用默认 AUTH_UNIX 协议中的数字 UID。因此,如果您是本地用户 #12,那么服务器也会收到该信息。
为了避免这种情况,您需要一个支持用户名的身份验证机制;Kerberos(AUTH_GSS)可能是唯一的选择。