升级到 14.04 后,NFS 挂载上的文件权限显示为“nobody”

Mar*_*nas 5 upgrade nfs 14.04

我有一个 Ubuntu 12.04 服务器,它通过 NFS 导出几个文件系统。

server$ cat /etc/exports
/home 192.168.42.0/255.255.255.0(rw,anonuid=65534,anongid=65534,async,no_subtree_check)
/stuff 192.168.42.0/255.255.255.0(rw,anonuid=65534,anongid=65534,async,no_subtree_check)
/stuff 192.168.99.0/255.255.255.0(ro,anonuid=65534,anongid=65534,async,no_subtree_check)
Run Code Online (Sandbox Code Playgroud)

我还有一个安装它们的客户端:

client$ cat /etc/fstab
...
server:/home    /home       nfs hard,intr,rsize=8192,wsize=8192,_netdev 0 0
server:/stuff   /server/stuff   nfs hard,intr,rsize=8192,wsize=8192,_netdev 0 0
Run Code Online (Sandbox Code Playgroud)

客户端的 IP 在 192.168.42.x 范围内。直到昨天,它一直在运行 Ubuntu 10.04。NFS 或多或少运行良好(有时它不会在启动时自动挂载,但我有一个 cron 脚本来检测和修复它)。

我昨天将客户端升级到 Ubuntu 12.04 并重新启动。NFS 继续正常工作。

我今天将客户端升级到 Ubuntu 14.04 并重新启动。现在 NFS 已挂载,但所有文件所有权信息都映射到 nobody:4294967294:

client$ ls -ld /home/weblate
drwxr-xr-x   5 nobody 4294967294     4096 Jan 29  2014 weblate
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我需要做什么才能使文件所有权再次生效?

Mar*_*nas 9

重要线索出现在/var/log/syslog

Sep 16 13:11:07 client nfsidmap[7340]: nss_getpwnam: name 'www-data@lan' does not map into domain 'localdomain'
Run Code Online (Sandbox Code Playgroud)

结合NFSv4Howto 的这段摘录

如果所有目录列表只显示“nobody”和“nogroup”而不是真实的用户名和组名,那么您可能需要检查/etc/idmapd.conf 中的域参数集。NFSv4 客户端和服务器应该在同一个域中。

和这个评论/etc/idmap.conf

# set your own domain here, if id differs from FQDN minus hostname
# Domain = localdomain
Run Code Online (Sandbox Code Playgroud)

结果我的服务器认为它的域是lan

server$ hostname -f
server.lan

server$ grep server /etc/hosts
127.0.1.1   server.lan server
Run Code Online (Sandbox Code Playgroud)

虽然我的客户没有域:

client$ hostname -f
client

client$ grep client /etc/hosts
127.0.1.1   client
Run Code Online (Sandbox Code Playgroud)

修复:/etc/hosts在客户端上编辑以阅读

127.0.1.1   client.lan client
Run Code Online (Sandbox Code Playgroud)

并重新启动。