1. NFS介绍

1.1 什么是NFS?

  • NFS是Network File System的缩写,中文意思是网络文件系统。

  • 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。

  • NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。

  • 从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

  • NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器影射,这也和Linux系统里的samba服务类似。只不过一般情况下,Windows网络共享服务或samba服务用于办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享。如果是大型网站,那么有可能会用到更复杂的分布式文件系统,例如:Moosefs(mfs),GlusterFS,FastDFS等。

1.2 NFS的历史介绍

  • 1976年,第一个网络文件系统被成为File Access Listener
  • NFS是第一个构建于IP协议之上的现代网络文件系统。
  • 1980年,首先作为实验的文件系统,由Sun Microsystems在内部完成开发。
  • NFS协议归属于Request for Comments(RFC)标准,并且随后演化为NFSv2。
  • 随后,标准继续演化,成为NFSv3.

NFS系统已经有了近30年的发展。它代表了一个非常稳定的(可移植)网络文件系统,具备可扩展、高性能等特性,并达到了企业级应用质量标准。

1.3 NFS在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享里。

例如:BBS产品的图片,附件,头像(注意网站BBS程序不要放NFS共享里),然后前端所有的节点访问这些静态资源时都会读取NFS存储上的资源。

NFS是当前互联网系统架构中最常用的数据存储服务之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,比如Moosefs(mfs),GlusterFS,FastDFS等。

在企业生产集群架构中,NFS作为所有前端Web服务的共享存储,存储的内容一般包括网站用户上传的图片,附件,头像等,注意,网站的程序代码不要放NFS共享里,因为网站程序是开发运维人员统一发布的,不存在发布延迟问题,直接批量发布到Web节点提供访问比共享到NFS里访问效率更高。

1.4 企业生产集群为什么需要共享存储角色?

这里通过图解给大家展示以下集群架构需要共享存储服务的理由。

例如:

A用户上传图片到Web1服务器,然后让B用户访问这张图片,结果B用户访问的请求分发到了Web2,因为Web2上没有这张图片,这就导致它无法看到A用户上传的图片,如果此时有一个共享存储,A用户上传图片的请求无论是分发到Web1还是Web2上,最终都会存储到共享存储上,而在B用户访问图片时,无论请求分发到Web1还是Web2上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通PC服务器配置NFS网络文件系统实现。

当及集群中没有NFS共享存储时,用户访问图片的情况如下图所示。

下图是企业生产集群有NFS共享存储的情况:

中小型互联网企业一般不会买硬件存储,因为太贵,大公司如果业务发展很快的话,可能会临时买硬件存储顶一下网站压力,当网站并发继续加大时,硬件存储的扩展相对就会很费劲,且价格成几何级数增加。

例如:淘宝网就曾替换掉了很多硬件设备,比如,用lvs+haproxy替换了netscaler负载均衡设备,用FastDFS,TFS配合PC服务器替换了netapp,emc等商业存储设备,去IOE正在成为互联网公司的主流。


2. NFS系统原理介绍

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

下图是企业工作中的NFS服务器与客户端挂载情况结构图:

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

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

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

[root@nfs-client ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.5G 5.1G 23% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
192.168.0.31:/video 1G 100M 900M 10% /video # nfs服务器的ip地址和共享目录

挂载方式:

  mount 源 目标

  mount 192.168.0.31:/video  /video

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

经过前面的介绍,我们知道NFS系统是通过网络来进行数据传输的(所以叫做网络文件系统)因此,NFS会使用一些端口来传输数据,那么,NFS到底使用哪些端口来进行数据传输呢?

  • NFS在传输数据时使用的端口会随机选择。

既然这样,NFS客户端是怎么知道NFS服务端使用的哪个端口呢?

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

2.2 什么是RPC

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

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

要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了。

NFS的RPC服务最主要的功能:

  • 就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。
  • 这个RPC服务类似NFS服务端和NFS客户端之间的一个中介。

就拿房屋中介打个比喻吧:

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

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

  • 这是因为,当NFS服务端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能了,然后RPC服务使用固定的111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端,这样一来,NFS客户端就可以与NFS服务端进行数据传输了。
  • 在启动NFS SERVER之前,首先要启动RPC服务(CentOS5.x下为portmap服务,CentOS6.x下为rpcbind服务,下同),否则NFS SERVER就无法向RPC服务注册了。
  • 另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。
  • 要特别注意的是,一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs -rv即可使修改的/etc/exports生效。

2.3 NFS的工作流程原理

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

1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。

2)NFS服务端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)

