1.1 NFS服务简介

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

rpcbind查看绑定端口 rpc111端口_RPC

 

 NFS客户端可以将NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看远程主机的目录就好像是自己的一个磁盘分区一样。

 1.2   RPC与NFS通讯原理   

    NFS本身的服务并没有提供数据传递的协议,而是通过使用RPC(远程过程调用 Remote Procedure Call)来实现。当NFS启动后,会随机的使用一些端口,NFS就会向RPC去注册这些端口。RPC就会记录下这些端口,RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前,首先要确保rpc服务启动

  

rpcbind查看绑定端口 rpc111端口_客户端_02

 

 

  1、首先服务器端启动RPC服务,并开启111端口;

  2、服务器端启动NFS服务,并向RPC注册端口信息;

  3、客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口;

  4、服务端的RPC(portmap)服务反馈NFS端口信息给客户端;

  5、客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

1.3 服务进程功能

nfsd最主要的NFS服务提供程序,管理客户端是否能够使用服务器文件系统挂载信息,其中还包含判断这个登录用户的ID。

rpc.mountd主要功能则是管理NFS的文件系统。当client端顺利通过rpc.nfsd登入主机后,在它可以使用NFS服务器提供规定文件之前,还会经过文件使用权限的认证程序。它会去读取NFS的配置文件/etc/exports来对比客户端的权限,当通过这一关之后,client端也就取得使用NFS文件的权限。

rpc.lockd用于管理文件的锁定方面,当多个客户端同时尝试写入某个文件时就可以对该文件造成一些问题。rpc.lockd则可以用来克服这此问题。但rpc.lockd必须要同时在客户端和服务器端都开启才行。

rpc.statd:用来检查文件的一致性,若发生因为客户端同时使用同一个文件造成文件损坏时,rpc.statd可以用来检测并尝试恢复该文件。

1.4 服务端服务搭建

 系统环境如下:

[root@nfs01 ~]# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[root@nfs01 ~]#

 Step1 查看服务端系统是否安装rpcbind和nfs-utils

[root@nfs01 ~]# rpm -qa|grep rpcbind
rpcbind-1.2.5-7.el8.x86_64
[root@nfs01 ~]# rpm -qa|grep nfs-utils
nfs-utils-2.3.3-31.el8.x86_64
[root@nfs01 ~]#

 Step2 安装rpcbind和nfs-utils软件

[root@nfs01 ~]# yum install rpcbind nfs-utils -y

 Step3 启动并添加开机启动

[root@nfs01 ~]# systemctl start rpcbind.service
[root@nfs01 ~]# systemctl enable rpcbind.service
[root@nfs01 ~]# systemctl start nfs-server.service
[root@nfs01 ~]# systemctl enable nfs-server.service

 Step 4查看rpc启动进程信息

  通过rpcinfo命令查看未开启nfs-server前rpc进程信息

[root@nfs01 ~]# rpcinfo -p 10.0.0.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  44396  status
    100024    1   tcp  40333  status
[root@nfs01 ~]#

 通过rpcinfo命令查看开启nfs-server前rpc进程信息

[root@nfs01 ~]# rpcinfo -p 10.0.0.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  44396  status
    100024    1   tcp  40333  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
    100021    1   udp  45564  nlockmgr
    100021    3   udp  45564  nlockmgr
    100021    4   udp  45564  nlockmgr
    100021    1   tcp  43723  nlockmgr
    100021    3   tcp  43723  nlockmgr
    100021    4   tcp  43723  nlockmgr
[root@nfs01 ~]#

 Step 5客户端软件安装

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

 Step 6服务端配置共享文件

 创建nfsnobody用户

[root@nfs01 ~]#useradd -s /sbin/nologin nfsnobody -M

 创建共享目录并修改用户组权限

[root@nfs01 ~]#ckdir /data1001
[root@nfs01 ~]#chown nfsnobody.nfsnobody /data1001

 编辑exports文件添加共享目录

[root@nfs01 ~]#vim /etc/exports
               /data1001  172.16.1.0/24(rw,sync)

 通过exportfs -r重发布共享目录

 

