参考:
https://www.cnblogs.com/devilmaycry812839668/p/15127755.html
由上面的参考资料我们可以知道在nfs服务端进行配置时对于客户端的权限设定主要有以下字段:
no_root_squash
root_squash
all_squash
anonuid
anongid
其中,no_root_squash,root_squash表示的意思正好相反,如果我们在服务端 /etc/exports中同时设置,如:
/data 192.168.11.66(rw,sync,fsid=0,crossmnt,no_subtree_check,root_squash,no_root_squash)
那么实际上还是将权限设置为no_root_squash,也就是说客户端如果使用root账户对挂载的文件系统进行操作时文件系统记录的账户权限为root。
同时,很神奇的事情是如果我们将root_squash和no_root_squash调换位置,即:
/data 192.168.11.66(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash,root_squash)
那么实际上还是将权限设置为root_squash,也就是说客户端如果使用root账户对挂载的文件系统进行操作时文件系统记录的账户权限为nobody。
其实,将root_squash,no_root_squash混写在一起是没有太多意义的。
root_squash : 只将客户端的root用户的操作记录为nobody用户的操作,客户端其他用户的操作均直接按照其真正的uid和gid进行。比如:客户端电脑上的uid=1004用户对客户端挂载的nfs进行操作,其权限就如何服务端上uid=1004的账户进行操作一样。换句话说就是只将客户端root用户映射为nobody,而客户端的其他用户uid则不进行映射。
而no_root_squash : 除了客户端root用户操作挂载的nfs时映射为服务端的root用户其他和root_squash一致,都是不对其他客户端uid进行映射操作,客户端上uid为多少的用户操作后在服务端上显示的权限也是该uid。
前面我们知道root_squash,no_root_squash 只能决定是否将客户端root用户映射为服务端的nobody,而客户端的其他uid均不做映射,而all_squash则决定是否将所有客户端的用户都映射为nobody。
那么no_root_squash 和 all_suqash 在一起是否能将客户端上的root在操作挂载的nfs时squash为nobody用户呢,如下配置:
/data 192.168.11.66(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash,all_squash)
发现,最终效果为 all_squash,
那么替换下位置呢,如下:
/data 192.168.11.66(rw,sync,fsid=0,crossmnt,no_subtree_check,all_squash,no_root_squash)
发现,最终效果依旧为 all_squash。
因此我们知道了以下需要的配置:
把root映射为nobody,其他用户不影响依旧使用相同uid权限,使用:root_squash配置。
把root映射为root,其他用户不影响依旧使用相同uid权限,使用:no_root_squash配置。
如果出现了all_squash 后则不管是什么uid全部映射为nobody。
此时即使出现root_squash和no_root_squash都不影响。因此root_suash和no_root_squash,all_squash共同出现意义不大。
那么默认的suqash 都是把客户端的用户映射为nobody:nogroup,那么我们可以不可以知道把客户端的账户映射为服务端的指定用户和组呢???那就需要使用anonuid 和anongid,如下:
/data 192.168.11.66(rw,sync,fsid=0,crossmnt,no_subtree_check,all_squash,anonuid=1014,anongid=1004)
其意思就是把客户端的所有账户全部映射为服务器端的uid=1014,gid=1004。其实anonuid和anongid本身意义不大,因为默认的映射为nobody:nogroup就已经基本够用了。