搭建背景
项目已经上线了,最初架构没有文件服务器一说,因此静态资源都是放在了本地目录里
上线后又增加了一台服务器做了负载均衡, 这样的话用户在两台服务器之间上传下载文件是一定无法访问到的,有可能存储到A 也有可能存储到B ,有可能访问A有可能访问B ;
客户又不想再买文件服务器,那么只能做一个文件共享了; 通读下文后再进行配置
https://cloud.tencent.com/developer/article/1008142
https://zhuanlan.zhihu.com/p/81752517
服务器A 服务器B
环境说明:
服务端配置
1.关闭防火墙
2.关闭selinux
临时关闭
永久关闭
重启后配置生效
3.服务端安装NFS软件
4.编辑参数exports
表示允许172.27.34.0和172.27.9.0两个网段的服务器访问,若对所有ip地址都可以访问则可设置为*:
若要指定特定ip,配置如下:
典型参数说明
no_all_squash和root_squash为默认设置,前者表示客户端访问用户先与服务器端本机用户匹配,匹配失败后再映射为匿名用户或用户组,后者表示root用户也映射为匿名用户或用户组。
5.新建共享目录并修改权限
6.启动服务并设置为开机启动
7.加载并查看配置
加载配置
查看
客服端配置
1.安装nfs软件包
centos:
ubuntu:
2.新建挂载点
3.检查共享目录
5.开启自动挂载
centos和ubuntu配置相同
测试
遇到问题1:
配置过程中会涉及到的问题说明:
1.修改了/etc/exports,并不需要重启NFS服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可。
exportfs-a 全部挂载或卸载/etc/exports的设定
exportfs-r 重新挂载/etc/exports里面的设定,也同步更新/etc/exports和/var/lib/nfs/xtab里面的内容
exportfs-u 卸载某一目录
-v 参数表示可视化显示
常用exportfs -rv # 重新export一次
exportfs -au # 全部卸载
2. 可以给多个客户端不同的授权,如
/home192.168.2.11(rw,sync,no_root_squash,no_all_squash)
/home192.168.2.7(ro,sync)
服务端端执行exportfs -rv 即可生效。【注:客户端也需要重新挂载才能看到起作用】
3.文件系统无法卸载时候,用fuser-m -v /PATH/TO/FILES查看哪个用户在访问。
4.客户端在挂载的时候遇到的一个问题如下,可能是网络不太稳定,NFS默认是用UDP协议,换成TCP协议即可:
mount -tnfs 192.168.2.10:/home /files -oproto=tcp -o nolock
5.如果有客户端通过RPC连接在服务器上,那么主机想要关机是不可能的。因此如果确实需要关机,请先停止nfs-utils、rpcbind服务。
有时候我们需要umount某个挂载目录时会遇到如下问题:
通过这条命令查看:
-v 表示 verbose 模式。进程以 ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段
-m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。
如上所示,有两个进程占用了,将其kill掉,再重新取消挂载。
问题起因:
在配置好一台NFS服务器,建立好分享目录,刷新配置以后,在另一台客户机中使用showmount -e 出现报错:
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
问题原因:
服务端的防火墙上默认没有开启nfs服务相应的端口
解决办法:
1.简单粗暴地关闭防火墙
systemctl stop firewalld
如果开启了iptables的话,也是一样的,iptables的策略里也默认不会为nfs服务开启需要的端口
systemctl stop iptables
2.在防火墙上开启端口
在设置了防火墙的环境中使用NFS,需要在防火墙上打开如下端口:
1. portmap 端口 111 udp/tcp;
2. nfsd 端口 2049 udp/tcp;
3. mountd 端口 "xxx" udp/tcp
系统 RPC服务在 nfs服务启动时默认会为 mountd动态选取一个随机端口(32768--65535)来进行通讯,我们可以通过编辑/etc/services 文件为 mountd指定一个固定端口:
# vim /etc/services
在末尾添加
mountd 1011/udp
mountd 1011/tcp
wq退出保存该文件
# stopsrc -s rpc.mountd
# startsrc -s rpc.mountd
# exportfs -a
# rpcinfo -p Hostname
现在我们会发现 mountd已经和端口 1011绑定了。
另外,nfs中需要通讯的服务还有 rpc.lockd和 rpc.statd,其中对lockd我们可以用类似的方法来指定固定端口,
# vim /etc/services
添加
lockd 35000/ucp
lockd 35000/tdp
# stopsrc -s rpc.lockd
# startsrc -s rpc.lockd
# exportfs -a
nfs客户端mount文件系统
# rpcinfo -p Hostname
但 rpc.statd无法通过该方法来指定端口,它只能使用随机端口,如有必要,在防火墙上要根据下面命令的显示来开放随机端口:
# no -a |grep ephemeral
tcp_ephemeral_high = 65535
tcpp_ephemeral_low = 32768
udp_ephemeral_high = 65535
udp_ephemeral_low = 32768