我使用以下设置:
NFS 服务器(Ubuntu 16.04 LTS)
- nfs-公共 1:1.2.8-6ubuntu1.2
- nfs 内核服务器 1:1.2.8-6ubuntu1.2
- 用户:测试(uid=1300)
NFS 客户端
- nfs-公共 1:1.3.4-2.1
- 用户:testmf(uid=1350)
在客户端,用户test
与服务器端具有相同的 UID。但我需要使用用户testmf
而不是test
那个。
我已阅读了大量文档和来自 StackOverflow/StackExchange 的答案,但由于某些原因,它们对我来说都不起作用。
众多答案之一是更改文件/etc/idmapd.conf
。
两边的情况如下:
服务器
[General]
Verbosity = 0
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if id differs from FQDN minus hostname
# Domain = localdomain
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
在客户端:
[General]
Verbosity = 9
Pipefs-Directory = /run/rpc_pipefs
# set your own domain here, if it differs from FQDN minus hostname
# Domain = localdomain
Domain = example.com
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
[Translation]
Method = static
[Static]
[email protected] = testmf
[email protected] = testmf
test@nfsserver = testmf
我使用这样的命令在客户端上挂载目录:
mount 192.168.0.1:/home/test/my_exp_dir /home/testmf/my_imp_dir
当我这样做时,ls -l /home/testmf/my_imp_dir
我得到了类似这样的结果:
-rw-r--r-- 1 test test 326025780 May 9 2017 allCountries.zip
并不是
-rw-r--r-- 1 testmf testmf 326025780 May 9 2017 allCountries.zip
如果我做到这一点,touch testfile
我会得到:
-rw-r--r-- 1 test test 326025780 May 9 2017 allCountries.zip
-rw-r--r-- 1 testmf testmf 0 Jun 9 18:57 testfile
或者ls -ln
-rw-r--r-- 1 1300 1300 326025780 May 9 2017 allCountries.zip
-rw-r--r-- 1 1350 1350 0 Jun 9 18:57 testfile
我尝试增加详细程度,但在我的日志中,我看不到用户从一个 UID 到另一个 UID 的映射,就像我在一些答案中看到的那样。我能看到的两个东西是内核设置/sys/module/nfs/parameters/nfs4_disable_idmapping
被设置为Y
,即使更改为N
,似乎也不起作用。
我发现的第二件事是这两个条目在我的客户端服务器上不存在:
- /proc/net/rpc/nfs4.nametoid
- /proc/net/rpc/nfs4.idtoname
而且我不知道如何添加它,特别是在 nfsidmap 不可用的情况下。
我读到过,idmapd
更改后我也需要重新启动服务。但在 Debian 9 中这是不可能的……或者至少我还没有找到如何做到这一点……
我还更改了文件/etc/default/nfs-common
来设置变量NEED_IDMAPD=yes
,但它什么也没做,即使重新启动后也是如此......
所以我的问题可能很愚蠢,但是如何在 Debian Stretch 上激活 nfsidmapd?我真的别无选择,搜索关键字和 Debian 的官方文档在这里真的没什么用,除非我完全瞎了眼!
预先感谢您的帮助。
答案1
nfs id 映射存在很大混淆。当字符串形式主体时使用的映射,如[电子邮件保护],必须转换为数字 ID,反之亦然。但是,当您使用 sec=sys 进行挂载时(您显然会这样做),所有请求都会使用客户端的本地 UID 和 GID 进行身份验证。换句话说,触碰客户端进程的 UID 将成为服务器上的文件所有者。
第二个困惑是静止的可用于定义静态映射。根据手册页:
“静态”转换方法使用 GSS 认证名称到本地用户名的静态列表。
哪个字面上地期望经过 GSS 认证的主体:
if (strcmp(secname, "krb5") != 0 && strcmp(secname, "spkm3") != 0)
return -EINVAL;
由于太多人需要静态映射,这个问题可能需要修复,但是您无法修复进程 UID 的使用问题。
要以 NFS 友好的方式解决此问题,最佳选择是使用 kerberos 并使用 sec=krb5 进行挂载。在这种情况下,您的进程可以使用 kerberos 票证为一个用户运行,但本地仍具有不同的 UID。在这种情况下,可以使用静态映射来避免使用 LDAP。
答案2
嗯,这是我的答案,也许不完全是我想要的,但至少它解决了我的问题,我可以继续。
基本上,我已确保所有涉及的服务器上的每个用户都属于同一组,且具有相同的 GID。然后,我使用以下命令设置共享目录中所有目录的组 ID:
find /share-dir -type d -exec chmod g+s {} \;
我还检查了 umask 设置为 007 而不是 022,027。