3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据

4)NFS客户端把数据存取成功后,返回给前端访问程序,告知给用户存取结果,作为网站用户,就完成了一次存取操作。

因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务(rpcbind服务)才能获取到NFS服务的各项功能对应的端口号(port number),PID,NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务(rpcbind服务)询问才能找到正确的端口。

也就是说,NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。

从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpcbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。

注意:
NFS的RPC服务,在CentOS5.X下名称为portmap,在CentOS6.x下名称为rpcbind


3. NFS部署

3.1 服务端和客户端的环境准备

(统一使用模版机进行克隆)

3.1.1 角色-ip

角色 主机名 eth0(外网) eth1(内网)
C1-NFS服务器端 nfs01 10.0.0.31 192.168.0.31
C2-Rsync存储服务器 backup 10.0.0.41 192.168.0.41
B2-nginx web服务器 web01 10.0.0.8 192.168.0.8

3.1.2 主机名设置

[root@web01-8 ~]# hostname
web01-8
[root@web01-8 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=web01-8 # 其它两台机器分别为:
[root@nfs-31 ~]# hostname
nfs-31

 [root@backup-41 ~]# hostname
  backup-41

3.1.3 操作系统和内核版本

[root@web01-8 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@web01-8 ~]# uname -r
2.6.32-573.el6.x86_64

3.1.4 /etc/hosts本地dns解析文件

[root@web01-8 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.5 lb01
192.168.0.6 lb02
192.168.0.7 web02
192.168.0.8 web01
192.168.0.51 db01
192.168.0.31 nfs01
192.168.0.41 backup
192.168.0.61 m01

3.2 NFS 服务端的设置

3.2.1 NFS软件列表

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

    • nfs-utils:
      NFS服务的主程序,包括rpc.nfsd, rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
    • rpcbind:
      CentOS6.X下面RPC的主程序。NFS可以视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的对应映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。

3.2.2 查看NFS软件包

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

    rpm -qa nfs-utils rpcbind

如果未安装,则使用yum -y install nfs-utils rpcbind 安装。

当不知道软件名字时候,可以用rpm -qa | grep -E "nfs-|rpcbind"来过滤包含在引号内的字符串。

CentOS6.8默认没有安装NFS软件包,可以使用yum -y install nfs-utils rpcbind命令来安装NFS软件。

3.2.3 启动NFS相关服务

启动rpcbind

因为NFS及其辅助程序都是基于RPC(remote Procedure Call)协议的(使用的端口为111),所以首先要确保系统中运行了rpcbind服务。

启动的实际操作如下:

[root@web01-8 ~]# /etc/init.d/rpcbind status  # 查看rpcbind服务状态
rpcbind is stopped
[root@web01-8 ~]# /etc/init.d/rpcbind start # 启动rpcbind服务
Starting rpcbind: [ OK ]
[root@web01-8 ~]# rpcinfo -p localhost # 查看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

注意:111端口为rpcbind服务对外提供服务的主端口。

通过chkconfig命令查看开机自启动服务中rpcbind的状态。

[root@web01-8 packages]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off

如果rpcbind服务未启动,执行rpcinfo -p localhost检查时,会报如下错误。

rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused

即:rpcinfo无法同portmapper交互:RPC:远程系统错误-拒绝连接。

解决办法:执行/etc/init.d/rpcbind start启动rpcbind服务即可。

启动NFS服务

[root@web01-8 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
正在启动 RPC idmapd: [确定]

注意:如果不启动rpcbind服务,直接启动nfs服务,会启动失败。

 

查看NFS服务向rpc服务注册的端口信息:

[root@web01-8 packages]# 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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 56093 mountd
100005 1 tcp 61293 mountd
100005 2 udp 52653 mountd
100005 2 tcp 35532 mountd
100005 3 udp 60787 mountd
100005 3 tcp 56885 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 12625 nlockmgr
100021 3 udp 12625 nlockmgr
100021 4 udp 12625 nlockmgr
100021 1 tcp 29370 nlockmgr
100021 3 tcp 29370 nlockmgr
100021 4 tcp 29370 nlockmgr

NFS服务常见进程说明:

从上面NFS服务启动过程可以看出,运行NFS服务默认需要启动的服务或进程有:

  • NFS quotas(rpc.rquotad)  磁盘配额进程,remote quota server
  • NFS daemon(nfsd)   nfs主进程
  • NFS mountd(rpc.mountd)。  权限管理验证等,NFS mount daemon

可以通过执行如下命令查看启动NFS后,系统中运行的NFS相关进程:

[root@web01-8 packages]# ps -ef|egrep 'rpc|nfs'
rpc 5624 1 0 16:48 ? 00:00:00 rpcbind
root 5668 2 0 16:51 ? 00:00:00 [rpciod/0]
root 5677 1 0 16:51 ? 00:00:00 rpc.rquotad # 磁盘配额进程remote quota server
root 5682 1 0 16:51 ? 00:00:00 rpc.mountd # 权限管理验证等 NFS mount daemon
root 5689 2 0 16:51 ? 00:00:00 [nfsd4]
root 5690 2 0 16:51 ? 00:00:00 [nfsd4_callbacks]
root 5691 2 0 16:51 ? 00:00:00 [nfsd] # nfs主进程
root 5692 2 0 16:51 ? 00:00:00 [nfsd] # nfs主进程
root 5693 2 0 16:51 ? 00:00:00 [nfsd]
root 5694 2 0 16:51 ? 00:00:00 [nfsd]
root 5695 2 0 16:51 ? 00:00:00 [nfsd]
root 5696 2 0 16:51 ? 00:00:00 [nfsd]
root 5697 2 0 16:51 ? 00:00:00 [nfsd]
root 5698 2 0 16:51 ? 00:00:00 [nfsd]
root 5729 1 0 16:51 ? 00:00:00 rpc.idmapd # name mapping daemon
root 5870 5503 0 18:20 pts/0 00:00:00 grep -E rpc|nfs

NFS服务的主要任务是共享文件系统数据,而文件系统数据的共享离不开权限问题。

所以NFS服务器启动时最少需要两个不同的进程:

  • 管理NFS客户端是否能够登入的rpc.nfsd主进程
  • 管理NFS客户端是否能够取得对应权限的rpc.mountd进程。
  • 如果还需要管理磁盘配额,则NFS还要再加载rpc.rquotad进程。
服务或进程名 用途说明
nfsd(rpc.nfsd) rpc.nfsd主要功能是管理NFS客户端是否能够登入NFS服务端主机,其中还包含登入者的ID判别等
mountd(rpc.mountd)

rpc.mountd的主要功能则是管理NFS文件系统。

当NFS客户端顺利通过rpc.nfsd登入NFS服务端主机时,在使用NFS服务器提供数据之前,它会去读NFS的配置文件/etc/exports来比对NFS客户端的权限,通过这一关之后,还会经过NFS服务端本地文件系统使用权限(就是owner,group,other权限)的认证程序。

如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限。

注意,这个/etc/exports文件也是我们用来管理NFS共享目录的使用权限与安全设置的地方,特别强调,NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身系统权限有关。

rpc.lockd(非必需)

可用来锁定文件,用于多客户端同时写入。

rpc.statd(非必须)

检查文件的一致性,与rpc.lockd有关。c,d两个服务需要客户端、服务端同时开启才可以;rpc.statd监听来自其它主机重启的通知,并且管理当本地系统重启时主机列表。

rpc.idmapd

名字映射后台进程

查看以上进程,均可以用man 进程名  的方式查看相关说明。

配置NFS服务器端服务开机自启动

[root@web01-8 packages]# chkconfig rpcbind on
[root@web01-8 packages]# chkconfig nfs on

特别说明:
在很多大企业里,大都是统一按照运维规范将服务的启动命令放到/etc/rc.local文件里的,而不是用chkconfig管理的。

把/etc/rc.local文件作为本机的重要服务档案文件,所有服务的开机自启动都必须放入/etc/rc.local。

这样规范的好处是,一旦管理此服务器的人员离职,或者业务迁移都可以通过/etc/rc.local很容易的查看到服务器对应的相关服务,可以方便的运维管理。

下面是把启动命令放入到/etc/rc.local文件中的配置信息,注意别忘了加上启动服务的注释。

[root@web01-8 packages]# tail -3 /etc/rc.local
# start up nfs service
/etc/init.d/rpcbind start
/etc/init.d/nfs start

3.3 配置NFS服务端

3.3.1 NFS服务端配置文件路径

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

[root@web01-8 packages]# ls -l /etc/exports
-rw-r--r-- 1 root root 0 Jan 12 2010 /etc/exports
[root@web01-8 packages]# cat /etc/exports

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

可以通过man exports查看配置文件说明,和rsync的配置文件man rsyncd.conf查看方式是一致的。

3.3.2  exports配置文件格式

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

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

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

查看exports语法文件格式帮助的方法为:
执行man exports命令,然后切换到文件结尾,可以快速看如下样例格式:

# 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服务器端要共享的实际目录,要用绝对路径。注意共享目录的本地权限,如果需要读写权限,一定要让本地目录可以被NFS客户端的用户nfsnobody读写
  • NFS客户端地址:为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端,一般来说是前端的业务服务器,如:Web服务。
  • 权限参数集:对授权的NFS客户端的访问权限设置。
客户端地址 具体地址 说明
授权单一客户端访问NFS 10.0.0.30 一般情况,生产环境中此配置不多
授权整个网段可访问NFS 10.0.0.0/24

指定网段为生产环境中最常见的配置。

配置简单,维护方便

授权整个网段可访问NFS 10.0.0.* 指定网段的另一种写法(不推荐使用)
授权某个域名客户端访问 nfs.baidu.com 生产环境中不常用
授权整个域名客户端访问 *.baidu.com 生产环境中不常用

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

配置例1: /data 10.0.0.0/24(rw,sync) 

允许客户端读写,并且数据同步写到服务器端的磁盘里,注意,24和“(”之间不能有空格。

[root@nfs-31 ~]# mkdir /data -p
[root@nfs-31 ~]# id nfsnobody # nfs用rpm安装时,会自动创建虚拟用户nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
[root@nfs-31 ~]# ls -ld /data
drwxr-xr-x. 8 root root 4096 8月 31 23:21 /data
[root@nfs-31 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs-31 ~]# ls -ld /data
drwxr-xr-x. 8 nfsnobody nfsnobody 4096 8月 31 23:21 /data

配置/etc/exports配置文件:

[root@nfs-31 ~]# cat /etc/exports
# shared /data by zoe for test at 20191205
/data 192.168.0.0/24(rw,sync)

修改配置文件后,平滑重启nfs服务:

[root@nfs-31 ~]# /etc/init.d/nfs reload
[root@nfs-31 ~]# showmount -e 192.168.0.31 # 查看生效的nfs配置文件规则
Export list for 192.168.0.31:
/data 192.168.0.0/24

说明:

  • /data为要共享的NFS服务器端的目录,注意,被共享的目录一定要用绝对路径
  • 10.0.0.0/24 表示允许NFS客户端访问共享目录的网段范围。
  • (rw,sync)中的rw表示允许读写,sync表示数据同步写入到NFS服务器端的硬盘中
  • 也可以用通配符*替换IP地址,表示允许所有主机,也可以写成10.0.0.*的形式
  • 如果不授权属主,数组,那么共享目录挂载以后,将不遵循配置文件exports的设定好的读写规则。虽然能正常挂载,但是会导致写入文件时提示没有权限。
  • 修改配置文件后,必须重启nfs服务(reload,平滑重启,相当于exportfs -rw)
  • showmount -e ip地址,查看生效的nfs配置文件规则

配置例2: /data/blog 10.0.0.0/24(rw, sync, all_squash, anonuid=2000,anongid=2000)

允许客户端读写,并且数据同步写到服务器端的磁盘里,并且指定客户端的用户UID和GID。

早期生产环境的一种配置,适合多客户端共享一个NFS服务单目录,如果所有服务器的nfsnobody账户UID都是65534,则本例没什么必要了。

早期CentOS 5.5 系统默认情况下nfsnobody的UID不一定是65524,此时如果这些服务器共享一个NFS目录,就会出现访问权限问题。

配置例3: /home/oldboy 10.0.0.0/24(ro)

用途:在生产环境中,开发人员有查看生产服务器日志的需求,但又不希望给开发生产服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器的日志目录(NFS共享)的权限。

3.4 NFS配置参数权限

即/etc/exports文件配置格式中小括号()里的参数集。

  • rw   read-write,可读写
  • ro   read-only,只读
  • sync  (同步,实时)请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回。数据安全不会丢,但是性能比不启用该参数要差。
  • async  (异步)写入时数据会先写到内存缓冲区,直到硬盘有空档才会再写入磁盘,这样可以提升写入效率!风险是服务器宕机或不正常关机,可能会丢失buffer的数据。
  • no_root_squash  访问NFS Server共享目录的用户如果是root的话,对该共享目录具有root权限。这个配置是未无盘客户端准备的。用户应避免使用/
  • root_squash  访问NFS Server共享目录的用户是root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份
  • all_squash  不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时UID和GID都会变成nfsnobody的账号身份。
    • 在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用
    • 在生产中配置NFS的重要技巧:
      • 确保所有客户端服务器对NFS共享目录具备相同的用户访问权限

        • all_squash把所有客户端都压缩成固定的匿名用户(UID相同)
        • 就anonuid,anongid指定的UID和GID的用户
      • 所有的客户端和服务器端都需要有一个相同的UID和GID的用户,即nfsnobody(UID必须相同)
  • anonuid  参数以anon*开头,即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。
    • 这个指定的UID必须存在/etc/passwd中
    • 在多NFS 客户端时,如多台Web Server共享一个NFS目录,通过这个参数可以使得不同的NFS客户端写入数据时对所有NFS客户端保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。
  • anongid  同anonuid,区别就是把uid换成gid

可以通过man exports查阅更多exports参数说明。

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

[root@nfs-31 ~]# cat /var/lib/nfs/etab
/data 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

一般情况下, 大多数参数我们不需要理会。

3.5 NFS服务企业案例配置实践

将NFS服务端上的/data目录共享给192.168.0.0/24  整个网段的主机,且可读写。

【NFS服务端】

# 系统环境
[root@nfs-31 mnt]# cat /etc/redhat-release
CentOS release 6.10 (Final)
[root@nfs-31 mnt]# uname -r
2.6.32-573.el6.x86_64
[root@nfs-31 mnt]# uname -m
x86_64 # 查看rpcbind和nfs服务,并设置开机自启动
[root@nfs-31 mnt]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-16.el6.x86_64
nfs-utils-1.2.3-78.el6_10.1.x86_64 [root@nfs-31 mnt]# /etc/init.d/rpcbind status
rpcbind 已停
[root@nfs-31 mnt]# /etc/init.d/rpcbind start
正在启动 rpcbind: [确定] [root@nfs-31 mnt]# /etc/init.d/nfs status
rpc.svcgssd 已停
rpc.mountd 已停
nfsd 已停
rpc.rquotad 已停
[root@nfs-31 mnt]# /etc/init.d/nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS mountd: [确定]
启动 NFS 守护进程: [确定]
正在启动 RPC idmapd: [确定] [root@nfs-31 mnt]# chkconfig --list rpcbind
rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@nfs-31 mnt]# chkconfig --list nfs
nfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 [root@nfs-31 mnt]# tail -3 /etc/rc.local # chkconfig和/etc/rc.local的配置二选一即可。
# start up nfs service
/etc/init.d/rpcbind start
/etc/init.d/nfs start # 创建需要共享的目录并授权
mkdir /data -p
grep nfsnobody /etc/passwd
chown -R nfsnobody.nfsnobody /data
ls -ld /data # 配置NFS服务配置文件,并且在本地查看挂载信息
[root@nfs-31 mnt]# cat /etc/exports
# shared /data by zoe for test at 20191205
/data 192.168.0.0/24(rw,sync) [root@nfs-31 mnt]# exportfs -rv # 加载配置,可以用来检查配置文件是否合法
exporting 192.168.0.0/24:/data # 在NFS服务器本地查看挂载情况
showmount -e 192.168.0.31
showmount -e localhost # 通过查看nfs服务器配置文件的参数(包括默认加载的参数)
[root@nfs-31 mnt]# cat /var/lib/nfs/etab
/data 192.168.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,root_squash,no_all_squash)

在本地服务器端,同时又作为客户端进行挂载测试:

[root@nfs-31 mnt]# mount -t nfs 192.168.0.31:/data /mnt
[root@nfs-31 mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.9G 4.7G 28% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 190M 67M 114M 37% /boot
192.168.0.31:/data 6.9G 1.9G 4.7G 28% /mnt

看上成功将nfs的共享目录挂载在/mnt目录下。

说明:

  • /data为要共享的NFS服务器端的目录,注意,被共享的目录一定要用绝对路径
  • 10.0.0.0/24 表示允许NFS客户端访问共享目录的网段范围。
  • (rw,sync)中的rw表示允许读写,sync表示数据同步写入到NFS服务器端的硬盘中
  • 也可以用通配符*替换IP地址,表示允许所有主机,也可以写成10.0.0.*的形式
  • 如果不授权属主,数组,那么共享目录挂载以后,将不遵循配置文件exports的设定好的读写规则。虽然能正常挂载,但是会导致写入文件时提示没有权限。
  • 修改配置文件后,必须重启nfs服务(reload,平滑重启,相当于exportfs -rw)
  • showmount -e ip地址,查看生效的nfs配置文件规则

【NFS客户端】

在所有的NFS客户端上执行的操作都是相同的。

# 系统环境
[root@backup-41 ~]# cat /etc/redhat-release
CentOS release 6.10 (Final)
[root@backup-41 ~]# uname -r
2.6.32-573.el6.x86_64
[root@backup-41 ~]# uname -m
x86_64 # 检查安装包
[root@backup-41 ~]# rpm -qa rpcbind
rpcbind-0.2.0-16.el6.x86_64
# 为了使用showmount等功能,所有客户端最好也安装NFS软件,但不启动NFS服务
rpm -qa nfs-utils # 启动rpc服务(不需要启动NFS服务)
[root@backup-41 ~]# /etc/init.d/rpcbind status
rpcbind is stopped
[root@backup-41 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ] [root@backup-41 ~]# showmount -e 192.168.0.31
Export list for 192.168.0.31:
/data 192.168.0.0/24 # 挂载NFS共享目录/data
[root@backup-41 ~]# mount -t nfs 192.168.0.31:/data /mnt
[root@backup-41 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.9G 4.7G 28% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 190M 67M 114M 37% /boot
192.168.0.31:/data 6.9G 1.9G 4.7G 28% /mnt # 测试
[root@backup-41 mnt]# cd /mnt
[root@backup-41 mnt]# ls
[root@backup-41 mnt]# mkdir /mnt/backup/rpcbind/test -p
[root@backup-41 mnt]# ls
backup file # 在nfs服务端查看共享目录/data
[root@nfs-31 mnt]# ls /data
backup file

将rpcbind服务和挂载加入开机自启动:

[root@backup-41 mnt]# tail -3 /etc/rc.local
# rpcbind start and mount shared directory ip:/data
/etc/init.d/rpcbind start
/bin/mount -t nfs 192.168.0.31:/data /mnt

4. NFS服务的重点知识梳理

当多个NFS客户端访问服务器端的读写文件时,需要具有以下几个权限:

  • NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限
  • NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限。
  • 每台机器都对应存在和NFS默认配置UID的相同UID 65534的nfsnobody用户
    • 确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置。

只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其它任意NFS客户端上传文件的权限。

这在大规模的集群环境中作为集群共享存储时,尤为重要。

重点NFS服务文件或命令的说明:

1. /etc/exports   NFS服务主配置文件,配置NFS具体共享服务的地点,默认内容为空,以行为单位。

2. /usr/sbin/exportfs  NFS服务的管理命令。

例如:

  可以加载NFS配置生效,还可以直接配置NFS共享目录,即,无需配置/etc/exports实现共享。

  exportfs -rv   加载配置生效,等价优雅平滑重启/etc/init.d/nfs reload。

  exportfs不但可以加载配置生效,也可以通过命令直接共享目录,越过/etc/exports,但是重启失效。

3. /usr/sbin/showmount  在客户端查看NFS配置及挂载结果的命令。配置nfsserver,分别在服务器端和客户端查看挂载情况

4. /var/lib/nfs/etab   NFS配置文件的完整参数设定的文件(有很多没有配置,但是默认就有的NFS参数)

5. /var/lib/nfs/xtab   适合centos5,centos6没有该文件

6. /proc/mounts   客户端挂载参数

[root@backup-41 mnt]# grep mnt /proc/mounts
192.168.0.31:/data/ /mnt nfs4 rw,relatime,vers=4,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.0.41,minorversion=0,local_lock=none,addr=192.168.0.31 0 0

7. /var/lib/nfs/rmtab   客户端访问服务器exports的信息列表

5. NFS客户端挂载命令

5.1 NFS客户端挂载命令格式

  mount -f nfs 192.168.0.31:/data /mnt

# 挂载前首先检查有权限需要挂载的信息,是否能够挂载
showmount -e 192.168.0.31 # 执行挂载命令挂载
mount -t nfs 192.168.0.31:/data /mnt # 查看挂载后结果
df -h # 查看挂载后结果
mount # 和cat /proc/mounts类似

5.2 NFS客户端挂载排错思路

  • 确认NFS服务器端的设置和服务是否ok。

    • showmount -e 192.168.0.31
    • 在服务器端测试是否可以挂载成功
  • 确认NFS客户端的showmount是否ok
    • 如:ping server_ip
    • telnet server_ip 111

5.3 NFS客户端开机自启动挂载

方法1: 配置/etc/rc.local

[root@backup-41 mnt]# tail -3 /etc/rc.local
# rpcbind start and mount shared directory ip:/data
/etc/init.d/rpcbind start
/bin/mount -t nfs 192.168.0.31:/data /mnt

方法2: 将挂载命令放在/etc/fstab里

[root@web01 ~]# tail -1 /etc/fstab
192.168.0.31:/data /mnt nfs defaults 0 0

其实所谓配置方法,这里有一个误区,如下:

  • fstab会优先于网络被Linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。
  • 而且,即使是本地的文件系统,也要注意,fstab最后两列要设置0 0.否则有可能导致无法启动服务器的问题。
  • 因此,nfs网络文件系统最好不要放到fstab里实现开机挂载
  • 但是,如果是在开机自启动服务里设置并启动了netfs服务,放入fstab里也是可以开机挂载的。

6. 生产环境高级案例配置实战

6.1 指定固定的UID用户配置NFS共享的实例

指定固定的UID用户配置NFS共享在CentOS 5.5及以下生产环境中常用,在CentOS 6.x的场景中不是必须要用的。

在CentOS5.5系统中,NFS有个bug,就是没有UID为65534的nfsnobody的用户,导致需要手动指定固定用户,确保NFS服务端和所有的NFS客户端都能实现对共享目录的增删改查。

客户端和服务端建立统一的NFS用户:用户、UID和GID。

步骤1: 建立用户组zuma并指定GID 888,所有客户端也要用同样的命令建立。

[root@nfs-31 proc]# groupadd zuma -g 888

步骤2:建立用户zuma,指定UID为888,且用户组属于zuma,所有客户端同样。

useradd zuma -u 888 -g zuma
[root@web01-8 mnt]# id zuma
uid=888(zuma) gid=888(zuma) 组=888(zuma)

步骤3: 开始部署NFS Server

[root@nfs-31 /]# mkdir /oldboy -p
[root@nfs-31 /]# chown -R zuma.zuma /oldboy
[root@nfs-31 /]# ls -ld /oldboy
drwxr-xr-x 2 zuma zuma 4096 Dec 9 21:26 /oldboy # 编辑/etc/exports配置文件
[root@nfs-31 /]# echo "#new example">>/etc/exports
[root@nfs-31 /]# echo "/oldboy 192.168.0.0/24(rw,sync,all_squash,anonuid=888,anongid=888)">>/etc/exports
[root@nfs-31 /]# tail -2 /etc/exports
#new example
/oldboy 192.168.0.0/24(rw,sync,all_squash,anonuid=888,anongid=888) # 配置完成后,nfs服务平滑重启
[root@nfs-31 /]# /etc/init.d/nfs reload # 查看是否部署完成
[root@nfs-31 /]# showmount -e localhost
Export list for localhost:
/oldboy 192.168.0.0/24
/data 192.168.0.0/24

步骤4: 部署nfs客户端

[root@backup-41 mnt]# mkdir /video -p
[root@backup-41 mnt]# /etc/init.d/rpcbind status
rpcbind (pid 10434) is running...
[root@backup-41 mnt]# showmount -e 192.168.0.31
Export list for 192.168.0.31:
/oldboy 192.168.0.0/24
/data 192.168.0.0/24
[root@backup-41 mnt]# mount -t nfs 192.168.0.31:/oldboy /video
[root@backup-41 mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 6.9G 1.9G 4.7G 28% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 190M 67M 114M 37% /boot
192.168.0.31:/data 6.9G 1.9G 4.7G 28% /mnt
192.168.0.31:/oldboy 6.9G 1.9G 4.7G 28% /video

步骤5: 在客户端上进行测试

[root@backup-41 mnt]# cd /video
[root@backup-41 video]# ls
[root@backup-41 video]# touch test.txt
[root@backup-41 video]# ls -l
total 0
-rw-r--r-- 1 zuma zuma 0 Dec 9 21:39 test.txt # 用户和组都是zuma

完成。


【集群实战】NFS网络文件共享服务的更多相关文章

  1. Linux实战教学笔记22:企业级NFS网络文件共享服务

    目录 第二十二节 企业级NFS网络文件共享服务 第一章 NFS网络文件共享服务 1.1 NFS介绍 1.2 NFS系统原理介绍 1.3 NFS服务端部署环境准备 1.4 NFS server端的设置 ...

  2. (转)企业级NFS网络文件共享服务

    企业级NFS网络文件共享服务 原文:http://www.cnblogs.com/chensiqiqi/archive/2017/03/10/6530859.html --本教学笔记是本人学习和工作生 ...

  3. 企业级NFS网络文件共享服务_【all】

    1.1. 什么是NFS(1台机器提供服务) Network File System(网络文件系统)通过局域网让不同的主机系统之间共享文件或目录. NFS客户端可以通过挂载的方式将NFS服务器端共享的数 ...

  4. 搭建企业级NFS网络文件共享服务说明[一]

    1.1.0. 概述: 共享/NFS目录给整个192.168.25.0/24网段主机读写 man nfs 可以查看mount的信息 rpc端口111 nfs主端口2049 1.1.1. 搭建NFS环境 ...

  5. 【集群实战】NFS网络文件共享服务2-mount挂载(参数,优化)

    1. NFS客户端挂载深入 1.1 NFS客户端挂载参数说明 在NFS服务端,可以通过cat /var/lib/nfs/etab查看NFS服务器端配置参数的细节. 在NFS客户端,可以通过cat /p ...

  6. 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)

    1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...

  7. NFS网络文件共享服务

    NFS-网络文件系统,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件或目录. NFS在企业中得应用场景 在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频.图片.附件等静 ...

  8. 搭建企业级NFS网络文件共享服务

    NFS服务简介 NFS是Network  File System(网络文件系统).主要功能是通过网络让不同的服务器之间可以共享文件或者目录.NFS客户端一般是应用服务器(比如web,负载均衡等),可以 ...

  9. 搭建企业级NFS网络文件共享服务[二]

    1.1.8 NFS问题总结 1.问:使用showmount -e 127.0.0.1后报clnt_create: RPC: Program not registered错误 答:顺序不对,重启nfs服 ...

随机推荐

  1. API参数如何验证?别纠结,拿去用就是

    今天我们主要分享项目实战中,另一种常用的参数校验框架 Hibernate Validator,请准备好小板凳,我们的分享开始. 1. 是啥? 先抛一张图,锻炼一下你的观察力. 通过上图有没有发现,数据 ...

  2. 1012 The Best Rank (25 分)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  3. andlua,andlua发送http请求,并解析json数据

    andlua发送http请求,并解析json实例 import'cjson'import 'http'--导入cjson库url = 'https://www.baidu,com'--设置urlHtt ...

  4. java 第六周课后作业

    1.定义长度位5的整型数组,输入他们的值,用冒泡排序后输出. Scanner sc = new Scanner(System.in); int[] arr = new int[5]; for (int ...

  5. 计算机人推荐书目&网站(不断更新)

    计算机人推荐书目&网站(不断更新) 鉴于最近有很多同学问我学什么读什么书好,我把我自己的经历和愚见写下来,仅供参考.我只会写我亲自读过有感悟的书,而不会搬运一些我碰都没有碰过只闻大名的书.本人 ...

  6. K:leetcode 5381.查询带键的排列 这题简单,但我还能优化。精益求精,才是算法的乐趣所在!

    前言: 本题来自leetcode第184场周赛的第二小题.以前参加过周赛,觉得很有趣.苦于最近一段时间比较忙就没坚持参加了(实际上是借口来着....),由于昨晚思考一些事情,导致睡不着,所以起得有点早 ...

  7. Linux:启动http服务

    1.安装apache yum install httpd #根据提示,输入Y安装即可成功安装 systemctl start httpd.service #启动apache systemctl sto ...

  8. Mysql大数据量问题与解决

    今日格言:了解了为什么,问题就解决了一半. Mysql 单表适合的最大数据量是多少? 我们说 Mysql 单表适合存储的最大数据量,自然不是说能够存储的最大数据量,如果是说能够存储的最大量,那么,如果 ...

  9. java 字符串截取 - 最后带上mysql字符串截取比较

    Java中的substring()方法有两个方法的重载,一个带一个参数的,一个带两个参数的. 第一种写法: substring(n);//从索引是n的字符开始截取,条件(n>=0,n<字符 ...

  10. 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序

    优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...