一  NFS介绍

 

    NFS用的比较多,但是更新没有想象的那么快,Nginx一年要迭代很多个版本,而NFS最新版本4.1是2010年更新的,到目前为止还没有更新过,但这并不影响NFS使用的广泛性

    RPC协议为Remote Procedure Call,即为远程过程调用,RPC需要为NFS提供一些支持,比如两台机器服务器端和客户端通信的时候,他们之间本身不能直接通信,需要借助于RPC这个协议来完成

NFS架构如下:

windowd nfs客户端 windows安装nfs 客户端_客户端

    有一个场景是:ABC三台服务器做成负载均衡,数据存储在A上,当A上的数据一旦发生了变化,就会立即将更新的的文件共享出来,B和C上马上就能看到,或者说B上更新了文件,A和C也能马上看到,这种需求我们可以通过NFS这个服务实现

NFS原理图如下:

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_02

    NFS原理:服务器端要启动一个NFS服务,服务器端要想给客户端提供服务,就要借助于RPC协议,而RPC协议是通过rpcbind这个服务所实现的,protmap是在centos5之前的版本中的叫法,在centos6、centos7中就叫做rpcbind,实际上是一个东西,最终都是启动这个服务,实现RPC通信;默认NFS不会监听任何端口,最终监听端口实现TCP/IP通信过程的是rpcbind这个服务产生的RPC协议实现的,rpcbind监听的端口是111,RPC通信时,NFS服务会在RPC协议里注册一个端口,NFS告诉RPC他自己通信的端口是什么,然后服务端RPC把这个端口号告诉客户端rpcbind,然后客户端这台机器再和服务端的这个端口通信,最终实现数据的传输(问题:网站数据存放是存放在一台机器上的吗?RPC通信只会传输端口号嘛?数据只通过两台机器RPC客户端机器会保留网站的数据文件吗?)

    NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,也就是说客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。

 



二 NFS服务端安装配置

    在做这个实验之前,我们先准备好了两台虚拟机,IP分别为192.168.31.157和192.168.31.149 ,他们中31.157做客户端,31.149做服务端,下面我们来安装配置

1、安装服务端软件

    # yum install -y nfs-utils rpcbind   //安装nfs-utils和rpcbind两个包

2、安装客户端软件

    # yum install -y nfs-utils    //安装nfs-utils

    从下图的安装过程可以看到,在安装nfs-utils的过程中,也会自动地将rpcbind安装上,所以上一个步骤命令中的rpcbind其实是可以省略的

windowd nfs客户端 windows安装nfs 客户端_网络_03

    安装完成后我们来查看两台机器监听的端口,此时已经监听了111端口了

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_04

3、在服务端编辑配置文件

    # vim /etc/exports

    在配置文件中加入以下内容:

    /home/nfstestdir/          //这行内容是服务端共享出来的目录,此目录目前还不存在,需要手动创建

    192.168.31.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)    //定义IP或IP段

windowd nfs客户端 windows安装nfs 客户端_python_05

4、在服务端创建分享目录

    # mkdir /home/nfstestdir/

5、更改分析目录权限

    # chmod 777 /home/nfstestdir/

6、启动rpcbind

    # systemctl start rpcbind   //如果没有启动rpcbind的话可以执行此命令启动rpcbind

windowd nfs客户端 windows安装nfs 客户端_网络_06

7、启动nfs服务

    # systemctl start nfs    

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_07

    # ps aux |grep rpc    //启动nfs服务成功后我们再来查看rpc,可以看到在启动nfs时会自动地启动rpc的一些服务

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_08

8、开机启动

    如果我们想让nfs开机启动,需要执行以下命令

    # systemctl enable nfs



三 NFS挂载选项

• rw   read write读写

• ro    read only只读

• sync 同步模式,内存数据实时写入磁盘,可以很快地将数据写到磁盘中去,但是这样会相应地降低磁盘的效率

