NFS生产环境部署调优
1、NFS简介
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
NFS主要分为服务端和客户端,服务端需要配置rpcbind和NFS服务并启动,客户端只需启动rpcbind服务无需部署NFS客户端,rpcbind系统默认都是启动的。
2、NFS服务端部署
2.1 检查rpcbind
[root@100 ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
如果没有就需要安装一下
[root@100 ~]# 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 Wed 2021-07-28 10:41:38 CST; 1 day 4h ago
  Process: 3488 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 3508 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─3508 /sbin/rpcbind -w
Jul 28 10:41:37 100 systemd[1]: Starting RPC bind service...
Jul 28 10:41:38 100 systemd[1]: Started RPC bind service.
2.2 检查nfs服务
默认已安装
[root@100 ~]# rpm -qa|grep nfs
nfs-utils-1.3.0-0.68.el7.x86_64
libnfsidmap-0.25-19.el7.x86_64
2.3 创建共享目录
[root@100 ~]# mkdir /share
2.4 配置exports
[root@100 ~]# vim /etc/exports
/share 10.4.7.*(rw,sync,no_root_squash)
使配置生效
[root@100 ~]# exportfs -r
注释:
/share:表示共享的目录
10.4.7.*:表示允许访问NFS服务的客户端地址网段
(rw,sync,no_root_squash):客户端权限
权限说明:
rw:read-write,可读写,注意仅仅这里设置成读写客户端还不能正常读写,还要正确的配置共享目录的权限才可以;
ro:read-only,只读权限;
sync:文件通知写入硬盘和内存;
Async:文件暂时存于内存,不直接写入内存;
no_root_squash:NFS客户端使用root连接时,对于共享目录也具有root权限(不安全);
root_squash:NFS客户端使用root用户连接时,对于共享目录具有匿名用户的权限;
all_squash:不论客户端使用什么身份连接,对共享目录都只拥有匿名用户的权限;
anonuid:匿名用户的UID值,这个UID的值必须真实存在于/etc/passwd中一般与all_squash一起使用;
anongid:匿名用户的GID值
2.5 启动nfs并加入开机自启
[root@100 ~]# systemctl start nfs
[root@100 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@100 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2021-07-29 16:18:25 CST; 51s ago
  Process: 6926 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 6909 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 6907 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 6909 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service
Jul 29 16:18:25 100 systemd[1]: Starting NFS server and services...
Jul 29 16:18:25 100 systemd[1]: Started NFS server and services.
2.6 修改主机名映射
[root@100 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.4.7.100 nfs_server
[root@100 ~]# hostnamectl set-hostname nfs_server
注意,nfs会根据主机名进行鉴别,如果未设置主机名映射可能会出现如下报错
[root@100 ~]# showmount -e
clnt_create: RPC: Port mapper failure - Unable to send: errno 22 (Invalid argument)
2.7 自检服务
查看共享目录和允许被访问的客户端
[root@100 ~]# showmount -e
Export list for nfs_server:
/share 10.4.7.*
查看哪些客户端挂载了
[root@100 ~]# showmount -a
All mount points on nfs_server:
3、客户端连接
3.1 查看客户端rpcbind服务
[root@101 ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-49.el7.x86_64
[root@101 ~]#
[root@101 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-07-29 13:53:07 CST; 2h 38min ago
  Process: 850 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 860 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─860 /sbin/rpcbind -w
Jul 29 13:53:06 101 systemd[1]: Starting RPC bind service...
Jul 29 13:53:07 101 systemd[1]: Started RPC bind service.
3.2 查看连接NFS服务端的权限
[root@101 ~]# showmount -e 10.4.7.100
Export list for 10.4.7.100:
/share 10.4.7.*
3.3 创建挂载目录
[root@101 ~]# mkdir /client
3.4 测试连接及挂载方式
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
[root@101 ~]# cd /client/
[root@101 client]# mkdir test1
查看信息
[root@101 /]# mount|grep nfs
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
10.4.7.100:/share on /client type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.4.7.101,local_lock=none,addr=10.4.7.100)
只有nfs3版本才可以使用-a查看正在挂载的挂载点
使用nfsstat可以查看系统可以使用的nfs的版本及详情
[root@100 ~]# nfsstat
[root@101 ~]# umount /client
[root@101 ~]# mount -t nfs  -o nfsvers=3  10.4.7.100:/share /client
[root@101 ~]# mount|grep nfs
10.4.7.100:/share on /client type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.4.7.100,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=10.4.7.100)
[root@101 ~]# showmount -a 10.4.7.100
All mount points on 10.4.7.100:
10.4.7.101:/share
测试读写情况
[root@101 ~]# cd /client/
[root@101 client]# mkdir test1
[root@101 client]# echo 222 > test1/2
[root@101 client]# ls
test  test1
[root@101 client]# cat test/a
test
测试没问题,退出
[root@101 ~]# umount /client
4、生产优化
4.1 nfs端口优化
NFS端口的分配有下面三种:
- TCP/UDP 111 – RPC 4.0 portmapper;
 - TCP/UDP 2049 – NFSD (nfs server);
 - Mount端口—系统 RPC服务在 nfs服务启动时默认会为 mountd动态选取一个随机端口(32768--65535)来进行通讯,我们可以在/etc/sysconfig/nfs文件中定义端口。
生产环境中由于不同网段之前都会被网络个隔开,所以我们主机之间调用服务时都需要开通特定端口的网络策略,但是nfs连接使用的都是随机端口,无法开通策略。所以统一网段可以进行mount挂载,但是不同网段可能会出现如下报错: 
rpc mount export: RPC: Timed out
最大的可能就是网络不通,所以我们需要固定nfs的连接端口
编辑配置文件,固定端口
vim /etc/sysconfig/nfs
RQUOTAD_PORT=6005
LOCKD_TCPPORT=6004
LOCKD_UDPPORT=6004
MOUNTD_PORT=6002
STATD_PORT=6003
STATD_OUTGOING_PORT=6006
重启nfs服务
[root@100 ~]# systemctl restart nfs
开通对应的网络策略(客户端到服务端的111/2049/6002-6006以及111/2049的UDP端口)后测试mount挂载
4.2 优化权限
生产环境中使用root用户连接是不安全的,所以我们需要配置只允许特定的用户和用户组进行访问
nfs服务端配置优化
[root@100 ~]# vim /etc/exports
/share 10.4.7.*(rw,sync,all_squash,anonuid=1010,anongid=1010)
注释:
- all_squash:表示所有客户端登录后都会被映射为匿名用户;
 - anonuid=1010:表示匿名用户的uid=1010;
 - anongid=1010:表示匿名用户的gid=1010。
只需要重新生效一下,不需要重启nfs服务 
[root@100 ~]# exportfs -r
客户端挂载后测试
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
[root@101 ~]# cd /client/
[root@101 client]# ls
test  test1
[root@101 client]# mkdir 2
mkdir: cannot create directory ‘2’: Permission denied
权限分析:
已知目前服务端与客户端都有wyg这个用户,且uid=1000,gid=1000
[root@100 ~]# id wyg
uid=1000(wyg) gid=1000(wyg) groups=1000(wyg)
之所以Permission denied是因为共享文件的目录权限是wyg的为uid=1000,gid=1000
[root@100 /]# ll|grep share
drwxr-xr-x    4 wyg  wyg    31 Aug  2 11:28 share
需要修改服务端的wyg用户为1010
[root@100 ~]# usermod -u 1010 wyg
[root@100 share]# groupmod -g 1010 wyg
[root@100 share]# id wyg
uid=1010(wyg) gid=1010(wyg) groups=1010(wyg)
[root@100 /]# chown -R wyg:wyg /share/
客户端重新挂载
[root@101 ~]# umount /client
[root@101 ~]# mount -t nfs 10.4.7.100:/share /client
先用root测试
[root@101 client]# mkdir 1
[root@101 client]# ll
total 0
drwxr-xr-x 2 1010 1010  6 Aug  2 17:13 1
drwxr-xr-x 2 1010 1010  6 Aug  2 17:03 test
drwxr-xr-x 2 1010 1010 15 Aug  2 11:27 test1
再用wyg测试
[root@101 client]# su - wyg
Last login: Mon Aug  2 17:03:01 CST 2021 on pts/0
[wyg@101 ~]$
[wyg@101 ~]$ cd /client/
[wyg@101 client]$ ls
1  test  test1
[wyg@101 client]$
[wyg@101 client]$ mkdir 2
[wyg@101 client]$ ll
total 0
drwxr-xr-x 2 1010 1010  6 Aug  2 17:13 1
drwxrwxr-x 2 1010 1010  6 Aug  2 17:15 2
drwxr-xr-x 2 1010 1010  6 Aug  2 17:03 test
drwxr-xr-x 2 1010 1010 15 Aug  2 11:27 test1
发现他们创建的文件夹的属性都是uid=1010,gid=1010
生产上本地服务一般都用普通用户启动,为防止本服务调用共享目录数据时无权限,所以客户端的wyg普通用户也应该和服务端的wyg属性保持一致
修改客户端wyg的属性
[root@101 client]# usermod -u 1010 wyg
[root@101 client]# groupmod -g 1010 wyg
[root@101 client]# ll /client/
total 0
drwxr-xr-x 2 wyg wyg  6 Aug  2 17:13 1
drwxrwxr-x 2 wyg wyg  6 Aug  2 17:15 2
drwxr-xr-x 2 wyg wyg  6 Aug  2 17:03 test
drwxr-xr-x 2 wyg wyg 15 Aug  2 11:27 test1
总结:
nfs挂载后用的都是/etc/exports中设置的gid和uid,所以共享目录的gid和uid属性必须和/etc/exports中设置的一样,不然会有权限问题;
服务端和客户端不一定要有对应的gid和uid用户,但是为方便管理,服务端和客户端都有同样的用户,并且用户的uid和gid相同,/etc/exports配置成普通用户的权限
4.3 加入开机自动挂载
[root@101 ~]# vim /etc/fstab
10.4.7.100:/share       /client                 nfs     defaults,_rnetdev        0 0
注释:
- ,_rnetdev表示主机无法挂载直接跳过,避免无法挂载造成主机无法启动;
 - 第一个0表示不备份文件系统;
 - 第二个0表示不检测磁盘。
 
5、参考文档
NFS服务的端口分配 - 追忆丶年华 - 博客园
https://www.cnblogs.com/xiaoleiel/p/8340406.html
NFS各个版本之间的比较_ycnian-CSDN博客_nfsv3和nfsv4的区别
https://blog.csdn.net/ycnian/article/details/8515517
nfs不同版本的挂载与解析 - Linux运维 - 运维网 - iyunv.com
https://www.iyunv.com/thread-404799-1-1.html
NFS生产环境部署调优的更多相关文章
- 《Java架构师的最佳实践》生产环境JVM调优之空间担保失败引起的FullGC
		
1 问题现象 应用prod-xxx-k8s,在内存足够的情况下,仍然会产生偶发FullGC的问题. JVM配置如下: -Xmx8192m -Dhsf.server.max.poolsize=2500 ...
 - 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置
		
第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本 uwsgi- ...
 - 生产服务GC调优实践基本流程总结
		
Photo by Pixabay from Pexels 本文作者:夜色微光 - 博客园 (cnblogs.com) 前言 对Java虚拟机进行性能调优是一个非常宽泛的话题,在实践上也是非常棘手的过程 ...
 - Django + Uwsgi + Nginx 的生产环境部署
		
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
 - Centos7 HyperLedger Fabric 1.4 生产环境部署
		
Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...
 - 深度学习Tensorflow生产环境部署(上·环境准备篇)
		
最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...
 - Spring Boot (二)集成Jsp与生产环境部署
		
一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...
 - Vue生产环境部署
		
前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...
 - 【原创】大数据基础之Airflow(2)生产环境部署airflow研究
		
一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在sch ...
 
随机推荐
- JavaScript有哪些数据类型,它们的区别?
			
基本数据类型:number.string.boolean.Undefined.NaN(特殊值).BigInt.Symbol 引入数据类型:Object NaN是JS中的特殊值,表示非数字,NaN不是数 ...
 - SAP Using Text Modules in Adobe Forms
			
In this demo we will create an adobe form which displays text in two different languages (English or ...
 - UiPath文本操作Set Text的介绍和使用
			
一.Set Text的介绍 向输入框/文本框写入文本的一种操作 二.Set Text在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路 ...
 - VisionPro · C# · 图像保存
			
根据客户要求,每次视觉取像运行完毕后,按需保存OK或NG图像,图像分两种: 1.带视觉工具运行结果图像: 2.相机取像原图,.bmp格式. 保存图像代码如下: using System; using ...
 - mysql中innodb和myisam区别
			
前言 InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了. 1.事务和外键 ● InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修 ...
 - python删除Android应用及文件夹,就说牛不牛吧
			
写在前面的一些P话: 碌者劳其心力,懒人使用工具.程序员作为懒人推动社会进步,有目共睹. adb 已提供了开发者可以使用的全部工具,但是重复执行一系列adb命令也令人心烦,所以,如果业务需求固定,直接 ...
 - [APIO2008]DNA 题解
			
题目链接 首先呢,看到 A C G T 对应不同的权值,第一步就是把字母转换成数字. 我们分别对 A->1 C->2 G->3 T->4 进行标号,之后方便 \(\text{d ...
 - 强化学习-学习笔记8 | Q-learning
			
上一篇笔记认识了Sarsa,可以用来训练动作价值函数\(Q_\pi\):本篇来学习Q-Learning,这是另一种 TD 算法,用来学习 最优动作价值函数 Q-star,这就是之前价值学习中用来训练 ...
 - 现代化CSS
			
Less Sass less Sass 与Less相比SASS更适合大型,底层的开发 Compass CSS核心技巧 CSS应用 现代化CSS方法论 CSS分层与面向对象 为什么要对CSS分层 CSS ...
 - File类获取功能的方法和File类判断功能的方法
			
File类获取功能的方法-public String getAbsolutePath() :返回此file的绝对路径名字符串 -public String getPath() :将此File转换为路径 ...