nfs

已知samba主要用于linux与windows之间共享文件夹
那用于Linux之间进行文件共享则是用NFS服务(Network FileSystem)
目的在于让不同的机器,不同的操作系统可以彼此分享各自的文件数据。

NFS服务可以将远程Linux系统上的文件共享资源挂载到本地机器的目录上。
(Linux用户在自己本地有一个文件夹,通过NFS服务,把本地的这个文件夹,远程挂载到网络中一台机器的文件夹,)


NFS很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和Linux系统的samba服务类似。
一般情况下,Windows网络共享服务或samba服务用语办公局域网共享,而中小型网站集群架构后端通常用NFS数据共享,如果大型网络集群,还会用更复杂的文件系统,如GlusterFS、FastDFS等。
NFS系统已有30年发展历史,代表了一个稳定的网络文件系统,具备可扩展,高性能等特点。
由于网络速度的加快和延迟的减少,NFS系统一直是通过网络提供文件系统的不错的选择,特别是在中小型互联网企业用的广泛。

NFS在企业的应用架构

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、静态文件,通常网站用户上传的文件也都会放在NFS共享里,例如BBS产品(论坛)产生的图片、附件、头像等,然后前端所有的节点访问静态资源时都会读取NFS存储上的资源。
阿里云等公有云平台的NAS就是云版的NFS服务应用。
image.png

image.png
在企业架构集群中,如图就是NFS系统工作位置,NFS作为所有前端服务的共享存储,存储内容包括用户上传的图片,附件,头像等,注意网站后端代码等重要数据不得放在NFS共享。

企业生产集群为什么需要共享存储

image.png
先看一下如果没有共享存储的问题
A用户上传图片到web01服务器,然后用户B访该图片,结果B的请求被负载均衡分发到了Web02,但是由于没有配置共享存储,web02没有该图片,导致用户B看不到该资源,用户心理很不爽呀。
那么如果配置了共享存储,无论A用户上传的图片是发给了web01还是其他,最终都会存储到共享存储上,用户B再访问该图片的时候,无论请求被负载均衡发给了web01、web02、web03最终都会去共享存储上寻找资源,这样也就能够访问到资源了。
这个共享存储对于中小企业,也就是使用服务器配置NFS网络文件共享系统实现。
image.png
中小型互联网企业一般不会购买硬件存储,成本过高,大公司由于业务发展快,需要购买硬件存储分散网站的压力,但是网站的并发压力如果继续增长,硬件设备的扩展就会费劲,且金钱成本翻倍增长。
因此企业也就采用了开源的软件技术替换硬件设备,如用Lvs+Haproxy替换了NetScaler负载均衡设备。

NFS工作原理

image.png
如图是企业中NFS服务器和客户端的挂载结构
1.在NFS服务端设置一个共享的目录/video,其他有权限访问NFS服务器的客户端都可以吧该目录/video挂载到本地客户端的某个挂载点(挂载点就是一个目录,可以自由定义路径)

客户端正确挂载完毕后,进入NFS客户端的挂载点,也就能够看到NFS服务端的/video共享目录下的数据。在客户端查看时,NFS服务端/video的目录数据就相当于本地一个目录而已,根本察觉不到任何区别。

NFS与RPC原理

我们已知NFS是通过网络来进行数据传输(网络文件系统),因此NFS会使用一些port来传输数据,但是NFS在传输数据的时,使用的端口是随机选择(可以重启NFS服务查看端口)。

既然NFS是随机端口选择(好比银行的取钱窗口总发生变化,你知道几号窗口是取钱业务吗?)那么NFS在传输数据的时候,怎么知道NFS服务器使用的端口是哪个呢?
答案就是NFS使用的RPC(Remote Procedure Call,就是远程过程调用)协议来实现的。
答案就是NFS通过RPC服务,进行一个端口注册,实现告知用户,NFS的工作端口是哪一个。

什么是RPC

