RH254小结(四)NFS服务器的搭建 中介绍了linux下NFS服务器的搭建及Linux客户端的挂载。在实际应用,有可能遇到windows和linux之间互相挂载访问文件的情况,除了samba服务之外,也可以通过NFS实现。目前主流的windows OS 如 win7、win2008都默认已带有NFS客户端,只需要系统中开启即可。本篇就记录下windows客户端访问 linux NFS服务端。

一、防火墙与端口(centos6.x与centos7.x的区别)

在进入正题之前,先完善下上一篇中有关端口和防火墙配置部分。在centos中有一个配置文件/etc/sysconfig/nfs用于配置nfs中的一些参数项,其中用修改最多的是几个服务运行的端口。在centos6和centos5中lockd、rquotad、statd、mountd几个服务都运行在非固定端口,需要单独进行指定,常用的方法如下:

1# vim /etc/sysconfig/nfs
2增加如下几行
3RQUOTAD_PORT=10001
4LOCKD_TCPPORT=10002
5LOCKD_UDPPORT=10002
6MOUNTD_PORT=10003
7STATD_PORT=10004

重启服务后,相应的在iptables 防火墙的配置如下:

1iptables -A INPUT -p tcp --dport 111 -j ACCEPT    //rpcbind端口,tcp和udp都用
2iptables -A INPUT -p udp --dport 111 -j ACCEPT
3iptables -A INPUT -p tcp --dport 2049 -j ACCEPT   //nfs服务端口,tcp和udp都用
4iptables -A INPUT -p udp --dport 2049 -j ACCEPT
5iptables -A INPUT -p tcp --dport 10001:10004 -j ACCEPT  //上面设置的几个服务的端口
6iptables -A INPUT -p udp --dport 10001:10004 -j ACCEPT

在新的发行版本中lockd服务端口不固定位,其他几个服务端口系统都已增加为预设为固件端口。具何查看/etc/sysconfig/nfs和/etc/services 文件,如下:

在centos7中查看/etc/sysconfig/nfs配置文件,可以找到如下部分

 1# Note: For new values to take effect the nfs-config service
 2# has to be restarted with the following command:
 3#    systemctl restart nfs-config
 4#
 5# Optional arguments passed to in-kernel lockd
 6#LOCKDARG=
 7# TCP port rpc.lockd should listen on.
 8#LOCKD_TCPPORT=32803
 9# UDP port rpc.lockd should listen on.
10#LOCKD_UDPPORT=32769

具体可以对比下centos6 版本中该文件的变化。同时,在/etc/services 中可以找到如下部分:

 1# cat /etc/services
 2sunrpc          111/tcp         portmapper rpcbind      # RPC 4.0 portmapper TCP
 3sunrpc          111/udp         portmapper rpcbind      # RPC 4.0 portmapper UDP
 4idmaps          1884/tcp                # Internet Distance Map Svc
 5idmaps          1884/udp                # Internet Distance Map Svc
 6nfs             2049/tcp        nfsd shilp      # Network File System
 7nfs             2049/udp        nfsd shilp      # Network File System
 8nfs             2049/sctp       nfsd shilp      # Network File System
 9mountd          20048/tcp               # NFS mount protocol
10mountd          20048/udp               # NFS mount protocol

与centos6相比,这里将mountd服务的端口配置为了固定端口。所以在centos7下防火墙相应的配置如下:

1firewall-cmd  --permanent --add-service=mountd
2firewall-cmd  --permanent --add-service=nfs
3firewall-cmd  --permanent --add-service=rpc-bind
45firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind  --add-service=mountd
6firewall-cmd  --reload
7firewall-cmd --permanent --remove-service=nfs --remove-service=rpc-bind  --remove-service=mountd  //删除相应的端口

不过在centos7上也可以在/etc/sysconfig/nfs 文件中配置和/etc/services中预设值不相同的端口,例如最上面提到的连续端口10001-10004,相应的在防火墙中,可以如下配置:

1firewall-cmd --add-port=10001-10004/udp
2firewall-cmd --add-port=10001-10004/tcp

注:由于lockd 服务为非必须服务,我在这里并未在防火墙中例中。如有需要,也可以将其在/etc/sysconfig/nfs设置为固定端口后,在firewalld 中例外。

二、win7下挂载NFS共享

1、win7开启nfs挂载

这里以win7为例,打开控制面板---找到程序和功能---在windows功能中勾选NFS客户端和管理工具即可。勾选后需重启生效。

win7-nfs

LINXU服务端需要注意的是,在firewalld中必须将 rpcbind、nfs、mountd三个服务都配置例外,只例外前两个时win7挂载时会报错如下(在linux客户端挂载中,经测试只将前两个服务例外即可。不过规范起见,还是建议将三个服务都例外):

1#未在firewalld中例外mountd服务时
2C:\Users\Administrator>showmount -e 192.168.1.200
3RPC: 远程系统错误RPC: 端口映射器故障 - RPC: 已超时。
4#在firewalld中例外mountd服务后
5C:\Users\Administrator>showmount -e 192.168.1.200
6导出列表在 192.168.1.200:
7/nfs                               192.168.1.0/24

2、win7下挂载方法

挂载方法有如下两种:

1mount 192.168.1.200:/nfs x:
2mount \\192.168.1.200\nfs x:

挂载完成后就可以像操作本地盘一样操作远程共享目录了。

3、写权限问题

如果在LINUX服务端中未对共享的目录/nfs 设置为777权限或设置属主为nfsnobody:nfsnobody 时,win7挂载后默认是没有写的权限的(虽然在服务端设置的是rw权限)。mount查看后,发现默认挂载的uid和gid是-2 ,如下:

win7-mount

解决方法:让Win7在挂载NFS的时候将UID和GID改成0,打开注册表:HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\ClientForNFS\CurrentVersion\Default,增加两项:AnonymousUid,AnonymousGid ,并将其值设置为0 。如下图:

win7 NFS挂载注册表配置
win7 NFS挂载注册表配置

修改完注册表,重新启动计算机,重新mount(再使用mount查看会发现uid和gid变成了0),就能在win7下对nfs文件系统进行读写操作了。

三、windows提供NFS服务

在win2008 的服务里集成有NFS服务,所以NFS目前已经不再是Linux的专利。而在桌面版中没有该服务,不过在winxp时代,微软发布过一个sfu 软件包,可以让xp提供NFS服务,由于该包很古老的一个产物,未在win7在验证其适用性。