1. NFS简介

NFS(Network File System),即网络共享文件系统
它的主要功能是通过网络(一般是局域网)让不同主机系统之间共享文件或目录
NFS客户端(应用服务器,例如web)以挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(某一个挂载点下)
从客户端本地来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或目录一样,而实际上却是远端的NFS服务器的目录

所有的Web服务器会向NFS服务器进行数据交互 NFS存储服务中主要存储那些信息:用户上传的图片、音频、视频、附件等信息

存储场景:

NFS适用于中小型企业:默认只能有一台NFS服务器,
大公司或大门户:高并发:Moosefs(MFS)、GlusterFS、FastDFS等(分布式文件系统 )

2. RPC服务

NFS在传输数据时会使用随机端口号,每个NFS服务进程都会对应一个随机端口号,这时客户端没办法知道NFS服务的准确的端口号,那么就需要通过RPC(中介)来告诉客户端NFS服务的端口号。

NFS工作流程图:
image.png
NFS工作原理流程图:
image.png

NFS服务端做了三件事:

  • 首先要先启动RPC服务,在启动NFS服务
  • NFS服务产生随机端口号,
  • NFS自动向RPC服务注册随机端口号,在nfs服务稳定运行过程中,只注册一次

客户端做了三件事

  • 启动rpcbind服务(可选)
  • 确保客户端和服务端网络连接建立成功
  • 客户端需要通过自身的RPC服务,来向NFS服务端的RPC服务获取NFS的端口号,然后客户端在通过得到的端口号,单独向NFS发起TCP建立。

NFS服务启动进程和端口过程,需要由rpc统一管理 客户端可以不用启动rpc服务,不会对挂载有任何影响

3. NFS服务端搭建

需求:nfs服务端将/data目录作为共享目录,并只允许10.4.7.0/24网段nfs客户端挂载访问

nfs服务端IP:10.4.7.170

本文以centos7.4系统为实验环境

1.安装nfs-utils

  1. [root@nfs ~]# yum install nfs-utils -y

yum包管理会自动安装nfs所依赖的各种软件,特别是rpcbind

2.启动nfs并加入开机自启动

  1. [root@nfs ~]# systemctl start nfs
  2. [root@nfs ~]# systemctl enable nfs

以前nfs老版本的时候,必须要先启动rpcbind之后再启动nfs,现在直接启动nfs,rpcbind也会随着启动

3.编写nfs配置文件

  1. [root@nfs ~]# vim /etc/exports
  2. /data 10.4.7.0/24(rw,sync)
  3. // 配置文件解释
  4. 共享/data目录,该目录只允许10.4.7.0/24网段挂载访问,目录权限为可读写,数据同步写入磁盘

4.创建/data目录,并更改共享目录属主nfsnobody(在nfs中,默认的匿名用户为nfsnobody,)

  1. [root@nfs ~]# mkdir -p /data
  2. [root@nfs ~]# chown -R nfsnobody.nfsnobody /data

查看默认配置信息可以知道NFS服务客户端登录用户默认为匿名用户,在nfs中,默认的匿名用户为nfsnobody,如果不指定用户,那么默认就是nfsnobody

5.启动nfs并测试共享目录

  1. [root@nfs ~]# systemctl restart nfs
  2. [root@nfs ~]# showmount -e localhost
  3. Export list for localhost:
  4. /data 10.4.7.0/24 // 目录已经共享成功

每次修改nfs配置文件都需要重启nfs

常用选项:

  • ro:默认选项,以只读的方式共享。
  • rw:以读写的方式共享。
  • root_squash:将客户端使用的是root用户时,则映射到NFS服务器的用户为NFS的匿名用户(nfsnobody)。
  • no_root_squash:将客户端使用的是root用户时,则映射到FNS服务器的用户依然为root用户。
  • all_squash:默认选项,将所有访问NFS服务器的客户端的用户都映射为匿名用户,不管客户端使用的是什么用户。
  • anonuid:设置映射到本地的匿名用户的UID
  • anongid:设置映射到本地的匿名用户的GID
  • sync:默认选项,保持数据同步,数据同步写入到内存和硬盘。
  • async:异步,先将数据写入到内存,在将数据写入到硬盘。
  • secure:NFS客户端必须使用NFS保留端口(通常是1024以下的端口),默认选项。
  • insecure:允许NFS客户端不使用NFS保留端口(通常是1024以上的端口)

4. NFS客户端

nfs客户端IP:10.4.7.171

1.安装nfs-utils(客户端也必须安装)

  1. [root@web01 ~]# yum install -y nfs-utils

2.将客户端的/mnt目录挂载到nfs服务端/data目录

  1. [root@web01 ~]# mount -t nfs 10.4.7.170:/data /mnt
  2. [root@web01 ~]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/sda3 98G 1.6G 97G 2% /
  5. devtmpfs 473M 0 473M 0% /dev
  6. tmpfs 483M 0 483M 0% /dev/shm
  7. tmpfs 483M 6.7M 476M 2% /run
  8. tmpfs 483M 0 483M 0% /sys/fs/cgroup
  9. /dev/sda1 1014M 120M 895M 12% /boot
  10. tmpfs 97M 0 97M 0% /run/user/0
  11. 10.4.7.170:/data 98G 2.4G 96G 3% /mnt

3.在挂载目录/mnt下创建文件,然后在nfs服务端查看

  1. // nfs客户端
  2. [root@web01 ~]# cd /mnt/
  3. [root@web01 mnt]# touch test.txt
  4. // nfs服务端
  5. [root@nfs ~]# ll /data/
  6. total 0
  7. -rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 13 20:55 test.txt

4.实现开机自动挂载

  1. [root@web01 ~]# echo "10.4.7.170:/data /mnt nfs defaults,_rnetdev 1 1" >>/etc/fstab

注意:第1个1表示备份文件系统,第2个1表示从/分区的顺序开始fsck磁盘检测,0表示不检测。

_rnetdev表示主机无法挂载直接跳过,避免无法挂载主机无法启动

5. NFS服务端增加用户

默认情况下nfs使用nfsnobody这个匿名用户,但是现在有个需求,我想让nfs服务端共享目录的匿名用户为www,操作如下:

5.1. 服务端

1.创建web用户

  1. [root@nfs ~]# useradd www -u 1100 -s /sbin/nologin
  2. [root@nfs ~]# id www
  3. uid=1100(www) gid=1100(www) groups=1100(www)

2./etc/exporter添加新的共享目录,并为该目录指定匿名用户

  1. [root@nfs ~]# vim /etc/exports
  2. /data 10.4.7.0/24(rw,sync)
  3. /web_data 10.4.7.0/24(rw,sync,all_squash,anonuid=1100,anongid=1100)

3.创建共享目录并授权

  1. [root@nfs ~]# mkdir /web_data
  2. [root@nfs ~]# chown -R www.www /web_data/

4.重启nfs

  1. [root@nfs ~]# systemctl restart nfs

5.2. 客户端

客户端挂载到10.4.7.170的/web_data目录到本机/opt/目录

1.挂载目录

  1. [root@web01 ~]# mount -t nfs 10.4.7.170:/web_data /opt/

2.root用户创建文件,被压缩成www匿名用户

  1. [root@web01 ~]# cd /opt/
  2. [root@web01 ~]# touch test.txt
  3. [root@web01 opt]# ls -lh
  4. total 0
  5. -rw-r--r-- 1 1100 1100 0 Mar 13 21:19 test.txt