RPC就好比是一个中介,处在客户端、服务端之间。在启动NFS服务之前,必须先启动RPC服务。
RPC(远程过程调用)
Linux上使用CFS服务,必须启动2个服务:

  • NFS服务。NFS服务通过RPC注册自己的端口功能。
  • RPC服务。RPC服务功能就是记录每个NFS功能对应的一个端口号,并且RPC保证了NFS客户端发出请求的时候,把该功能对应的端口信息告知NFS客户端,保证客户端能够正确的连接到NFS服务端的端口,达到数据传输的目的。

image.png
这就好比超哥要租房,此时超哥就是一个NFS客户端,中介来介绍房子信息,中介就好比RPC服务,房源拥有者也就相当于NFS服务端,提供数据的,中介手里必须得先储备好房东的信息,才能给房源信息转达给租客。

那么RPC服务又是如何知道每个NFS的端口呢?(中介如何知道房东的具体信息呢?)
当NFS服务器启动时会随机采用若干端口,并且主动在RPC服务中注册相关端口以及功能信息。
如此一来RPC服务就知道NFS服务对应的端口功能了,RPC服务默认使用固定111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给NFS客户端,这样,NFS客户端就可以和NFS服务器进行数据通信了。
image.png

RPCBIND服务

在启动NFS服务端之前,必须先启动RPC服务,在centos7服务器下为rpcbind服务,否则NFSserver无法向RPC注册信息了。
注意:
另外如果RPC服务重启,原来注册的NFS服务端信息也就失效了,也必须重启服务,再次注册信息给RPC服务。
特别要注意的是,修改NFS配置文件后不需要重启NFS,只需要执行exportfs -rv 命令即可或是systemctl reload nfs

NFS工作原理

image.png
当访问程序通过NFS客户端向NFS服务器端存储文件时,其数据请求流程如下:

  1. 用户访问网站程序,由程序在NFS客户端上发出存取文件的请求,此时NFS客户端(执行程序的机器)的RPC服务(rpcbind)就会通过网络向NFS服务器的RPC服务的111端口发出NFS文件存取功能的请求。
  2. NFS服务器RPC找到对应注册的NFS端口,通知NFS客户端RPC服务
  3. 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据
  4. NFS客户端把数据存取成功后返回给前端程序,告知用户存取结果,完成一次存取请求。

这也就证明,必须先启动RPC服务,再启动NFS服务的步骤。


安装配置NFS

NFS软件列表

安装nfs服务,需要安装如下软件包

  • nfs-utils:NFS服务的主程序,包括了rpc.nfsd、rpc.mountd这两个守护进程以及相关文档,命令
  • rpcbind:是centos7/6环境下的RPC程序 ```shell 1.检查默认NFS软件安装情况 [root@chaogelinux ~]# rpm -qa nfs-utils rpcbind rpcbind-0.2.0-48.el7.x86_64 nfs-utils-1.3.0-0.65.el7.x86_64

2.安装软件包命令 yum install nfs-utils rpcbind -y

  1. <a name="X5Flt"></a>
  2. ### 【环境配置】
  3. NFS也是C/S模式,准备一个NFS服务端,一个NFS客户端,两台linux机器<br />在Server机器上创建用于NFS文件共享的文件夹,且设置好权限
  4. ```shell
  5. [root@chaogelinux chaoge]# mkdir /nfsShare
  6. [root@chaogelinux chaoge]# chmod -Rf 777 /nfsShare/

【修改NFS服务的配置文件】

默认配置文件路径是/etc/exports

  1. exports配置文件语法
  2. NFS共享目录 NFS客户端地址(参数1、参数2...) 客户点地址2(参数1、参数2...)
  3. 例如
  4. # 把nfs服务器的根目录共享出去,且允许两个主机名为master master2的机器,进行读写操作
  5. / master(rw) master2(rw,no_root_squash)
  6. # 允许任意的客户端,都能够挂载到此NFS服务器的/public目录下
  7. /pub *(rw)
  8. # 只允许指定IP地址的服务器能够挂载此NFS服务端的/home/chao文件夹,且是只读的
  9. /home/chao 123.206.16.61(ro)

