我使用以下设置:
NFS 服务器(Ubuntu 16.04 LTS)
- nfs-common 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
,似乎也没有任何效果。
我发现的第二件事是我的客户端服务器上不存在 2 个条目:
- /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 的官方文档在这里并没有真正的帮助,除非我完全失明!
预先感谢您的帮助。
nfs id 映射存在很大的混淆。当字符串形式的主体(如 [email protected])必须转换为数字 id 时使用的映射,反之亦然。但是,当您使用 sec=sys 挂载时,您显然会这样做,然后所有请求都使用客户端的本地 UID 和 GID 进行身份验证。IOW,客户端进程的触摸UID 将是服务器上的文件所有者。
第二个困惑是Static可用于定义静态映射。根据手册页:
从字面上看,它需要 GSS-Authenticated 主体:
http://git.linux-nfs.org/?p=trondmy/libnfsidmap.git;a=blob;f=static.c;h=fffd4580847d2577d3fb9638a246069bdb8f12b5;hb=HEAD#l118
由于太多人需要静态映射,这可能必须修复,但是,您无法修复进程 UID 的使用。
要以 NFS 友好的方式解决它,最好的选择是使用 kerberos 并使用 sec=krb5 进行挂载。在这种情况下,您的进程可以为一个用户使用 kerberos 票证运行,但在本地仍具有不同的 UID。在这种情况下,可以使用静态映射来避免使用 LDAP。
好吧,这就是我的答案,也许不是我想要的,但至少它解决了我的问题,我继续。
基本上我已经确保每个用户都属于同一个组,在所有涉及的服务器上具有相同的 GID。然后我设置了共享目录中所有目录的组 ID:
我还检查了 umask 设置为 007 而不是 022、027。