在Ubuntu(xenial aka 16.04)上,所有客户端在所有NFS4挂载的目录中显示目录和文件所有者为nobody:nobody 。
用户和组数据库来自ldap的sssd ,客户端和服务器都使用相同的ldap sources / trees和getent passwd $user ,显示正确的条目( $user是非本地的,即ldap用户条目,所以ldap似乎工作)。
用户可以写入他们所拥有的目录(即使操作系统显示nobody:nobody ),新文件最终也会在服务器上拥有正确的所有权,例如在ldap树中定义的正确的UID:GID 。 但是,Ubuntu用户看不到,谁拥有哪个文件,这是非常奇怪的。 此外,ssh似乎也做了一些检查,因此无法使用其授权密钥方法(即无密码)login,也不会使用〜/ .ssh / *中的任何设置,除非在CLI上明确指定。 这是一场噩梦。 Solaris客户端完全没有问题,所以问题必须是与Ubuntu / Linux相关的。
passwd , group , shadow , services , netgroup , automount和hosts集有files [SUCCESS=return] sss 。 NEED_GSSD , NEED_STATD设置为no , STATDOPTS为“”。 还有什么我失踪?
这是由于NFSv4 idmap missconfiguration造成的。 根据nfs规范,客户端和服务器使用基于string的主体作为所有者和组的标识符。 本地idmapdconfiguration负责将这些主体转换为本地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
在服务器上。 和/或为了使更改永久化,请使用相应的模块configuration:
$ echo "options nfs nfs4_disable_idmapping=1" > /etc/modprobe.d/nfs.conf
和
$ echo "options nfsd nfs4_disable_idmapping=1" > /etc/modprobe.d/nfsd.conf
深入挖掘之后,看起来Linux NFS4客户端不是zone / cgroup / LXC。 即它盲目地使用来自全局区域(/etc/request-key.d/id_resolver.conf)的请求密钥configuration,从而导致调用/ usr / sbin / nfsidmap。 由于全球区域(GZ)是一个最小区域,它不知道在非全球区域(NGZ)别名容器中使用的身份。 顺便说一下,无论如何,将GZ自己的身份映射到1:1的NGZ可能被视为一个安全问题/ bug。
如果request-key会提供一个信息,以便能够从哪个区域或cgroup中发起请求,那么可以为GZ的/ usr / sbin / nfsidmap编写一个简单的包装器,它调用相应的/ usr / sbin / nfsidmap在相关的区域。 不幸的是,似乎没有办法,“恢复”这一缺失的信息。
所以现在的答案是:由于devise缺陷,不能正常工作。