【nfs语法参数解释】

  1. 1.NFS共享目录:为NFS服务器要共享的实际目录,必须绝对路径,注意目录的本地权限,如果要读写共享,要让本地目录可以被NFS客户端的(nfsnobody)读写
  2. 2.NFS客户端地址,也就是NFS服务器端授权可以访问共享目录的客户端地址,详见下表
  3. 3.权限参数,对授权的NFS客户端访问权限设置,见下表

【NFS客户端地址配置说明】

客户端地址 具体地址 说明
单一客户端 192.168.178.142 用的少
整个网段 192.168.178.0/24 24表示子网掩码255.255.255.0,指定网段,用的较多
授权域名客户端 nfs.chaoge.com 弃用
授权整个域名客户端 *.chaoge.com 弃用

配置案例

1.案例一

  1. #修改nfs配置文件为如下示例
  2. [root@chaogelinux nfsShare]# cat /etc/exports
  3. /nfsShare *(insecure,rw,sync,root_squash)
  4. #表示共享该文件夹,且提供给所有网段的机器可访问,配置规则是,可读写,数据同步写入到磁盘,把root管理员映射为本地的匿名用户,insecure是客户端从大于1024的端口发送链接

2.案例二

  1. /home/chaoge 192.168.178.0/24(ro)
  2. 只读共享,例如一些生成服务器的日志目录,又不想给开发服务器的权限,可以用此办法,共享目录给他人只读查看

配置参数解释

  1. ro 只读
  2. rw 读写
  3. root_squash nfs客户端以root访问时,它的权限映射为NFS服务端的匿名用户,它的用户ID/GID会变成nfsnobody
  4. no_root_squash 同上,但映射客户端的root为服务器的root,不安全,避免使用
  5. all_squash 所有nfs客户端用户映射为匿名用户,生产常用参数
  6. sync 数据同步写入到内存与硬盘,优点数据安全,缺点性能较差
  7. async 数据写入到内存,再写入硬盘,效率高,但可能内存数据会丢

启动NFS服务端

NFS服务都是基于RPC协议通信的默认端口是111,要确保系统运行了rpcbind服务
要注意的是rpcbind服务即使停止,111端口也不会挂掉,因为还有rpcbind.socket服务

  1. [root@chaogelinux ~]# systemctl status rpcbind
  2. rpcbind.socket - RPCbind Server Activation Socket
  3. Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled)
  4. Active: active (running) since 2020-03-10 10:59:12 CST; 4h 35min ago
  5. Listen: /var/run/rpcbind.sock (Stream)
  6. 0.0.0.0:111 (Stream)
  7. 0.0.0.0:111 (Datagram)
  8. 3 10 10:59:12 chaogelinux systemd[1]: Listening on RPCbind Server Activation Socket.
  9. # 启动rpcbind服务
  10. systemctl restart rpcbind
  11. #启动
  12. systemctl restart nfs-server

配置NFS服务端过程

创建共享目录且设置权限

  1. 1.确保RPC服务启动了
  2. systemctl start rpcbind
  3. 2.创建需要共享的目录,以及资料,并且授权
  4. mkdir -p /nfs_data
  5. touch /nfs_data/好嗨哦.txt
  6. 3.修改文件夹的usergroup,这里更换权限是防止NFS客户端无法写入数据,当然也可以修改服务端目录777权限,但是不安全,不推荐
  7. chown -R nfsnobody.nfsnobody /nfs_data/
  8. 4.上一步修改的用户是nfs的匿名用户
  9. [root@chaogelinux ~]# grep nfsnobody /etc/passwd
  10. nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

