
NFS介绍
NFS是Network File System 的缩写,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件和目录。nfs网络文件系统的使用很像windows server系统的网络共享、也和linux里的samba服务类似。
NFS系统已经经历了近30年的发展,它代表了了一个非常稳定的(及可移植)网络文件系统,具备可扩展,高性能等特性,并达到了企业级应用质量标准。
优势:
①利用网络传输降低延迟。
②使用成本低廉,在中小企业中使用广泛。
在中小型企业的业务架构中为用户提供业务访问的服务器有很多台,就是我们所说的集群架构。

在生产集群中,为什么需要NFS(共享存储角色)?
前提我们不包括负载均衡里hash取模思路。
当集群中没有NFS共享存储时,用户访问公司网站资源(图片等),如图所示:
这样的话,当用户再去取访问网站时,根据负载均衡设备转发原理,就不一定能够获取到数据了。

当集群中有NFS共享存储时,用户访问公司网站资源(图片等),如图所示:
这样的话,用户访问网站上传的数据就会被放在三台服务器当中。访问任何一台服务器都数据资源都会存在。


NFS系统原理介绍
NFS客户端(一般为应用服务器,如WEB)可以通过挂载(Mount)的方式将NFS服务器共享的数据文件目录挂载到NFS客户端本地系统中(就是某一个挂载点下),从NFS客户端的机器本地上看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的服务器目录!
先来看下NFS服务器与客户端的挂载结构图:
这样多台客户端就利用本地临时的mnt目录可以挂在同一个共享目录,用户访问web服务器 /mnt就相当于访问NFS服务端的 /share了。
这就是网络服务器的作用,给网络服务器提供网络共享存储的作用。

从开头对NFS服务的介绍中来看,我们得知NFS系统是通过网络来进行数据传输的。因此NFS会使用一些端口来传输数据。
由于NFS支持的功能非常多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据。那么NFS客户端是怎么知道服务端使用的是哪个端口呢?

RPC服务介绍

rpc主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求改端口和功能对应的信息传递给请求数据的NFS客户端,从而可以确保客户端可以连接。

在Cetos5.8版本rpc服务又称之为portamp服务,在6.6称之为rpcbind。
注意的是:在启动NFS server前,一定要先启动RPC服务,否则会造成NFS server无法向PRC服务注册。客户端无需启动NFS服务,但需要启动PRC服务。

NSF服务部署准备
服务器列表如下:

利用如下命令去查看操作系统内核版本等信息
[root@Centos6 ~]# cat /etc/redhat-release
[root@Centos6 ~]# uname -r
[root@Centos6 ~]# uname -m

部署NFS服务器端
部署NFS服务器端,在Centos6.6中默认没有安装NFS软件包。就
需要安装以下软件包:
nfs-utils:NFS服务的主程序。包括rpc、nfsd、rpc.mound
rpcbind:RPC的主程序。
rpm命令查看NFS软件包是否安装,如图所示没有安装。
[root@Centos6 ~]# rpm -qa nfs-utlis rpcbind

yum命令安装NFS软件包。
记住三台服务器必须都要安装这两个软件包
原因在于:依赖关系过于强,客户端可不配NFS-server。
[root@Centos6 ~]# yum install nfs-utils rpcbind -y

三台主机查看服务是否安装正常
[root@Cetos6 ~]# rpm -aq nfs-utils rpcbind

启动 NFS相关服务
在NFS服务端中启动rpcbind 服务。
我们在上面讲过因为NFS及其辅助程序都是基于RPC协议的,所以首先我们要确保系统中运行了rpc服务。
检查rpcbind服务是停止的。

启动rpcbind服务

检查rpcbind服务状态是运行状态:

我讲过rpc使用端口为111来监听来自客户端的NFS服务请求:
根据端口找服务的命令losf
losf 命令查看111号端口
[root@nfs-server ~]# lsof -i :111
111号端口rpc服务对外提供服务的主端口。

根据服务找端口----netstat
[root@nfs-server ~]# netstat -lntup|grep rpcbind

检查rpcbind开机是否自启动了。
[root@nfs-server ~]# chkconfig --list rpcbind

查看NFS服务向rpc服务注册的端口信息。
[root@nfs-server ~]# rpcinfo -p localhost
如图所示:我并没看到太多的注册端口映射信息,原因在于NFS服务还没有启动。

先检查下NFS服务状态:
[root@nfs-server ~]# /etc/init.d/nfs status
NFS服务是停止的。

启动nfs服务
[root@nfs-server ~]# /etc/init.d/nfs start
如图所示:我们能看到响应的功能已经OK

根据服务找端口----netstat
[root@nfs-server ~]# netstat -lntup|grep nfs
我在nfs官方描述中曾经记得nfs的服务主端口所对应的服务是nfs,可是查看服务却是找不到相应的端口号来,
汗颜.......



