NFS存储服务概念介绍

  • NFS是Network File System的缩写,中文意思是网络文件共享系统,它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录

NFS存储服务作用

  1. 实现数据的共享存储
  2. 编写数据操作管理
  3. 节省购买服务器磁盘开销

NFS服务端部署流程

主机名称和IP地址规划

服务 主机名 eth0网卡IP eth1网卡IP 软件
防火墙服务器 firewalld 10.0.0.81 172.16.1.81 firewalld
负载均衡服务器 lb01 10.0.0.5 172.16.1.5 nginx,keepalived
负载均衡服务器 lb02 10.0.0.6 172.16.1.6 nginx,keepalived
web服务器 web01 10.0.0.7 172.16.1.7 nginx
web服务器 web02 10.0.0.8 172.16.1.8 nginx
web服务器 web03 10.0.0.9 172.16.1.9 nginx
存储服务器 nfs01 10.0.0.31 172.16.1.31 nfs
备份服务器 backup 10.0.0.41 172.16.1.41 rsync
数据库服务器 db01 10.0.0.51 172.16.1.51 mysql,mariaDB
批量管理服务器 m01 10.0.0.61 172.16.1.61 ansible
跳板机服务器 jumpserver 10.0.0.71 172.16.1.71 jumpserver
监控服务器 zabbix 10.0.0.72 172.16.1.72 zabbix
缓存服务器 暂无 暂无 暂无 暂无

服务端下载安装软件

RPC: 远程过程调用服务程序

#查看RPC是否安装,未安装则安装
rpm -qa|grep -E "rpc"
yum install -y rpcbind
#查看NFS是否安装,未安装则安装
rpm -qa|grep -E "nfs"
yum install -y nfs-utils

编写nfs服务配置文件

存储服务器10.0.0.31

  • 格式 : 1 2(3)
  1. 设置数据存储的目录
  2. 设置网络一个白名单
  3. 配置存储目录的权限信息 存储目录一些功能
vi /etc/exports

/data   172.16.1.0/24(rw,sync)

创建一个存储目录

mkdir /data
chown nfsnobody.nfsnobody /data

启动服务

#先启动 rpc服务
systemctl start rpcbind.service
systemctl enable rpcbind.service
#再启动 nfs服务
systemctl start nfs
systemctl enable nfs

NFS客户端部署流程

客户端下载安装软件

#查看NFS是否安装,未安装则安装
rpm -qa|grep -E "nfs"
yum install -y nfs-utils

远程挂载共享目录

mount -t nfs 172.16.1.31:/data  /mnt

NFS服务工作原理

nfs原理图.png

nfs相关进程.png

服务端

  1. 启动rpc服务,开启111端口
  2. 启动nfs服务
  3. 实现nfs服务进程和端口好的注册

检查nfs服务进程与端口注册信息

[root@nfs01 data]# rpcinfo -p 172.16.1.31
   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  44238  status
    100024    1   tcp  53791  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  34862  nlockmgr
    100021    3   udp  34862  nlockmgr
    100021    4   udp  34862  nlockmgr
    100021    1   tcp  33765  nlockmgr
    100021    3   tcp  33765  nlockmgr
    100021    4   tcp  33765  nlockmgr

客户端

  1. 建立TCP网络连接
  2. 客户端执行挂载命令,进行远程挂载
  3. 可以实现数据远程传输存储

NFS服务端详细配置说明

nfs配置参数权限(etc.exports小括号里的参数).png

同步传输与异步传输.png

NFS配置参数权限

  • rw : 存储目录是否有读写权限
  • ro : 存储目录是否时只读权限
  • sync : 同步方式存储数据 直接将数据保存到磁盘(数据存储安全)
  • async : 异步方式存储数据 直接将数据保存到内存(提高数据存储效率)
  • all_squash : 将所有用户身份都进行转换
  • root_squash : 将root用户身份进行转换
  • no_root_squash : 不要将root用户身份进行转换
  • no_all_squash : 不要将普通用户身份进行转换

共享目录的权限和哪些因素有关

  1. 和存储目录的本身权限有关 755,属主,属组
  2. 和配置文件中的权限配置有关rw,ro,xxx_squash,anonuid,anongid
  3. 和客户端mount命令的ro参数有关

实现多个网段主机可以进行挂载

vi /etc/exports

#方法一
/data   172.16.1.0/24(rw,sync) 10.0.0.0/24(rw,sync)

方法二
/data   172.16.1.0/24(rw,sync)
/data   10.0.0.0/24(rw,sync)

/var/lib/nfs/etab配置记录文件

该文件记录的是配置记录,没有配置过的参数会默认显示

[root@nfs01 data]# cat /var/lib/nfs/etab
/data   172.16.1.0/24(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)

