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生产环境部署调优的更多相关文章

  1. 《Java架构师的最佳实践》生产环境JVM调优之空间担保失败引起的FullGC

    1  问题现象 应用prod-xxx-k8s,在内存足够的情况下,仍然会产生偶发FullGC的问题. JVM配置如下: -Xmx8192m -Dhsf.server.max.poolsize=2500 ...

  2. 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置

    第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本  uwsgi- ...

  3. 生产服务GC调优实践基本流程总结

    Photo by Pixabay from Pexels 本文作者:夜色微光 - 博客园 (cnblogs.com) 前言 对Java虚拟机进行性能调优是一个非常宽泛的话题,在实践上也是非常棘手的过程 ...

  4. Django + Uwsgi + Nginx 的生产环境部署

    使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...

  5. Centos7 HyperLedger Fabric 1.4 生产环境部署

    Kafka生产环境部署案例采用三个排序(orderer)服务.四个kafka.三个zookeeper和四个节点(peer)组成,共准备八台服务器,每台服务器对应的服务如下所示: kafka案例网络拓扑 ...

  6. 深度学习Tensorflow生产环境部署(上·环境准备篇)

    最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑.特意总结一下,当做前车之鉴. 1 系统背景 系统是ubuntu16.04 ubuntu@ub ...

  7. Spring Boot (二)集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  8. Vue生产环境部署

    前面的话 开发时,Vue 会提供很多警告来帮助解决常见的错误与陷阱.生产时,这些警告语句却没有用,反而会增加载荷量.再次,有些警告检查有小的运行时开销,生产环境模式下是可以避免的.本文将详细介绍Vue ...

  9. 【原创】大数据基础之Airflow(2)生产环境部署airflow研究

    一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在sch ...

随机推荐

  1. JavaScript有哪些数据类型,它们的区别?

    基本数据类型:number.string.boolean.Undefined.NaN(特殊值).BigInt.Symbol 引入数据类型:Object NaN是JS中的特殊值,表示非数字,NaN不是数 ...

  2. 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 ...

  3. UiPath文本操作Set Text的介绍和使用

    一.Set Text的介绍 向输入框/文本框写入文本的一种操作 二.Set Text在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列命名及设置Sequence存放的路 ...

  4. VisionPro · C# · 图像保存

    根据客户要求,每次视觉取像运行完毕后,按需保存OK或NG图像,图像分两种: 1.带视觉工具运行结果图像: 2.相机取像原图,.bmp格式. 保存图像代码如下: using System; using ...

  5. mysql中innodb和myisam区别

    前言 InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了. 1.事务和外键 ● InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修 ...

  6. python删除Android应用及文件夹,就说牛不牛吧

    写在前面的一些P话: 碌者劳其心力,懒人使用工具.程序员作为懒人推动社会进步,有目共睹. adb 已提供了开发者可以使用的全部工具,但是重复执行一系列adb命令也令人心烦,所以,如果业务需求固定,直接 ...

  7. [APIO2008]DNA 题解

    题目链接 首先呢,看到 A C G T 对应不同的权值,第一步就是把字母转换成数字. 我们分别对 A->1 C->2 G->3 T->4 进行标号,之后方便 \(\text{d ...

  8. 强化学习-学习笔记8 | Q-learning

    上一篇笔记认识了Sarsa,可以用来训练动作价值函数\(Q_\pi\):本篇来学习Q-Learning,这是另一种 TD 算法,用来学习 最优动作价值函数 Q-star,这就是之前价值学习中用来训练 ...

  9. 现代化CSS

    Less Sass less Sass 与Less相比SASS更适合大型,底层的开发 Compass CSS核心技巧 CSS应用 现代化CSS方法论 CSS分层与面向对象 为什么要对CSS分层 CSS ...

  10. File类获取功能的方法和File类判断功能的方法

    File类获取功能的方法-public String getAbsolutePath() :返回此file的绝对路径名字符串 -public String getPath() :将此File转换为路径 ...