今天在使用NFS服务做共享目录时遇到了调用NFS服务的客户端如何与服务端做用户映射的问题,
案例如下:
NFS共享目录的所属用户和用户组为www:www,权限为740
drwxr-----. 5 www www 4096 Jul 20 17:40 share-resource客户端调用服务的用户和用户组同样为www:www
然而客户端用户却没有读写共享目录的权限。
通过查看文档得知,NFS在提供服务时有一个用户映射的机制在里面,配置参数如下:
all_squash:所有访问用户都映射为匿名用户或用户组;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
案例中我采取的是默认设置no_all_squash。
有人可能会问,客户端的请求用户和用户组是www:www,与共享目录的所有者和所有者用户组一致啊,为什么会没有读写权限?
实际上这里的用户匹配是根据用户ID和用户组ID进行的匹配,而非用户名和用户组名。因此,要解决这个读写权限问题,第一个方法就是修改客户端的用户ID和用户组ID,与NFS服务端保持对应。
除此之外,NFS的用户映射方式还提供了另外的选项:all_squash,即所有的客户端请求到了服务端都会被当作匿名用户,如果直接修改参数,显然也不能解决问题,因为共享目录的权限是740,匿名用户是没有读写权限的。幸运的是,NFS有以下两个配置参数可以使用:
anonuid=<UID>:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534);
anongid=<GID>:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534);
也就是说匿名访问的用户在服务端还有一次用户映射的机会,我们将案例中www用户的uid和www用户组的gid找到(uid为502,gid为503),添加到配置中即可。最终的配置信息如下:
/data/share-resource 192.168.100.200 (rw,sync,all_squash,anongid=503,anonuid=502)