nfs存储服务搭建.png

root_squash演示

为了方便演示,服务端目录权限为777,生产环境不允许设置777

  • 默认为该参数
  • 当客户端以root用户操作时,NFS转换为服务端用户
  • 默认参数为anonuid=65534,anongid=65534
[root@nfs01 data]# id 65534
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
  • 客户端root会转换为服务端nfsnobody,创建文件时属主和属组为nfsnobody
[root@web01 mnt]# touch root_squash
[root@web01 mnt]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 12月 12 11:04 root_squash

no_root_squash演示

为了方便演示,服务端目录权限为777,生产环境不允许设置777

  • 当客户端以root用户操作时,NFS不会转换为服务端用户
  • 客户端root对应服务端root,创建文件时属主和属组为root
[root@web01 mnt]# touch no_root_squash
[root@web01 mnt]# ll
总用量 0
-rw-r--r-- 1 root      root      0 12月 12 11:14 no_root_squash

all_squash演示

为了方便演示,服务端目录权限为777,生产环境不允许设置777

  • 当客户端以root用户或普通用户操作时,NFS转换为服务端用户
  • 默认参数为anonuid=65534,anongid=65534
[root@nfs01 data]# id 65534
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
  • 客户端root或普通用户会转换为服务端nfsnobody,创建文件时属主和属组为nfsnobody

root用户

[root@web01 mnt]# touch all_squash
[root@web01 mnt]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 12月 12 11:19 all_squash

普通用户

[1997sty@web01 mnt]$ touch 1997sty_all_squash
[1997sty@web01 mnt]$ ll
总用量 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 12月 12 11:21 1997sty_all_squash

no_all_squash演示

为了方便演示,服务端目录权限为777,生产环境不允许设置777

  • 默认为该参数

  • 当客户端以root用户操作时,NFS不会转换为服务端用户

  • 客户端root或普通用户的uidgid会对应服务端的uidgid,创建文件时属主和属组为对应的uidgid

root用户,需要设置no_root_squash

[root@web01 mnt]# touch no_root_squash
[root@web01 mnt]# ll
总用量 0
-rw-r--r-- 1 root      root      0 12月 12 11:14 no_root_squash

普通用户

[1997sty@web01 mnt]$ touch 1997sty_no_all_squash 
[1997sty@web01 mnt]$ ll
总用量 0
-rw-rw-r-- 1 1997sty 1997sty 0 12月 12 11:27 1997sty_no_all_squash

企业互联网公司如何配置NFS

  • 为了保证安全性,尽可能让更少的用户可以操作NFS目录,只让服务器软件和root用户可以操作该目录
  • 服务器软件使用的是www虚拟用户,一般会将NFS的目录的属组和属主设为www
  • 要保证服务端和客户端的www用户的uidgid相同,服务端会根据用户的giduid来判断用户
  • 默认设置为no_all_squashroot_squash
  • 设置root_squash的同时,还需要设置anonuidanongid的值为www的giduid(否则root用户会被映射为nfsnobody用户,从而无法操作目录)
  • 这样设置以后,root用户操作的文件和www虚拟用户操作的文件,属主和属组都为www用户,服务器软件操作时不会出现权限不足的情况

其他配置情况

  • /data 172.16.1.0/24(rw,sync) : 通用方法
  • /data 10.0.0.0/24(ro,sync) : 让部分人员不能操作存储目录 可以看目录中的数据
  • /data 10.0.0.0/24(ro,sync,anonuid=xxx,anongid=xxx) : 修改默认的匿名用户

服务重启

NFS服务器重启,挂载后创建数据比较慢

  • systemctl restart nfs : 重启会造成服务一瞬间的中断
  • systemctl reload nfs : 会重新加载配置文件,服务不会中断

nfs客户端详细配置说明

挂载NFS

mount -t nfs 172.16.1.31:/data  /mnt

mount命令独立于文件系统的装载选项

  • mount -o后追加的参数
  • rw : 实现挂载后挂载点目录可读写
  • ro : 实现挂载后挂载点目录只读
  • suid : 在共享目录中可以让setuid权限位生效
  • nosuid : 在共享目录中可以让setuid权限位失效提供共享目录的安全性
  • exec : 共享目录中的执行文件可以直接执行
  • noexec : 共享目录中的执行文件可以无法直接执行提供共享目录的安全性
  • auto : 可以实现自动挂载mount -a实现加载fstab文件自动挂载
  • noauto : 不可以实现自动挂载
  • user : 允许普通用户可以卸载挂载点
  • nouser : 禁止普通用户可以卸载挂载点

客户端如何强制卸载挂载点

  • -l : 不退出挂载点目录进行卸载
  • -f : 强制进行卸载操作
umount -lf /mnt