配置NFS服务端配置文件,并且查看挂载情况

  1. 1.编辑配置文件,写入如下挂载参数
  2. [root@chaogelinux ~]# cat /etc/exports
  3. # 高并发的时候,不要用sync这个参数
  4. /nfs_data *(insecure,rw,sync) # 参数解释,允许客户端从大于1024的端口发出请求,同时把数据写入内存和磁盘
  5. 2.重新加载nfs服务
  6. systemctl restart nfs
  7. systemctl reload nfs
  8. 3.查看NFS服务端挂载情况
  9. [root@chaogelinux ~]# showmount -e
  10. Export list for chaogelinux:
  11. /nfs_data *
  12. 4.查看NFS服务端挂载默认的参数,如下大多数参数都是默认的,不做过多了解
  13. [root@chaogelinux ~]# cat /var/lib/nfs/etab
  14. /nfs_data *(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
  15. 5.把本地机器当做客户端做一个简单的挂载测试
  16. [root@chaogelinux ~]# mount -t nfs 123.206.16.61:/nfs_data /mnt
  17. [root@chaogelinux ~]#
  18. [root@chaogelinux ~]#
  19. # 发现已经可以查看到挂载目录的数据
  20. [root@chaogelinux ~]# ls /mnt/
  21. 好嗨哦.txt
  22. # 检查挂载情况
  23. [root@localhost ~]# mount -l | grep mnt
  24. [root@chaogelinux ~]# df -h |tail -1
  25. 123.206.16.61:/nfs_data 50G 22G 26G 47% /mnt
  26. [root@chaogelinux ~]# mount |tail -1
  27. 123.206.16.61:/nfs_data on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.141.32.137,local_lock=none,addr=123.206.16.61)
  28. 至此NFS服务端挂载成功,配置完毕
  29. # 取消挂载,如果不用nfs目录共享了,可以直接取消挂载,只需要取消本地目录的挂载即可
  30. umount /mnt

注意:

  • /etc/exports文件的语法不要写错,细心
  • 修改/etc/exports文件后,注意要重启systemctl reload nfs或是exportfs -r重新加载配置,无需重启

NFS客户端

在另一台linux机器上连接nfs服务端

  1. [root@web01 ~]# yum install nfs-utils rpcbind -y #安装操作nfs的命令套件
  2. # 确保rpcbind服务正常
  3. systemctl status rpcbind
  4. systemctl start rpcbind
  5. # 检查远程挂载情况,需要服务端防火墙关闭,或是配置了规则
  6. [root@chaoge_linux mnt]# showmount -e 123.206.16.61
  7. Export list for 123.206.16.61:
  8. /nfs_data *
  9. #以nfs协议挂载
  10. [root@chaoge_linux ~]# mount -t nfs 123.206.16.61:/nfs_data /mnt
  11. [root@localhost ~]# mount -l | tail -1
  12. 192.168.58.140:/nfschaoge on /chaoge888 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.58.130,local_lock=none,addr=192.168.58.140)

此时进入挂载的目录,查看远程NFS服务端的文件夹资料

  1. [root@chaoge_linux ~]# cd /mnt
  2. [root@chaoge_linux mnt]# ls
  3. 好嗨哦.txt
  1. # 如果不想使用了,可以取消挂载
  2. [root@localhost ~]# umount /chaoge888/
  3. [root@localhost ~]# ll /chaoge888/
  4. total 0

注意一个小的细节
如果/chaoge888之前有文件,那么挂载之后,只显示远程挂载那个文件夹里边的文件,不显示本地文件
当umout取消挂载之后,/chaoge888中的文件,会再次在本地中出现。

如果出现挂载异常

  • 检查配置笔记,是否有出错
  • 注意防火墙问题

    配置开机自动挂载,每次开机都能使用nfs

    将挂载命令写入到/etc/fstab文件
    1. [root@web01 nfsShare]# tail -1 /etc/fstab
    2. 123.206.16.61:/nfsShare /nfsShare nfs defaults 0 0

    Autofs自动挂载服务

    【为什么要用autofs】
    Linux的mount命令用于挂载文件系统
    对于本地固定的设备,例如硬盘分区可以使用mount进行挂载
    1. [root@chaogelinux nfsShare]# mount -l |grep ext4
    2. /dev/vda1 on / type ext4 (rw,noatime,data=ordered)
    在/etc/fstab文件中,如果定义了过多的自动挂载配置,无疑都会随着服务器开机而进行挂载,但是这些挂载后的资源,我们都一定会使用吗?如果不用则会给服务器造成硬件资源压力,以及网络带宽压力。
    因此一些具有动态特性的文件系统,如光盘、软盘、U盘、甚至NFS、SMB等文件系统,特点是当需要,且使用的时候才有必要挂载。
    当光盘或是U盘需要使用的时候,我们即可插入服务器,进行相应的挂载即可,但是NFS或SMB这样的远程共享,我们就不一定知道何时使用,进行挂载,何时不用,也不造成资源浪费。

