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. BUUCTF-假如给我三天光明

    假如给我三天光明 打开压缩包可以看到一个海报,下方有盲文显示,通过对照表得知 盲文翻译为kmdonowg 通过盲文翻译得到的字符串解压压缩包得到一个音频文件 使用Audacity打开,看样子应该是摩斯 ...

  2. ACM-01背包问题-Python

    日后完善 二维数组实现 if __name__ == '__main__': # 背包空间 space = 10 # 默认第一个元素为 0, 仅仅是为了方便理解 weights = [0, 2, 2, ...

  3. 手把手教学~基于element封装tree树状下拉框

    在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用.在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍. 通过这篇文章,你可以了解学习到一个树 ...

  4. UiPath保存图片操作的介绍和使用

    一.保存图像 (Save Image)的介绍 可以将图像保存到磁盘的一种活动 二.保存图像 (Save Image)在UiPath中的使用 1. 打开设计器,在设计库中新建一个Sequence,为序列 ...

  5. 深入理解 volatile 关键字

    volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内存模型.如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解 Java 内 ...

  6. 高仿Android网易云音乐OkHttp+Retrofit+RxJava+Glide+MVC+MVVM

    简介 这是一个使用Java(以后还会推出Kotlin版本)语言,从0开发一个Android平台,接近企业级的项目(我的云音乐),包含了基础内容,高级内容,项目封装,项目重构等知识:主要是使用系统功能, ...

  7. NC16663 [NOIP2004]合并果子

    NC16663 [NOIP2004]合并果子 题目 题目描述 ​ 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. ​ 每一次合并,多多可 ...

  8. XML入门介绍

    目录 XML 简介 xml 语法 文档声明 (1)创建一个 xml 文件 (2)图书有 id 性 属性 一 表示唯一 标识,书名,有作者,价格的信息 xml 注释 元素(标签) 1)什么是 xml 元 ...

  9. CTO与CIO选型数据中台的几大建议

    企业数字化转型离不开企业数字化技术的配备.但企业在选择数字化技术时也面临着一个问题,就是如何在大胆采用先进的数字化技术和对技术进行投资之间找到平衡,将投资风险降到最低,毕竟错误的技术选型会给企业带来不 ...

  10. 快速入门python看过的一些资料

    我快速入门python看过的一些资料 B站的视频 10天自学Python,轻松掌握Python基础[千锋] 廖雪峰 - Python教程 https://www.liaoxuefeng.com/wik ...