东方飘雪

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

CentOS搭建NFS服务、windows挂载权限问题; NFS读写缓慢调优

CentOS搭建NFS服务、windows挂载权限问题

1.CentOS7安装NFS服务(固定端口并开启防火墙)

2.读写慢,调优

       3.文件名中文乱码


 

1. CentOS和统信UOS(与ubuntu一样)命令不一样,但操作大同小异,参考如下:

https://blog.csdn.net/wangzongyu/article/details/127009158

 截图如下:

如上图进行操作

(注意:windows挂载linux的NFS时必须添加计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default 新建AnonymousGigAnonymousUid (QWORD(64位值)),其值都设置为。并重启操心系统方可进行文件写操作,否则会报无权限操作)

centOS7的nfs服务端使用固定端口并启用防火墙开放

# 防火墙常用关闭、启动命令 ,详细请看 https://www.cnblogs.com/zdyang/p/17484160.html
systemctl stop firewalld    #关闭防火墙
systemctl disable firewalld #开机不自启防火墙

systemctl start firewalld  #启动防火墙
systemctl enable firewalld #开机自启防火墙
systemctl status firewalld #来检查防火墙状态,如果显示 "active (running)",则表示防火墙已经成功启动并正在运行中。

 

参考地址:https://blog.csdn.net/jxlhljh/article/details/121588980

nfs通信是使用udp或tcp协议进行的,上面的nfs环境是建立在nfs服务器防火墙关闭的情况下的搭建,即需要已经放通相关的端口,一般线上环境要求较高,会开启防火墙并授权一些策略来控制访问,
由于nfs默认除了用111(portmapper使用,客户端向服务器发出NFS文件存取功能的询问请求)和2049(nfs使用)端口是固定的,其他的几个端口是随机的,因此需要在nfs服务器上配置成固定的端口,再通过防火墙进行开放

1.修改配置文件 

vi /etc/sysconfig/nfs #在最后加上以下配置
RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004 
  1. 重启服务 rpcbind 和 nfs
systemctl restart rpcbind
systemctl restart nfs

3.重新查看端口情况

rpcinfo -p localhost,可看到端口已经使用固定的端口

(重启nfs后,如发现 有的端口不是设定的(eg:status端口不是设定的30004),reboot重启下操作系统再看就OK了)

 4.接下来进行相关的防火墙开放,授权在客户端机器172.20.1.79上能访问

#centOS7防火墙配置文件是/etc/firewalld/zones/public.xml
#在 CentOS7 系统中,默认使用的防火墙管理工具是 firewalld,而非传统的 iptables 命令行工具

#nfs之防火墙 172.20.1.79为客户机ip (防火墙为启动状态下面命令才会生效)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="tcp" port="111" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="udp" port="111" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="tcp" port="2049" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="udp" port="2049" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="tcp" port="30001-30004" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.20.1.79" port protocol="udp" port="30001-30004" accept"

#更新防火墙规则
firewall-cmd --reload
#查看所有已开放端口:
firewall-cmd --list-all

配置完成后执行 firewall-cmd --list-all 命令如下图:

 

2.windows读写linux搭建的NFS内文件是比较慢,调优

https://blog.csdn.net/yysalad/article/details/117366232

截图如下:

 

上面的执行OK,下面这部分我是AI查的,讲的很详细,但在客户端(windowsserver2016)执行时,报错,执行不了,权当了解下先:

挂载命令优化:

# 兼顾速度+稳定性的通用挂载命令(混合文件/局域网场景)
mount -o rw,codepage=utf8,rsize=1048576,wsize=1048576,hard,timeout=5,retry=2 \\NFS服务器IP(或共享名) 本地盘符:

eg:
mount -o rw,codepage=utf8,rsize=1048576,wsize=1048576,hard,timeout=5,retry=2 \\192.168.1.200\NFS X:

-o 是 **“选项(options)” 的缩写 **,作用是指定挂载时的额外配置参数(如权限、编码、传输规则等)

       无论是 Windows 的 NFS 客户端mount命令,还是 Linux 的mount命令,-o的核心用途都是传递多个挂载参数,参数之间用逗号分隔(无需空格)

参数含义 & 单位默认值通用作用(适配文件传输 / 同步场景)不同场景最优配置关键注意事项
rw 挂载权限模式,无单位 未指定时默认ro(只读) 定义 NFS 客户端挂载后的读写权限:                                             
 
rw:允许对共享目录执行读写 / 文件传输 / 同步操作;
 
