本文已参与 新人创作礼 活动,一起开启掘金创作之路
前两天开发有这样的需求,在一台windows的开发机器上挂载一台linux服务器的nfs共享盘,其实windows和linux共享最好的方式是samba,既然有了这样的需求,还是做吧,下面分享下整个过程及问题处理。
1、首先在CentOS7上安装nfs
# yum install nfs-utils portmap rpcbind
2、创建共享分区
# mkdir -p /data/nfs
3、设置nfs
# vi /etc/exports
/data/nfs 192.168.60.0/24(rw,sync)
rw:允许读写
sync: 将数据同步写入内存缓冲区与磁盘中
还有很多其他选项,暂时不设置其他,保持默认设置
4、启动服务
# systemctl restart nfs nfs-server
# systemctl enable nfs nfs-server
# exportfs -rv
5、关闭防火墙
# systemctl stop firewalld
一切都看似很顺利,下面进入windows进行挂载:
6、在控制面板中打开nfs功能
7、右击进入映射网络驱动器
输入服务端地址:
点击了下浏览,查看是否能访问到,然后就是这样的结果,也不清楚微软什么原理,连不上就报错嘛,界面都直接挂了~~:
然后仔细看了下,是自己把IP写错了,177写成117了,好吧,重新再来一遍:
8、回到资源管理器
可以看到已经多了个Z盘
9、检查读写权限
尝试新建一个目录,发现并没有权限:
共享的时候明明已经设置了rw,这是为什么呢?因为NFS服务是没有用户验证功能的,所以服务器会将客户端的身份进行映射,将其映射为匿名用户nfsnobody。也就是说,当你用root用户去访问共享目录时,其实你已经变成了服务器端的匿名用户nfsnobodoy了,这样,你还有权限访问nfsnobody没有权限的文件吗?当然是不行的。
10、然后我就去给共享目录/data/nfs赋予了nfsnobody的所有权限
# setfacl -R -m u:nfsnobody:rwx /data/nfs
11、再次进入共享盘,尝试新建
发现还是一样的结果
然后在cmd中输入mount命令查看挂载详情:
然后发现windows这边的uid和gid都是2,再上服务器看下nfsnobody用户的uid、gid,发现是65534:
两边不一样,因此此时仅有共享目录的读权限。
12、既然不一样就修改成一样呗
在windows中修改nfs挂载用户的uid、gid需要修改注册表,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default中,添加DWORD值两项:AnonymousUid,AnonymousGid
然后重启主机,重新挂载一遍,尝试新建,可以正常写了。
可以看到新建的test的所属用户和组都已经变为nfsnobody了:
13、虽然读写都正常了,但是应用程序是用指定的普通用户跑的,所以用nfsnobody用户运行肯定是不行的.这里新建一个普通用户nfstest:
给共享目录赋予nfstest权限:
在/etc/exports配置文件中新增三个参数:all_squash,anonuid,anongid
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组
anonuid:将远程访问的所有用户都映射为本地用户,设置本地用户的uid
anongid:将远程访问的所有用户都映射为本地用户组,设置本地用户组的gid
重新启动nfs服务:
重新挂载,重新写文件,查看文件权限详情,发现新建的文件已经属于nfstest了.这样就完成了以指定用户读写的需求了。
本次因为权限的问题,一波三折,windows下的nfs共享还是挺繁琐的。没啥特殊需求还是使用samba吧,可以解决一些乱码、权限等问题。
好了,今天的分享就到这里了,希望对大家有所帮助,我们下期再见~~