根据端口找服务的命令losf
losf 命令查看2049号端口
同样.....依然看不到NFS主程序和端口。





暂用过滤已知端口寻找。
[root@nfs-server ~]# netstat -lntup|grep 2049

[root@nfs-server ~]# rpcinfo -p localhost
如图所示:产生了很多端口映射。

在实际的生产环境中,当我们安装完NFS服务后,专业的人员会把rpcbind和nfs自启动放到rc.local中去。
[root@nfs-server ~]# vi /etc/rc.local


NFS服务常见进程详解
通过ps命令查看NFS启动后,系统中运行的NFS相关进程
[root@nfs-server ~]# ps -ef|egrep "rpc|nfs"
具体进程作用如下:(了解级别)
rpc.statd:检查文件一致性。
rpc.rquotad:磁盘配额进程。
rpc.mountd:权限管理验证。
nfsd:NFS主进程,用来管理登入,ID身份判别等。

这里我们需要知道的是NFS服务的主要任务是共享文件系统数据,而文件系统数据的共享离不开权限问题,因此NFS启动时最少需要两个不同的进程,一个是管理NFS客户端是否能够登入rpc.nfsd主进程,一个管理NFS客户端是否能够取得相应的权限rpc.mountd进程。


实战配置NFS服务器端
实现:NFS server上一个/share的目录共享给192.168.0.0/24整个网段的主句且可读写。
NFS服务的默认配置文件路径为:
[root@nfs-server etc]# ls -l /etc/exports

这个文件默认是空的,需要用户自行配置。

在服务端中新建一个/share目录
[root@nfs-server /]# mkdir share

配置语法:
/share 192.168.0.0/24(rw,sync)

详细说明下这个配置实例里面的含义:


权限集的更多参数后续会详细介绍(初学者可了解。)

配置完检查写的内容。

平滑重启nfs服务,查看是否报错。

除了平滑重启,我们可以用如下命令加载配置,作用是一样的:
[root@nfs-server /]# exportfs -rv

在NFS服务端上查看挂载情况,能看到共享的路径记录就代表正确。
[root@nfs-server /]# showmount -e 127.0.0.1

在本机中进行试挂载,检查挂载结果:
[root@nfs-server /]# mount -t nfs 192.168.0.130:/share /mnt

利用df这个显示文件系统磁盘空间的使用情况命令查看:
如图所示证明是挂载上的。

在服务端的 /share下新建一个测试文件。
[root@NFS_server ~]# touch /share/share.txt

客户端调试配置:
首先客户端一定要安装nfs和rpcbind服务,可以不启动NFS服务

客户端需要启动rpcbind服务。
[root@Cetos6 ~]# /etc/init.d/rpcbind start

还是养成良好习惯,放到rc.local中去
[root@Cetos6 ~]# vim /etc/rc.local

现在就可以在客户端上去挂载这个共享目录了
当客户端上的挂载出现以下提示,造成这样的原因大多数是因为防火墙没有关闭。(这里的防火墙需要同时关闭服务端和客户端)

关闭防火墙:
[root@Client-1 ~]# /etc/init.d/iptables stop

客户端挂载前首先检查有权限需要挂载的信息,看看是否能够挂载,如图所示:
我们能清晰的看到共享了 /share目录
[root@Cetos6 ~]# showmount -e 192.168.0.130

客户端执行挂载命令挂载
[root@Client-1 ~]# mount -t nfs 192.168.0.130:/share /mnt

如图所示:这就是客户端挂载后的结果
[root@Client-1 ~]# df -h

也可以利用mount命令查看挂载后的结果:

在客户端上测试读写数据
如图所示:我们能看到刚才在服务端上创建的share.txt测试文件。
表示可读权限

新增一个文件。但是图中所示,是写入不了的!提示权限被拒绝。



造成这样的原因在于:刚才我们配置的NFS权限参数默认如下:
[root@NFS_server ~]# cat /var/lib/nfs/etab
默认所有的客户端写入文件和目录都会被压缩成默认的UID为65534的nfsnobody用户。这样的话在服务端中系统认为只有65534这个uid才有写入权限。

先来看下这个UID为65534是不是属于nfsnobody?
[root@NFS_server ~]# grep 65534 /etc/passwd

因此服务端调整权限给客户端,将/share目录被65534的用户拥有即可!
/shanre的目录属主给予nobody。
[root@NFS_server ~]# chown -R nfsnobody /share
这样的话,多个NFS客户端就可具有查看、修改、删除其他任意NFS客户端上传文件的权限。这在实战中作为集群存储共享尤为重要!!

最后我在nfs客户端上测试写入文件权限:
如图所示:文件和目录的权限属主变为nfsnobody。

测试完毕之后,我们养成习惯,还要讲客户端挂载启动命令写到rc.local中去

配置演示到此结束!谢谢!