- 默认ro仅能读取,无法写入 / 传输文件。
- 写入 / 传输 / 备份场景:rw(必选)
 
- 仅读取 / 查看场景:ro(更安全)
需服务端/etc/exports同步配置rw,否则客户端指定rw也会实际只读
codepage=utf8 文件名编码格式,无单位 gb2312(Windows 默认) 指定 NFS 客户端解析文件名的字符编码:
 
utf8:适配 Linux(UTF-8)/Windows 跨系统编码,避免文件名乱码、文件传输 / 比对时识别错误;
 
- 默认gb2312易导致非 GBK 编码文件名乱码。
- 含中文 / 非 ASCII 文件名:codepage=utf8(必选)
 
- 仅英文文件名:默认gb2312/utf8均可

需服务端系统locale为 UTF-8,否则编码仍可能不匹配

另外有的用lang参数替换codepage参数

rsize=1048576 读块大小,字节(B) 4096(4KB) 设置客户端从 NFS 服务端读取数据的单次块大小:
 
- 增大值可减少 IO 请求次数,提升文件传输效率;
 
- 默认 4KB 过小,大文件传输时 IO 频繁、速度慢。
- 大文件(>100MB):1048576(1MB)/2097152(2MB)
 
- 大量小文件(<1KB):65536(64KB)
 
- 混合文件:1048576(兼顾)
最大值不超 4MB(4194304),否则因网络 MTU 限制易分包重传,反而降低传输速度
wsize=1048576 写块大小,字节(B) 4096(4KB) 设置客户端向 NFS 服务端写入数据的单次块大小:
 
- 增大值可减少写请求次数,降低服务端 IO 压力,提升文件写入 / 传输速度;
 
- 默认 4KB 过小,大文件写入效率极低。
- 大文件(>100MB):1048576(1MB)/2097152(2MB)
 
- 大量小文件(<1KB):65536(64KB)
 
- 混合文件:1048576(兼顾)
需与rsize保持一致,避免读写块大小不匹配导致性能损耗;NFSv4 默认支持该配置
hard 挂载超时策略,无单位 soft(软挂载) 定义网络超时后的处理逻辑:
 
hard:超时后持续重试操作,保障文件传输 / 同步的稳定性;
 
- 默认soft超时直接失败,易导致传输中断。
- 稳定性优先(定时备份 / 大文件传输):hard(必选)
 
- 响应速度优先(临时读取):soft
如设置为hard,若服务端长时间离线,客户端对挂载盘的操作会卡住,需先执行net use 盘符: /delete卸载
timeout=10 单次操作超时时间,秒 3.2 设置单次 NFS 操作的超时等待时间:
 
- 增大值适配网络延迟,减少误判超时;
 
- 默认 3.2 秒过短,局域网轻微延迟就易触发超时失败。
- 局域网(延迟 < 10ms):5-10
 
- 跨网段 / 广域网(延迟 10-100ms):15-30
 
- 超稳定局域网:5
值过大(>60 秒)会导致无响应时等待过久,影响传输任务的失败感知速度
retry=3 超时后重试次数,次数 1 设置超时后的重试次数:
 
- 增加次数提升网络波动时的传输成功率;
 
- 默认 1 次重试概率低,偶发超时易导致传输失败。
- 局域网(低波动):2-3
 
- 跨网段 / 广域网(高波动):5-8
 
- 响应速度优先:1-2
总等待时间 = timeout×retry,避免总等待过久(如timeout=10+retry=8=80 秒)

 

3.文件名中文乱码

1) centOS对于中文文件名乱码

CentOS 中文文件名乱码的核心原因是 编码不一致。CentOS优先统一编码为 UTF-8(Linux 生态默认推荐,兼容性最强)

1.先通过命令确认 CentOS 当前的编码配置
locale  # 查看所有编码相关环境变量

2.编辑系统编码配置文件:
vi /etc/locale.conf  # CentOS 7+/8+/9+ 通用(永久生效)

3.写入以下内容(覆盖原有内容):
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8  # 强制所有子进程继承 UTF-8 编码

4.保存退出(:wq),然后生效配置(无需重启,临时生效)
source /etc/locale.conf

5.再次查看
locale

8d1b7f4f498b2039c1cd16685fecadfb

 2)centOS中文文件名正常,但共享到windows客户端后,在windows客户端查看文件名为中文乱码

     windows默认编码GBK,centOS为UTF-8 导致。不过这个没有解决呢还

posted on 2023-06-15 10:42  东方飘雪  阅读(944)  评论(0)    收藏  举报