一、介绍

  NFS(Network File System)即网络文件系统,主要功能是通过网络让不同主机系统之间可以共享文件或者目录,类似于windows下的网络盘。

二、安装

2.1 环境

主机名 操作系统 安装服务
nfs-server Centos 7.4 nfs-utils、rpcbind
nfs-client Centos 7.4 nfs-utils、rpcbind

  本文准备了两个虚拟机,系统都是centos7的,一个作为server端提供网络盘服务,一个作为client端挂载。除了需要安装nfs-utils包之外,还需要安装rpcbind包。这是因为NFS支持的功能很多,不同的功能会使用不同程序来启动,因此NFS对应的功能所占用的端口不固定,会造成客户端和服务端之间的通信障碍,所以需要rpc服务做"中介"
  NFS的工作流程:

  1. 客户端发起存取文件的请求,客户端本地的RPC(rpcbind)服务向NFS服务端111端口(RPC)发出文件存取功能的请求。
  2. NFS服务端的RPC找到对应已注册的NFS端口,通知客户端RPC服务。
  3. 客户端获取正确的端口后,就可以和NFS服务端通信存取数据了。

  因此无论是服务端还是客户端,都必须安装rpcbind。RPC包在centos5中名为portmap,centos6以上名为rpcbind。

2.2 服务端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@nfs-server ~]# yum install nfs-utils rpcbind -y    # 安装nfs和rpc
[root@nfs-server ~]# systemctl start rpcbind # 启动rpc服务
[root@nfs-server ~]# systemctl enable rpcbind # rpc加入开机自启
[root@nfs-server ~]# systemctl start nfs # 启动nfs服务
[root@nfs-server ~]# systemctl enable nfs # nfs加入开启自启
[root@nfs-server ~]# rpcinfo -p localhost # 查询本机nfs服务向rpc注册的端口信息
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 51517 status
100024 1 tcp 55027 status
100021 1 udp 39300 nlockmgr
100021 3 udp 39300 nlockmgr
100021 4 udp 39300 nlockmgr
100021 1 tcp 39043 nlockmgr
100021 3 tcp 39043 nlockmgr
100021 4 tcp 39043 nlockmgr
[root@nfs-server ~]# vim /etc/exports # 编辑nfs配置文件,配置共享目录
/data 192.168.1.0/24(rw,sync,all_squash)
[root@nfs-server ~]# mkdir /data # 创建目录
[root@nfs-server ~]# chown nfsnobody.nfsnobody /data # 赋权
[root@nfs-server ~]# exportfs -rv # 重新加载nfs配置
[root@nfs-server ~]# showmount -e localhost # 查看nfs挂载情况
Export list for localhost:
/data 192.168.1.0/24

  配置文件/ect/exports文件格式:

共享目录 客户端地址1(参数1,参数2,…) 客户端地址2(参数1,参数2,…)

  :共享目录要用绝对路径,并且可以被nfsnobody用户读写
  客户端地址格式可以是:

  1. 指定IP: 192.168.0.1
  2. 指定子网所有主机: 192.168.0.0/24
  3. 指定域名的主机: test.com
  4. 指定域名所有主机: *.test.com
  5. 所有主机: *

  参数:

  • ro:只读权限
  • rw:读写权限
  • sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
  • async:将数据先保存在内存缓冲区中,必要时才写入磁盘,提升性能,但是降低数据一致性
  • all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
  • no_all_squash:与all_squash参数含义相反(默认设置)
  • root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置)
  • no_root_squash:与root_squash参数含义相反
  • anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx)
  • anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户

  :先启动RPC服务,占用111端口来监听NFS的请求,然后再启动NFS服务,这时NFS会主动向RPC服务注册其启动的端口和功能信息。如果系统开启了防火墙,需要把rpcinfo查询出来端口加入规则中

2.3 客户端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@nfs-client ~]# yum install nfs-utils rpcbind -y    # 客户端也都要安装
[root@nfs-client ~]# systemctl start rpcbind # 客户端只需要启动rpc服务
[root@nfs-client ~]# systemctl enable rpcbind
[root@nfs-client ~]# showmount -e 192.168.1.100 # 查看nfs服务端挂载情况
Export list for 192.168.1.100:
/data 192.168.1.0/24
[root@nfs-client ~]# mkdir /test # 新建挂载目录
[root@nfs-client ~]# mount -t nfs 192.168.1.100:/data /test # 挂载远端目录
[root@nfs-client ~]# df -h # mount -l也可以查看挂载情况
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 296G 29G 252G 11% /
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 12K 3.9G 1% /dev/shm
tmpfs 3.9G 2.3M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
192.168.1.100:/data 20G 54M 19G 1% /test

2.4 测试

  在客户端和服务端之间测试:

  1. 客户端创建文件并且输入数据,在服务端是否可以查看
  2. 服务端创建文件并且输入数据,在客户端是否可以查看
  3. 在服务端删除客户端创建的文件
  4. 在客户端删除服务端创建的文件

  如果都测试成功的话,说明部署成功。

三、总结

  NFS配置比较简单,部署快速,数据可靠性不错。但是存在单点故障,在高并发场景下,性能有限。对于数据的完整性不做校验。在生产中使用时将挂载命令加入开机自启动,并且通过监控系统监控挂载情况