NFS网络文件共享服务
一、什么是NFS
(一)概念
NFS是Network File System的缩写,它的主要功能是通过网络让不同的主机系统之间可以彼此共享文件或者目录。NFS客户端(一般为引用服务器,如web应用服务器)可以通过挂载的方式将NFS服务端共享的数据文件目录挂载到NFS客户端的本地系统中的一个挂载点下。
在企业集群的应用场景下,NFS网络文件系统被用来存储共享视频、图片等静态资源文件。
假如A用户请求服务,nginx分发这个请求到web1服务器上,然后将用户A上传的静态资源到web1服务器上;这时如果静态不同步到NFS上;一旦用户B的请求被分发到web2服务器上,这时web2也从NFS上获取静态资源就不会出现静态资源获取不到的情况。可以看到web服务器都是一个NFS Client本地挂载的目录可以和NFS Server的目录不一定相同。
(二)挂载的原理
从上图中可以看出NFS Server设置一个共享目录/data ,其余有权限的NFS Client可以将NFS Server的共享目录挂载到本地的目录中,比如上图中web1将/project/data目录与NFS Server的共享目录进行对应。当客户端挂载完毕后,这时进入到/project/data目录下,这时文件与NFS Server共享目录下的文件一样。
NFS 支持的功能很多,每一个功能启动不同的程序,这样会产生很多的随机端口,但是既然是随机启动的端口,那么客户端怎么会知道这些端口呢?这样就会造成NFS客户端与NFS服务端无法进行数据传输,如果要解决上面的问题,就需要RPC服务来实现这个过程的,RPC就相当于中间人一样。
NFS的RPC服务的功能就是记录NFS每一个功能启动的端口号,在NFS客户端请求时将该端口号和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可连接到正确的NFS端口号上去,达到数据传输的目的。
那么RPC服务是如何记录NFS服务的每一个功能端口以及知道每一个NFS功能端口呢?这时因为当NFS服务启动后会将随机启动的端口主动向RPC服务注册相关的端口及功能信息,所以RPC服务知道NFS每一个端口对应的NFS功能,并且RPC服务使用固定的111端口来监听NFS Client的请求,这样就将正确的NFS端口信息返回给NFS Client。
上图是NFS Client向NFS Server存取文件的过程,详细过程如下:
(1)用户访问NFS Client,NFS Client的RPC服务向NFS Server的RPC的111端口发出请求
(2)NFS Server的RPC服务找到已经注册的NFS Server的端口后,通知NFS Client的RPC服务
(3)NFS Client获取正确的端口,与NFS Server交互存取数据
(4)NFS Client数据存取成功后,返回访问前端应用程序用户结果
注意:
- NFS Server在启动之前应该先启动RPC服务,否则NFS Server无法向RPC注册端口
- 入股RPC服务重新启动,之前注册的NFS Server端口信息就会丢失,因此NFS Server也需要重新启动
- NFS重新启动通过/etc/init.d/nfs reload进行平滑启动
- RPC服务在centos5.8为portmap服务,centos6.4下为rpcbind服务
二、NFS服务搭建
(一)环境准备
服务器系统 | 角色 | ip |
CentOS 7.3 x84_64 | NFS服务端 | 192.168.35.9 |
CentOS 7.3 x84_64 | NFS客户端 | 192.168.35.10 |
服务器信息查看:
# 操作系统版本信息 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) # 机器名称 [root@localhost ~]# uname -n localhost.localdomain # 系统内核版本 [root@localhost ~]# uname -r 3.10.0-514.el7.x86_64 # 64位 [root@localhost ~]# uname -m x86_64
服务器设置主机名:
# 设置NFS Server的主机名 [root@localhost ~]# hostnamectl set-hostname nfs-server [root@localhost ~]# hostname nfs-server #设置NFS Client的主机名 [root@localhost ~]# hostnamectl set-hostname nfs-client [root@localhost ~]# hostname nfs-client
注意关闭服务端与客户端的防火墙:
systemctl stop firewalld # 临时关闭 systemctl disable firewalld # 永久关闭
(二)NFS软件安装
部署NFS服务需要安装下面的软件包:
- nfs-utils
- portmap(centos5.x)/rpcbind(centos6.x)
其中nfs-utils是NFS服务的主程序,包括rpc.nfsd、rpc.mounted等;启动NFS服务前必须先启动rpcbind服务。
1、NFS Server安装
# 先查看机器上是否存在NFS和RPC安装包 [root@nfs-server ~]# rpm -qa nfs-utils portmap rpcbind # 如果没安装通过yum进行安装 [root@nfs-server ~]# yum install nfs-utils rpcbind -y
2、NFS Client安装
# 先查看机器上是否存在NFS和RPC安装包 [root@nfs-client ~]# rpm -qa portmap rpcbind [root@nfs-client ~]# yum install nfs-utils rpcbind -y
注意安装上面的服务还有一种方式:
# 查看可安装的组 [root@nfs-server ~]# yum grouplist # 安装NFS和RPC服务 [root@nfs-server ~]# yum groupinstall "NFS file server" -y
注意两种方式只需要选择一种即可。
(三)启动NFS服务
1、启动rpcbind服务
# 查看rpcbind服务状态 [root@nfs-server ~]# service rpcbind status
目前已经正常启动。
2、查看NFS服务端口注册信息
[root@nfs-server ~]# 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
因为NFS服务还没有启动,所以都是rpc服务的端口信息。
3、启动NFS服务
# 查看状态 [root@nfs-server ~]# service nfs status # 启动nfs [root@nfs-server ~]# service nfs start
4、查看端口注册信息
[root@nfs-server ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper ... 100024 1 udp 57594 status 100024 1 tcp 50545 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 43092 nlockmgr 100021 3 udp 43092 nlockmgr 100021 4 udp 43092 nlockmgr 100021 1 tcp 34213 nlockmgr 100021 3 tcp 34213 nlockmgr 100021 4 tcp 34213 nlockmgr
(四)启动NFS客户端
启动nfs与rpc服务:
# 查看状态 [root@nfs-server ~]# service nfs status # 启动nfs [root@nfs-server ~]# service nfs start
[root@nfs-client ~]# service rpcbind status Redirecting to /bin/systemctl status rpcbind.service ● rpcbind.service - RPC bind service Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled) Active: active (running) since 一 2021-04-26 05:52:10 CST; 39min ago Process: 2713 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS) Main PID: 2714 (rpcbind) CGroup: /system.slice/rpcbind.service └─2714 /sbin/rpcbind -w 4月 26 05:52:10 nfs-client systemd[1]: Starting RPC bind service... 4月 26 05:52:10 nfs-client systemd[1]: Started RPC bind service.
(五)NFS服务端配置
NFS服务端的配置文件是/etc/exports,可以在该文件中进行配置参数,比如,连接的客户端限制等。
[root@nfs-server /]# cat /etc/exports # shared directory /data 192.168.35.0/24(rw,sync)
其中括号后面的rw是客户端的权限,允许对共享目录中进行读写,sync同步到本地磁盘中。
重新加载NFS服务:
[root@nfs-server /]# service nfs reload Redirecting to /bin/systemctl reload nfs.service
查看配置生效挂载情况:
[root@nfs-server /]# showmount -e localhost Export list for localhost: /data 192.168.35.0/24
通过客户端查看共享目录:
[root@nfs-client /]# showmount -e 192.168.35.9 Export list for 192.168.35.9: /data 192.168.35.0/24
将共享目录挂载到客户端上:
# 挂载前 [root@nfs-client /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 47G 1.7G 46G 4% / devtmpfs 902M 0 902M 0% /dev tmpfs 912M 0 912M 0% /dev/shm tmpfs 912M 8.5M 904M 1% /run tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 183M 0 183M 0% /run/user/0 # 进行挂载,将共享目录映射到本地目录/data [root@nfs-client /]# mount -t nfs 192.168.35.9:/data /data # 挂载后 [root@nfs-client /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/cl-root 47G 1.7G 46G 4% / devtmpfs 902M 0 902M 0% /dev tmpfs 912M 0 912M 0% /dev/shm tmpfs 912M 8.5M 904M 1% /run tmpfs 912M 0 912M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 183M 0 183M 0% /run/user/0 192.168.35.9:/data 47G 1.7G 46G 4% /data
三、测试
1、nfs服务器文件更改
# nfs服务器上创建文件 [root@nfs-server data]# touch test.txt [root@nfs-server data]# ll 总用量 0 -rw-r--r--. 1 root root 0 4月 27 04:43 test.txt # nfs客户端查看 [root@nfs-client data]# ll 总用量 0 -rw-r--r--. 1 root root 0 4月 27 04:43 test.txt # nfs服务器上删除文件 [root@nfs-server data]# rm -f test.txt # nfs客户端查看 [root@nfs-client data]# ll 总用量 0
2、nfs客户端文件更改
[root@nfs-client data]# touch test.txt touch: cannot touch 'test.txt': Permission denied
可以看到出现权限不足的情况。在上面的/data目录中的文件对其他用户无写的权限。
这里可以设置nfs的默认用户属组,所以只要找到nfs的默认用户设置属组即可。
# 查看用户uid [root@nfs-server data]# cat /var/lib/nfs/etab /data 192.168.35.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默认用户 [root@nfs-server /]# grep 65534 /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin # 更改目录属组、用户 [root@nfs-server /]# chown -R nfsnobody:nfsnobody /data [root@nfs-server /]# ll /data/ 总用量 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 4月 27 04:57 test.txt
客户端默认以nfsnobody用户写文件,现在文件属组和用户更改过来,客户端就有权利进行写入。
[root@nfs-client data]# touch test.txt [root@nfs-client data]# ll total 0 -rw-r--r--. 1 nfsnobody nfsnobody 0 Apr 27 05:05 test.txt
3、设置开机自启动与挂载
# nfs服务端 [root@nfs-server /]# systemctl enable rpcbind [root@nfs-server /]# systemctl enable nfs # nfs客户端启动 [root@nfs-client data]# systemctl enable rpcbind [root@nfs-client data]# systemctl enable nfs # nfs客户端执行挂载 [root@nfs-client data]# echo "mount -t nfs 192.168.35.9:/data /data" >> /etc/rc.local