【autofs特点】
Autofs和mount的不同点在于,Autofs是一种守护进程。它在后台检测用户是否要访问一个还没有挂载的文件系统,autofs会自动检查该文件系统是否存在,存在则自动挂载。
且autofs检测到已经挂载的文件系统有一段时间没用,则会自动将其卸载,省去了人力维护挂载设备的成本,以及不会造成服务器资源浪费。
【autofs的缺点】
autofs特点是只有用户请求时才执行挂载,所以当高并发访问时,开始请求的瞬间需要执行挂载,性能较差,因此在高并发业务场景下,宁愿保持挂载也不使用autofs自动挂载。

安装autofs

我们应该是在需要挂载的那台机器执行

  1. [root@chaogelinux nfsShare]# yum install autofs -y

【修改autofs配置文件】
autofs配置文件以挂载点 子配置文件的格式填写

  1. #默认的配置文件如下
  2. [root@web01 ~]# grep -v '^#' /etc/auto.master
  3. # 定义了一个挂载点是/misc ,需要在auto.misc文件中定义挂载动作
  4. /misc /etc/auto.misc
  5. /net -hosts
  6. +dir:/etc/auto.master.d
  7. +auto.master

添加nfs自动挂载配置,添加一行配置,改为如下

  1. [root@localhost ~]# vim /etc/auto.master
  2. [root@localhost ~]# grep -v '^#' /etc/auto.master
  3. /misc /etc/auto.misc
  4. /- /etc/auto.home
  5. /net -hosts
  6. +dir:/etc/auto.master.d
  7. +auto.master
  1. [root@web01 ~]# grep -v '^#' /etc/auto.master
  2. /misc /etc/auto.misc
  3. /- /etc/auto.home # 添加了这里,需要创建auto.home配置文件
  4. /net -hosts
  5. +dir:/etc/auto.master.d
  6. +auto.master

接着就是定义子配置文件的内容了。

  1. [root@localhost ~]# vim /etc/auto.home
  2. [root@localhost ~]# cat /etc/auto.home
  3. /chaoge888 -rw,soft,intr 192.168.58.140:/nfschaoge
  1. [root@web01 home]# cat /etc/auto.home
  2. /var/autofs -rw,soft,intr 123.206.16.61:/nfsShare

此时检查系统文件系统情况(检查挂载情况)

  1. #此时并没有/var/autofs文件系统的挂载数据
  2. [root@web01 home]# df -hT
  3. Filesystem Type Size Used Avail Use% Mounted on
  4. devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
  5. tmpfs tmpfs 1.9G 16K 1.9G 1% /dev/shm
  6. tmpfs tmpfs 1.9G 532K 1.9G 1% /run
  7. tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  8. /dev/vda1 ext4 50G 30G 17G 65% /
  9. tmpfs tmpfs 380M 0 380M 0% /run/user/0

启动autofs

  1. systemctl restart autofs
  2. systemctl enable autofs

当我们进入了/var/autofs,autofs服务会自动检测,且自动挂载

  1. [root@web01 autofs]# pwd
  2. /var/autofs
  3. [root@web01 autofs]# ls
  4. haha 超哥带你学autofs 超哥带你学nfs
  5. [root@web01 autofs]# df -hT
  6. Filesystem Type Size Used Avail Use% Mounted on
  7. devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
  8. tmpfs tmpfs 1.9G 16K 1.9G 1% /dev/shm
  9. tmpfs tmpfs 1.9G 532K 1.9G 1% /run
  10. tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
  11. /dev/vda1 ext4 50G 30G 17G 65% /
  12. tmpfs tmpfs 380M 0 380M 0% /run/user/0
  13. 123.206.16.61:/nfsShare nfs4 50G 16G 31G 35% /var/autofs

image.png
大功告成,我们可以设置,多少秒不使用之后,自动取消挂载

  1. [root@web01 ~]# cat /etc/autofs.conf |grep -i "timeout ="
  2. timeout = 10