centos7搭建NFS服务


1. NFS基本概述

  • NFS(Network File System 即网络文件系统。它的主要功能是通过网络让不同主机系统之间可以共享文件或目录。
  • NFS与Samba服务类似,但一般Samba服务常用于办公局域网共享,而NFS常用于互联网中小型网站集群架构后端的数据共享。
  • NFS客户端将NFS服务端设置好的共享目录挂载到本地某个挂载点,对于客户端来说,共享的资源就相当于在本地的目录下。
  • NFS在传输数据时使用的端口是随机选择的,依赖RPC服务来与外部通信,要想正常使用NFS,就必须保证RPC正常。

使用NFS主要解决前端web资源一致性问题以及前端web静态资源的共享,但是它并不能解决网站访问的延时,生产环境一般将静态资源放在了CDN上面。

2. RPC协议和NFS工作原理

由于 NFS 在传输数据时使用的端口是随机选择的,所以依赖于 RPC 服务。

RPC(Remote Procedure Call Protocol)远程过程调用协议。它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

NFS 服务端和 NFS 客户端之间,RPC 服务扮演一个中介角色,NFS 客户端通过 RPC 服务得知 NFS 服务端使用的端口,从而双方可以进行数据通信。

NFS工作流程

当NFS服务端启动服务时,会随机取用若干个端口,并主动向 RPC 服务注册取用相关端口,这样,RPC 服务就知道 NFS 每个端口对应的的NFS功能了,然后 RPC 服务使用固定的111端口来监听 NFS 客户端提交的请求,并将正确的 NFS 端口信息回复给请求的 NFS 客户端。这样,NFS 客户端就可以与 NFS 服务端进行数据传输了。

NFS工作原理

  1. 用户进程访问NFS客户端,使用不同的函数对数据进行处理
  2. NFS客户端通过 TCP/IP 的方式传递给NFS服务端
  3. NFS服务端接收到请求后,会先调用 protmap 进程进行端口映射
  4. nfsd 进程用于判断 NFS 客户端是否拥有权限连接 NFS 服务器
  5. rpc.mount 进程用于判断客户端是否有权限进行验证
  6. idmap 进程实现用户映射和压缩
  7. 最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,又内核驱动硬件。

3. 部署NFS服务

3.1 环境说明

应用场景:将NFS服务端的 /data 目录共享给同个网段的所有主机。

主机 操作系统 说明
192.168.18.150 CentOS Linux release 7.7.1908 (Core) NFS服务端
192.168.18.131 CentOS Linux release 7.8.2003 (Core) NFS客户端

3.2 NFS服务端配置

首先,关闭防火墙,selinux

# 关闭防火墙
$ systemctl stop firewalld
$ systemctl stop iptables


# 关闭selinux,临时关闭
$ setenforce 0

# 永久关闭selinux
$ sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

安装NFS

# nfs-utils包依赖rpcbind,所以只要安装nfs-utils包即可,rpcbind被依赖也会安装上
$ yum install -y nfs-utils

创建共享文件夹目录

$ mkdir /data

# 授权
$ chown -R nfsnobody.nfsnobody /data

配置NFS

# 编辑 /etc/exports,添加如下内容:
$ vim /etc/exports
/data 192.168.18.0/24(rw,sync,all_squash)

启动服务

# 启动服务,先启动rpcbind, 然后再启动nfs
$ systemctl start rpcbind

# 启动nfs
$ systemctl start nfs-server

# 检查是否启动成功
$ ps aux | grep nfs

启动成功后,可以通过看 /var/lib/nfs/etab 这个文件,看文件有没有配置的nfs信息,如果有则表明启动服务没什么问题。

$ cat /var/lib/nfs/etab
/data	192.168.18.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)

3.3 NFS客户端配置

关闭防火墙

# 关闭防火墙
$ systemctl stop firewalld
$ systemctl stop iptables


# 关闭selinux,临时关闭
$ setenforce 0

# 永久关闭selinux
$ sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

安装 rpcbindnfs-utils

$ yum install -y nfs-utils

查看是否有可用的NFS地址

$ showmount -e 192.168.18.150
Export list for 192.168.18.150:
/data 192.168.18.0/24

挂载

$ mount 192.168.18.150:/data /opt

$ df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G   12K  1.9G    1% /dev/shm
tmpfs                    1.9G   13M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   18G  6.8G   12G   38% /
/dev/sda1                197M  171M   27M   87% /boot
tmpfs                    378M     0  378M    0% /run/user/0
192.168.18.150:/data      18G  6.3G   12G   36% /opt

验证

# 客户端在挂载目录增删改查文件
$ echo "test nfs" > 1.txt

# 在服务端查看是否一致
$ cat 1.txt 
test nfs

这样,一个NFS服务器就配置完成了。

3.4 其他说明

在服务端安装nfs-utils包之后,默认的配置文件是: /etc/exports

上面步骤中配置的内容如下:

/data 192.168.18.0/24(rw,sync,all_squash)
  • /data : 表示要共享哪个目录
  • 192.168.18.0/24:指定一个网段信息,表示允许指定的网段主机挂载到我本地的共享目录上
  • (rw,sync,all_squash):括号里面定义的是共享参数

共享参数如下:

一般配置的参数是:(rw,all_squash,sync,anonuid=666,anongid=666)

在NFS的客户端使用 showmount -e 命令查看是否有可用的NFS地址

如果希望开机自动挂载NFS共享目录,可以编辑 /etc/fstab,添加如下内容:

192.168.18.150:/data   /opt                     nfs     defaults  0 0