• async 非同步模式,与sync相对,async会每隔一段时间将内存中的数据写入到磁盘中去,这样做的好处是能够保证磁盘的效率,不好的地方是万一断电,数据可能会丢失一部分

• no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大,客户端的root用户不受限制,可以像访问本地文件一样访问服务端的共享文件

• root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户

• all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户

• anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid



    客户端挂载

1、安装nfs-utils

    # yum install -y nfs-utils     //前面我们已经按照好了,在安装nfs-utils的过程中,也会自动地将rpcbind安装上,

2、查看客户端是否有访问服务端的权限

    # showmount -e 192.168.31.149   //这个IP就是我配置的NFS服务端IP

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_09

    上面的访问结果提示我们网络不通,原因之一可能是服务端rpcbind服务没有开启,没有监听111端口,我们可以使用下面命令查看

    # ps aux |grep rpc    //下图可以看到111端口已经开启

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_10

    另外一个原因可能是防火墙导致,要想让nfs实现正常的通信,我们还需要将防火墙关一下,因为nfs这个服务比较特殊,虽然rpc已经可以通信了,即使说111端口已经放行了,但是nfs不一定能够正常通信,因为他们用了一个不固定的端口,此时我们需要将服务端和客户端的防火墙先关闭

    # systemctl stop firewalld   //关闭服务端和客户端的防火墙

    # setenforce 0                     //只关闭服务端的SELinux

    然后我们再来查询访问权限,可以看到已经有访问权限了

    # showmount -e 192.168.31.149

windowd nfs客户端 windows安装nfs 客户端_windowd nfs客户端_11

    上图提示程序未注册,经查询资料,我们重启了rpcbind和nfs,再来执行上条命令,出现如下提示

windowd nfs客户端 windows安装nfs 客户端_python_12

    经排查,发现/etc/exports配置文件行首多了几个空格,修改这个文件

windowd nfs客户端 windows安装nfs 客户端_网络_13

    修改完毕后,我们来执行# exportfs -ar 

windowd nfs客户端 windows安装nfs 客户端_python_14

    没有提示错误,然后再来重启rpcbind和nfs,重启成功后,我们到用户端再次执行以下命令查看访问权限

    # showmount -e 192.168.31.149

windowd nfs客户端 windows安装nfs 客户端_python_15

    如果出现上图提示,则说明我们有读写服务端共享文件的权限

3、挂载

    我们需要在客户端将服务端提供的共享目录当作本地磁盘一样挂载

    # mount -t nfs 192.168.31.149:/home/nfstestdir/ /mnt/        //挂载

    # df -h             //查看挂载是否成功,可以看到我们已经成功挂载了

windowd nfs客户端 windows安装nfs 客户端_数据库_16

4、测试验证    

    下面我们来验证两边的数据是否能同步 ,首先是客户端的操作

    # cd /mnt            //首先切换到共享目录下

    # touch   lj.html           //然后我们在客户端共享目录下创建一个文件

    # ls -l                          // 查看新创建的这个文件的详细信息

windowd nfs客户端 windows安装nfs 客户端_客户端_17

    我们可以看到这个由客户端创建的文件的属主和属组均为mysql,然后我们又来查看下服务端

    # ls -l /home/nfstestdir     //查看下服务端共享目录下是否更新了刚才我们创建的文件lj.html

windowd nfs客户端 windows安装nfs 客户端_数据库_18

    上面的对比我们可以看到文件的属主和属组均为mysql,这是因为我们再/etc/exports文件中anonuid=1000,anongid=1000两处配置的意思就是让所有在共享目录中创建的文件其属主和属组均为此处设置的1000这个id号对应用户,下面我们来看下1000这个id对应的属主和属组是不是就是mysql呢

windowd nfs客户端 windows安装nfs 客户端_网络_19

  从这张图可以看到mysql用户的id号为1000

    其实无论是用户端还是服务端在这个目录创建的文件,其属主和属组均为mysql