Linux 集群架构_NFS企业级网络共享存储服务器_01

 

 

 

 

 

 

10.2 NFS系统原理介绍

10.2.1 NFS系统挂载结构图解与介绍

如图10-5所示,在NFS服务器端设置好一个共享目录/video后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录/video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),图10-5中的两个NFS客户端本地的挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同。

客户端正确挂载完毕后,就进入到nfs客户端挂载点所在的/v/video或/video目录,此时可看到NFS服务器端/video共享出来的目录下的所有数据。在客户端上查看时,NFS服务器端/video目录就相当于客户端本地磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务端授予的NFS共享权限以及共享目录本地系统权限,只要在指定NFS客户端操作挂载/v/video或/video目录,就可以将数据轻松地存取到NFS服务器端上/video目录。

客户端挂载NFS后,本地挂载基本信息显示如下:

[root@nfs01 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
devtmpfs        476M     0  476M    0% /dev
tmpfs           487M     0  487M    0% /dev/shm
tmpfs           487M  7.5M  479M    2% /run
tmpfs           487M     0  487M    0% /sys/fs/cgroup
/dev/sda3        19G  2.0G   18G   11% /
/dev/sda1       253M  136M  118M   54% /boot
tmpfs            98M     0   98M    0% /run/user/0
172.16.1.31:/video  1002G  59G  892G  %7  /video   #<==172.16.1.31为nfs server的ip地址
提示: mount 源 目标
    mount 172.1c

从挂载信息来看,和本地的磁盘分区几乎没什么差别,只是文件系统对应列的开头是以IP地址开头的形式了。

经过前面的介绍,我们知道NFS系统是通过网络来进行数据传输的网络文件系统由来,因此,NFS会使用一些端口来传输数据,那么,NFS到底使用那些端口来进行数据传输呢?下面是NFS服务两次重启向rpc服务注册的端口列表结果对比,如图10-6所示。

由上面的实际测试得知,NFS在传输数据时使用的端口会随机选择。可能有读者会纳闷,既然这样,NFS客户端是怎样知道NFS服务端使用的是哪个端口呢?

答案:就是通过RPC(中文意思远程过程调用,英文Remote Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多,例如:百度。接下来,就来谈谈什么是RPC协议/服务。

10.2.2 什么是RPC(Remote Procedure Call)

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输只用,其中CentOS5.x的随机端口都小于1024,而CentOS7.6.x的随机端口都是较大的,见图10-6.

因为端口不固定,这样一来就会造成NFS客户端与NFS服务端的通信障碍,因为NFS客户端必须要知道NFS服务器端的数据传输端口才能进行通信,才能交互数据。

要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务类似NFS服务端和NFS客户端之间的一个中介,流程如图10-7所示。

拿房屋中介打个比喻吧:假设我们要找房子,这里的我们就相当于NFS客户端,中介介绍房子,中介就相当于RPC服务,房子所有者房东就相当于NFS服务,租房的人找房子,就要找中介,中介要预先存有房子主人房东的信息,才能将房源信息告诉租房的人。

那么RPC服务又是如何知道每个NFS的端口呢?

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

在启动NFS SERVER之前,首先要启动RPC服务注册了。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。要特别注意,修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行systemctl reload nfs或exportfs -rv 即可使修改的/etc/exports生效。

10.2.3 NFS的工作流程原理

前文描述的整合启动过程如图10-8所示

 

 

当访问程序通过NFS客户端向NFS服务端存取文件时,某请求数据流程大致如下:

1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件请求,这时

2)启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。


10.3 NFS服务端部署环境准备

10.3.1 NFS服务部署服务器准备

表10-1给出了部署NFS服务的准备信息,包括系统版本、各服务角色、IP地址等


提示:10.0.0.0段作为模拟外网IP,仅用来远程连接用,实际工作中存储服务器没有外网IP。

10.3.2 CentOS7.6 x86_64模拟环境信息

NFS服务端操作系统及内核版本信息如下:

[root@nfs01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.7.1908 (Core)
[root@nfs01 ~]# uname -r
3.10.0-1062.12.1.el7.x86_64
[root@nfs01 ~]# uname -m
x86_64

NFS客户端操作系统及内核版本信息和NFS服务端一致,不再累述。

10.4 NFS服务端的安装启动

10.4.1 NFS软件列表

要部署NFS服务,需要安装下面的软件包:

nfs-utils: NFS服务的主程序库,包括rpc.nfsd、rpc.mountd这两个daemons 和相关文档说明,以及执行命令文件等。

rpcbind: CentOS7.6/7下面RPC主程序。NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。

注意:有关RPC协议知识这里大家不必细究,详细说明可见本章结尾命令部分。

10.4.2 查看NFS软件包

可使用如下命令查看默认情况下NFS软件的安装情况。

[root@nfs01 ~]# rpm -qa nfs-utils rpcbind   <==这个不用管道的命令更有效率。

CentOS7.6默认没有安装NFS软件包(CentOS5 默认会安装),可以使用yum install nfs-utils rpcbind -y 命令来安装NFS软件。

[root@nfs01 ~]# yum install -y nfs-utils rpcbind
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-48.el7.x86_64
nfs-utils-1.3.0-0.65.el7.x86_64

 

如果出现rpcbind和nfs-utils开头的两个软件包,表示NFS服务端软件安装完毕。


10.4.3 启动NFS相关服务

1. 启动rpcbind服务

因为NFS及其辅助程序都是基于RPC(Remote Procedure Call)协议的(使用的端口为111),所以首先要确保系统中运行了rpcbind服务。有关RPC协议的介绍请见后文。启动的实际操作如下(是CentOS7.6环境下的操作):

[root@nfs01 ~]# systemctl status rpcbind #<==检查rpcbind服务状态
[root@nfs01 ~]# rpcinfo -p 127.0.0.1 <==检查rpc服务里注册的端口情况
[root@nfs01 ~]# systemctl start rpcbind <==开启rpcbind服务
[root@nfs01 ~]# systemctl status rpcbind #<==再次查看状态发现已开启,并自动开机启动
[root@nfs01 ~]# systemctl enable rpcbind.service #<==设置自动开机启动,其实不需要执行了,习惯性保留
[root@nfs01 ~]# netstat -lntup|egrep "rpc|nfs" #<==查看启动端口和进程情况
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      5343/rpc.mountd     
tcp        0      0 0.0.0.0:36883           0.0.0.0:*               LISTEN      5318/rpc.statd      
tcp6       0      0 :::51481                :::*                    LISTEN      5318/rpc.statd      
tcp6       0      0 :::20048                :::*                    LISTEN      5343/rpc.mountd     
udp        0      0 127.0.0.1:834           0.0.0.0:*                           5318/rpc.statd      
udp        0      0 0.0.0.0:35761           0.0.0.0:*                           5318/rpc.statd      
udp        0      0 0.0.0.0:20048           0.0.0.0:*                           5343/rpc.mountd     
udp        0      0 0.0.0.0:789             0.0.0.0:*                           5278/rpcbind        
udp6       0      0 :::20048                :::*                                5343/rpc.mountd     
udp6       0      0 :::48822                :::*                                5318/rpc.statd      
udp6       0      0 :::789                  :::*                                5278/rpcbind        

[root@nfs01 ~]# rpcinfo -p 127.0.0.1 #<==查看NFS服务向人品差服务注册的端口信息,因为NFS服务还没启,因此,没太多注册的端口映射信息。请注意和后面启动NFS服务后这里的对比。
   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
# 提示:111端口还是rpcbind服务对外提供服务的主端口。
    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  40178  nlockmgr
    100021    3   udp  40178  nlockmgr
    100021    4   udp  40178  nlockmgr
    100021    1   tcp  35795  nlockmgr
    100021    3   tcp  35795  nlockmgr
    100021    4   tcp  35795  nlockmgr

值得注意的是,CentOS7.6下停止了rpcbind服务,服务依然继续,并没有真的停止。

[root@nfs01 ~]# systemctl stop rpcbind
Warning: Stopping rpcbind.service, but it can still be activated by:
  rpcbind.socket #<==提示是说rpcbind还是活的状态,由rpcbind.socket支持的
[root@nfs01 ~]# rpcinfo -p 127.0.0.1 #<==依然有注册端口
   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
    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
    100024    1   udp  40177  status
    100024    1   tcp  38019  status
    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  40958  nlockmgr
    100021    3   udp  40958  nlockmgr
    100021    4   udp  40958  nlockmgr
    100021    1   tcp  40059  nlockmgr
    100021    3   tcp  40059  nlockmgr
    100021    4   tcp  40059  nlockmgr
[root@nfs01 ~]# netstat -lntup|egrep "rpcbind|111" #<==依然有进程和端口
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
udp        0      0 0.0.0.0:620             0.0.0.0:*                           3413/rpcbind        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd           
udp6       0      0 :::620                  :::*                                3413/rpcbind        
udp6       0      0 :::111                  :::*                                1/systemd           

2. 启动NFS服务

启动的命令如下:

[root@nfs01 ~]# systemctl start nfs#<==启动nfs服务,必须在rpcbind之后启动
[root@nfs01 ~]# systemctl enable nfs#<==设置开机自启动
[root@nfs01 ~]# systemctl status nfs#<==查看NFS启动状态
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
  Drop-In: /run/systemd/generator/nfs-server.service.d
           └─order-with-mounts.conf
   Active: active (exited) since 四 2020-02-27 08:10:19 CST; 1 day 3h ago
 Main PID: 1152 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

2月 27 08:10:19 nfs01 systemd[1]: Starting NFS server and services...
2月 27 08:10:19 nfs01 systemd[1]: Started NFS server and services.
2月 27 10:51:21 nfs01 systemd[1]: Reloading NFS server and services.
2月 27 10:51:21 nfs01 systemd[1]: Reloaded NFS server and services.
[root@nfs01 ~]# rpcinfo -p 127.0.0.1#<==查看NFS服务向rpc服务注册的端口信息,NFS服务启动后,我们发现信息就增多了,有很多端口和功能的对应,就是前面讲的原理部分。
   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
    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
    100024    1   udp  40177  status
    100024    1   tcp  38019  status
    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  40958  nlockmgr
    100021    3   udp  40958  nlockmgr
    100021    4   udp  40958  nlockmgr
    100021    1   tcp  40059  nlockmgr
    100021    3   tcp  40059  nlockmgr
    100021    4   tcp  40059  nlockmgr

 

10.4.4 NFS服务常见进程详解说明

从上面NFS服务启动的过程可以看出,运行NFS服务默认需要启动的服务或进程有:NFS daemon(nfsd)、NFS mountd(rpc.mountd)、rpc.statd、rpc.idmapd等。可以通过执行如下命令查看启动NFS后,系统中运行的NFS相关进程:

[root@nfs01 ~]# ps -ef|egrep "rpc|nfs"
root        407      2  0 2月27 ?       00:00:00 [rpciod]
root        846      1  0 2月27 ?       00:00:00 /usr/sbin/rpc.idmapd#<==名称映射进程
rpcuser    1148      1  0 2月27 ?       00:00:00 /usr/sbin/rpc.statd#<==查看文件一致性
root       1149      1  0 2月27 ?       00:00:00 /usr/sbin/rpc.mountd#<==权限管理验证
root       1154      2  0 2月27 ?       00:00:00 [nfsd4_callbacks]
root       1158      2  0 2月27 ?       00:00:00 [nfsd]#<==NFS主进程,管理登入ID身份判别等
root       1159      2  0 2月27 ?       00:00:00 [nfsd]
root       1160      2  0 2月27 ?       00:00:00 [nfsd]
root       1161      2  0 2月27 ?       00:00:00 [nfsd]
root       1162      2  0 2月27 ?       00:00:00 [nfsd]
root       1163      2  0 2月27 ?       00:00:00 [nfsd]
root       1164      2  0 2月27 ?       00:00:00 [nfsd]
root       1165      2  0 2月27 ?       00:00:00 [nfsd]
rpc        3413      1  0 10:57 ?        00:00:00 /sbin/rpcbind -w
root       3533   3457  0 11:27 pts/0    00:00:00 grep -E --color=auto rpc|nfs

 

NFS服务主要任务是共享数据,而数据的共享离不开权限问题。所以NFS服务器启动时最少需要两个不同的进程,一个是管理NFS客户端是否能够登入的rpc.nfsd主进程,另一个用于管理NFS客户端是否能够取得对应权限的rpc.mountd进程。如果还需要管理磁盘配额,则NFS还要再加载rpc.rquotad进程。表10-2给出了NFS服务启动的进程说明。

对以上进程查看,均可以执行“man 进程名”命令,例如:“man rpc.idmapd”,
可查看。


10.5 实战配置NFS服务端

10.5.1 NFS服务端配置文件路径

NFS服务的默认配置文件路径为:/etc/exports,并且默认是空的。

[root@nfs01 ~]# ls -l /etc/exports
-rw-r--r-- 1 root root 164 2月  27 10:49 /etc/exports
[root@nfs01 ~]# cat /etc/exports

 

提示:NFS默认配置文件/etc/exports其实是存在的,但是没有内容,需要用户自行配置。

10.5.2 exports配置文件格式

/etc/exports 文件配置格式为:

NFS共享的目录 NFS客户端地址1(参1,参2....) 客户端地址2(参1,参2....)

NFS共享的目录 NFS客户端地址1(参1,参2....)

查看exports语法文件格式帮助的方法为:

执行man exports命令,然后切换到文件结尾,可以快速看如下样例格式

EXAMPLE
       # sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)

 

 


上述各个列的参数含义如下:

NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径,如(/data).注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。

NFS客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务服务器,例如:Web服务,具体说明见表10-3 。

权限参数集:对授权的NFS客户端的访问权限设置。参数具体说明见后文。

 

10.5.3 企业生产场景NFS exports 配置实例

下面介绍企业生产环境中常见的NFS配置实例,具体配置见表10-4.

这里以“配置例一”为例进行说明,如下:

/data为要共享的NFS服务器端的目录,注意,被共享的目录一定要用绝对路径。

172.16.1.0/24表示允许NFS客户端访问共享目录的网段范围。24表示255.255.255.0 。


10.6 NFS配置参数权限

10.6.1 NFS配置文件权限参数说明

本节将介绍NFS服务器端的权限设置,即/etc/exports文件配置格式中小括号()里的参数集,具体见表10-5 。

图10-9 NFS配置权限设置常用参数关系图解

 

大家可以通过执行man exports查阅更多exports参数说明,这种man查询的方法是通过高手层次的必经之路。希望读者能够尽早掌握man工具。

配置好nfs服务后,通过cat /var/lib/nfs/etab 命令可以看到NFS配置的参数以及默认自带的参数。结果如下:

[root@nfs01 ~]# cat /var/lib/nfs/etab
/data1    10.0.0.0/24(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
/data    172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1111,anongid=1111,sec=sys,rw,secure,root_squash,all_squash)

 

怎么样?很多吧?别怕,其实,一般情况下,大多数参数我们不需要理会。尤其是对于初学者。

 

posted @ 2020-02-26 12:25  丁海龙  阅读(352)  评论(0)    收藏  举报