NFS服务器搭建与配置
搭建背景
项目已经上线了,最初架构没有文件服务器一说,因此静态资源都是放在了本地目录里
上线后又增加了一台服务器做了负载均衡, 这样的话用户在两台服务器之间上传下载文件是一定无法访问到的,有可能存储到A 也有可能存储到B ,有可能访问A有可能访问B ;
客户又不想再买文件服务器,那么只能做一个文件共享了; 通读下文后再进行配置
https://cloud.tencent.com/developer/article/1008142
https://zhuanlan.zhihu.com/p/81752517
服务器A 服务器B
环境说明:
主机名 |
操作系统版本 |
IP地址 |
说明 |
---|---|---|---|
centos7 |
centos7 |
172.27.9.181 |
NFS服务器 |
web |
centos7 |
172.27.9.17 |
客户端 |
ubuntu |
Ubuntu 14.04.5 |
172.27.9.227 |
客户端 |
ubuntu02 |
Ubuntu 16.04.5 |
172.27.34.37 |
客户端 |
服务端配置
1.关闭防火墙
[root@centos7 ~]# systemctl stop firewalld.service
[root@centos7 ~]# systemctl disable firewalld.service
[root@centos7 ~]# firewall-cmd --state
not running
2.关闭selinux
临时关闭
[root@centos7 ~]# setenforce 0
永久关闭
[root@centos7 ~]# sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
重启后配置生效
[root@centos7 ~]# sestatus
SELinux status: disabled
3.服务端安装NFS软件
[root@centos7 /]# yum -y install nfs-utils
4.编辑参数exports
[root@centos7 /]# view /etc/exports
/backup 172.27.34.0/24(rw,sync,no_root_squash)
/backup 172.27.9.0/24(rw,sync,no_root_squash)
表示允许172.27.34.0和172.27.9.0两个网段的服务器访问,若对所有ip地址都可以访问则可设置为*:
/backup *(rw,sync,no_root_squash)
若要指定特定ip,配置如下:
/backup 172.27.9.17(rw,sync,no_root_squash) 172.27.9.227(rw,sync,no_root_squash) 172.27.34.37(rw,sync,no_root_squash)
典型参数说明
ro:共享目录只读
rw:共享目录可读可写
all_squash:所有访问用户都映射为匿名用户或用户组
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组
root_squash(默认):将来访的root用户映射为匿名用户或用户组
no_root_squash:来访的root用户保持root帐号权限
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器
insecure:允许客户端从大于1024的tcp/ip端口连接服务器
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
async:将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率
no_wdelay:若有写操作则立即执行,应与sync配合使用
subtree_check :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限
no_subtree_check(默认) :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率
no_all_squash和root_squash为默认设置,前者表示客户端访问用户先与服务器端本机用户匹配,匹配失败后再映射为匿名用户或用户组,后者表示root用户也映射为匿名用户或用户组。
5.新建共享目录并修改权限
[root@centos7 backup]# mkdir /backup
[root@centos7 backup]# chmod -R 777 /backup/
6.启动服务并设置为开机启动
[root@centos7 /]# systemctl enable rpcbind.service
[root@centos7 /]# systemctl enable nfs-server.service
[root@centos7 /]# systemctl start rpcbind.service
[root@centos7 /]# systemctl start nfs-server.service
7.加载并查看配置
加载配置
[root@centos7 ~]# exportfs -r
查看
[root@centos7 /]# exportfs
/backup 172.27.34.0/24
/backup 172.27.9.0/24
[root@centos7 /]# exportfs -v
/backup 172.27.34.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/backup 172.27.9.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
客服端配置
1.安装nfs软件包
centos:
[root@web /]# yum -y install nfs-utils
ubuntu:
root@ubuntu:/# apt-get install nfs-common -y
2.新建挂载点
[root@web /]# mkdir /nfs
3.检查共享目录
[root@web nfs]# showmount -e 172.27.9.181
Export list for 172.27.9.181:
/backup 172.27.9.0/24,172.27.34.0/24
4.挂载共享目录
[root@web nfs]# mount -t nfs 172.27.9.181:/backup /nfs
s
5.开启自动挂载
centos和ubuntu配置相同
[root@web ~]# view /etc/rc.local
mount -t nfs 172.27.9.181:/backup /nfs
[root@web ~]# chmod 755 /etc/rc.local
测试
查看、新建和删除文件
NFS服务器搭建完成,测试正常。
参考https://cloud.tencent.com/developer/article/1501332
遇到问题1:
#9.卸载nfs
#1.正常卸载
[root@backup-41 ~]# umount /data/w/
#2.强制卸载
[root@backup-41 ~]# umount -lf /data/w/
配置过程中会涉及到的问题说明:
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.nfs: /data: device is busy 问题
有时候我们需要umount某个挂载目录时会遇到如下问题:
1
2
|
[root@localhost /]# umount /data/ umount.nfs: /data: device is busy |
通过这条命令查看:
1
2
3
4
|
[root@localhost /]# fuser -m -v /data/ 用户 进程号 权限 命令 /data/: root 2798 ..c.. bash root 2996 ..c.. su |
-v 表示 verbose 模式。进程以 ps 的方式显示,包括 PID、USER、COMMAND、ACCESS 字段
-m 表示指定文件所在的文件系统或者块设备(处于 mount 状态)。所有访问该文件系统的进程都被列出。
如上所示,有两个进程占用了,将其kill掉,再重新取消挂载。
1
2
3
4
|
[root@localhost /]# kill -9 2798 [root@localhost /]# kill -9 2996 [root@localhost /]# umount /data/ [root@localhost /]# |
解决clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) 问题的过程...
https://blog.csdn.net/weixin_30270889/article/details/97045168
问题起因:
在配置好一台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
当然也可以不开放 rpc.statd需要的随机端口,带来的影响就是如果 nfs连接中断(比如server或client宕掉了),系统将无法通过statd来恢复连接中断前的状态,而必须重新 mount该nfs文件系统。