在 Ubuntu(xenial 又名 16.04)上,所有客户端均显示所有 NFS4 挂载目录中的目录和文件所有者为没人:没人。
用户和组数据库来自ssd 的从 ldap 来看,客户端和服务器都使用相同的 ldap 源/树,并且getent passwd $user
显示正确的条目($user
是非本地的,即 ldap 用户条目,因此 ldap 似乎可以工作)。
用户可以写入他们拥有的目录(即使操作系统显示没人:没人)并且新文件最终也会在服务器上拥有正确的所有权,即正确的唯一识别码:GID如 ldap 树中所定义。然而,Ubuntu 用户无法看到谁拥有哪些文件,这很奇怪。此外,ssh 似乎会进行一些检查,因此无法使用其授权密钥方法(即没有密码)登录,也不会使用任何来自〜/.ssh / *除非在 CLI 上明确指定。这是一场噩梦。Solaris 客户端没有任何问题,因此问题一定与 Ubuntu/Linux 有关。
- /etc/idmapd.conf具有正确的域设置。
- /etc/nsswitch.conf有,,,,和集合 。
files [SUCCESS=return] sss
passwd
group
shadow
services
netgroup
automount
hosts
- /etc/default/nfs 常用已设置
NEED_GSSD
为NEED_STATD
不,STATDOPTS
到 ''。
我还遗漏了什么吗?
答案1
这是由于 NFSv4idmap缺少配置。根据 nfs 规范,客户端和服务器使用基于字符串的主体作为所有者和组的标识符。本地 idmapd 配置负责将这些主体转换为本地 uid 和 gid。通常这涉及 LDAP 或 NIS。
您可以通过以下方式强制客户端和服务器使用数字 ID:
$ echo Y > /sys/module/nfs/parameters/nfs4_disable_idmapping
$ nfsidmap -c
在客户端上,
# echo Y > /sys/module/nfsd/parameters/nfs4_disable_idmapping
在服务器上。并且/或者,为了使更改永久生效,请使用相应的模块配置:
$ echo "options nfs nfs4_disable_idmapping=1" > /etc/modprobe.d/nfs.conf
和
$ echo "options nfsd nfs4_disable_idmapping=1" > /etc/modprobe.d/nfsd.conf
答案2
深入研究后,发现 Linux NFS4 客户端不了解区域/cgroup/LXC。即它盲目使用全局区域 (/etc/request-key.d/id_resolver.conf) 中的请求密钥配置,从而调用 /usr/sbin/nfsidmap。由于全局区域 (GZ) 当然是最小区域,因此它对非全局区域 (NGZ) 别名容器中使用的身份一无所知。顺便说一句:将 GZ 自己的身份 1:1 映射到 NGZ 无论如何都可能被视为安全问题/错误。
如果 request-key 能够提供信息来推断请求是从哪个区域或 cgroup 发起的,那么当然可以为 GZ 的 /usr/sbin/nfsidmap 编写一个简单的包装器,它会调用相关区域中相应的 /usr/sbin/nfsidmap。不幸的是,似乎没有办法“恢复”这条缺失的信息。
所以目前的答案是:由于设计缺陷而无法正常工作。