[root@nfs01 ~]# exportfs -v
  /data1001       172.16.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

 Step 7客户端文件挂载测试

[root@ zabbix ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1001    172.16.1.0/24
/data/zabbix 172.16.1.8
/data/web    172.16.1.7
/data/mysql  172.16.1.51
[root@zabbix ~]# mount -t nfs 172.16.1.31:/data /data1
[root@zabbix ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             381M     0  381M   0% /dev
tmpfs                399M     0  399M   0% /dev/shm
tmpfs                399M   41M  358M  11% /run
tmpfs                399M     0  399M   0% /sys/fs/cgroup
/dev/mapper/cl-root   20G  4.4G   16G  23% /
/dev/mapper/cl-home  8.0G   98M  7.9G   2% /home
/dev/sda1            477M  143M  306M  32% /boot
tmpfs                 80M  4.0K   80M   1% /run/user/0
172.16.1.31:/data1001     20G  4.4G   16G  23% /data1
[root@zabbix ~]#

1.5 NFS共享目录权限问题

 共享目录权限主要是由exports中目录配置的权限,常用权限如下:

  rw:表示可读写权限。

  ro:表示只读权限。

  sync:请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。(优点:数据安全不会丢。缺点:性能比启用该参数要差)。

  async:写入时数据会先写到内存缓冲区,只到硬盘有空档才会再写入磁盘,这样可以提升写入效率!风险:若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决办法:服务器主板电池或加UPS不间断电源)。

  no_root_squash:访问NFS Server共享目录的用户如果是root的话,它对该共享目录具有root权限,这个配置原本是为无盘客户端准备的。用户应避免使用。

  root_squash:如果访问NFS Server共享目录的用户是root,则它的权限将压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份。

  all_squash:不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。

系统默认权限如下(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

1.6 NFS维护命令

 客户端维护命令

   /usr/sbin/showmount 查看服务器端共享的目录信息

[root@ zabbix ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1001    172.16.1.0/24
/data/zabbix 172.16.1.8
/data/web    172.16.1.7
/data/mysql  172.16.1.51

 服务端维护命令

   /usr/sbin/exportfs 查看服务端共享的目录信息

[root@nfs01 ~]# /usr/sbin/exportfs
/data/mysql     172.16.1.51
/data/web       172.16.1.7
/data/zabbix    172.16.1.8
/data1001       172.16.1.0/24

  rpcinfo -p localhost 查看RPC服务的注册信息

[root@nfs01 ~]# rpcinfo -p localhost
   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  44396  status
    100024    1   tcp  40333  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
    100021    1   udp  45564  nlockmgr
    100021    3   udp  45564  nlockmgr
    100021    4   udp  45564  nlockmgr
    100021    1   tcp  43723  nlockmgr
    100021    3   tcp  43723  nlockmgr
    100021    4   tcp  43723  nlockmgr
[root@nfs01 ~]#

   exportfs -r 更新exports文件共享目录信息

   systemctl restart nfs-server 重启nfs服务

   systemctl restart rpcbind 重启rpcbind服务

1.7 生产环境配置注意事项

  1-确保所有客户端服务器对NFS共享目录具备相同的用户访问权限

  • all_squash把所有客户端都压缩成固定的匿名用户(UID相同);
  • anonuid,anongid指定的UID和GID的用户;

  2-所有的客户端和服务端都需要有一个相同的GID和UID用户,即nfsnobody(UID必须相同)

  • 修改命令usermod -u 1003 nfsnobody && groupmod -g 1003 nfsnobod

  3-指定共享目录权限anonuid和anongid

[root@nfs01 data1001]# cat /etc/exports
172.16.1.0/24(rw,sync,root_squash,all_squash,anonuid=1001,anongid=1001)
[root@nfs01 data1001]#

1.8 固定nfs服务端口

 NFS启动时会随机启动多个端口并向RPC注册,为了设置安全组以及iptables规则,需要设置NFS固定端口。

 NFS服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务,其中nfs、portmapper的端口是固定的,另外三个服务的端口是随机分配的,所以需要给mountd,nlockmgr,rquotad设置固定的端口。

 在/etc/sysconfig/nfs中添加如下端口配置后重启nfs服务

RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004