NFS网络文件系统
安装NFS服务端
系统版本声明: RHEL8
参考链接: 博哥爱运维
NFS缺点: 自身不支持高可用,单节点部署生产环境风险高.
RHEL安装NFS服务端
# rhel安装NFS服务端
yum -y install nfs-utils rpcbind
# 按需安装autofs
yum install -y autofs
# 启动并开机自启nfs-server和rpcbind服务
## rhel8依赖的服务
systemctl enable --now nfs-server rpcbind nfs-utils
## Centos7依赖的服务
systemctl enable --now rpcbind nfs
systemctl enable --now autofs
Debian安装NFS服务端
# Debian系列安装NFS服务器端
apt install nfs-kernel-server -y
配置防火墙放行策略
portmapper端口:111 udp/tcpnfs/nfs_acl端口:2049 udp/tcp;4001——4004
服务端权限详解
NFS服务端的/etc/exports中,配置参数如下:
| 参数 | 解释 |
|---|---|
| ro | 以只读方式共享(默认策略) |
| rw | 以读写方式共享 |
| root_squash | 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户 |
| no_root_squash | 客户端使用root用户连接NFS时,依然映射为root用户(相当于在服务器上用root身份访问该目录) |
| all_squash | 客户机上的所有用户访问该共享目录时都映射成匿名用户(nfsnobody) |
| no_all_squash | 客户机上的所有用户访问共享文件的均保留原UID和原GID(默认策略) |
| anonuid | 将客户机上的用户映射成NFS服务器上指定的用户UID(UID=xxx) |
| anongid | 将客户机上的用户GID映射成NFS服务器上指定的用户GID(GID=xxx) |
| sync | 数据实时落盘,同步写入到内存与硬盘中,效率低,但可以保证数据一致性 |
| async | 资料会先暂存于内存中,数据延迟落盘,async相比sync性能高 |
| subtree_check | 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) 写操作之前, 检查客户端访问的目录是否是共享目录的子目录。 |
| no_subtree_check | 写操作之前,不检查客户端访问的目录是否是共享目录的子目录。 |
| wdelay | 指定等待写入数据的时间,检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置) |
| no_wdelay | 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。若有写操作则立即写入,应与sync配合使用 |
| hide | 隐藏共享目录中的指定文件或目录; 在NFS共享目录中不共享其子目录 |
| no_hide | 不隐藏共享目录中的指定文件或目录(默认设置) |
| secure | 允许NFS客户端通过安全的TCP端口2049(默认)连接NFS服务器;如需使用其他端口或协议,可以通过修改 /etc/nfs.conf 配置文件来指定。 |
| insecure | 允许NFS客户端通过不安全的UDP端口2049(默认)连接NFS服务器;如需使用其他端口或协议,可以通过修改 /etc/nfs.conf 配置文件来指定。 |

NFS使用的端口
参考: https://blog.51cto.com/u_15127582/3383593
# 查看NFS启动后的端口
rpcinfo -p localhost
## 验证服务是否正在运行
rpcinfo -p $nfs_server
NFS 使用是:2049
RPC 端口:111
RPC client :随机端口
- 1)
portmapper(RPC)端口:111 udp/tcp; - 2)
nfs/nfs_acl端口:2049 udp/tcp; - 3)
mountd端口:32768--65535 udp/tcp - 4)
nlockmgr端口:32768--65535 udp/tcp
系统RPC服务在nfs服务启动时默认会给mountd和nlockmgr动态选取一个随机端口来进行通讯。
设置NFS固定端口
vim /etc/sysconfig/nfs 在最后添加
# RPC配额守护程序的TCP端口号
RQUOTAD_PORT=4001
# NFS文件锁定程序的TCP和UDP端口号
LOCKD_TCPPORT=4002
LOCKD_UDPPORT=4002
# NFS挂载守护程序的端口号
MOUNTD_PORT=4003
# NFS状态守护程序的端口号
STATD_PORT=4004
重启rpcbind和nfs服务
# 重启rpcbind和nfs服务
systemctl restart rpcbind nfs
服务端配置(生产环境示例)
NFS服务端配置文件为 /etc/exports (默认是空文件),此处要注意三台服务器开放的ip限制有区别,除了exports文件外,其他配置完全一样.
async是延迟落盘,sync是实时落盘,async相比sync性能要高一些.

例如: NFSserver将/nfsshare目录共享给192.168.186.0 网段
# 创建/nfsshare目录
mkdir /nfsshare
# 设置目录属主和属组为nobody
chown nobody.nobody /nfsshare
# 设置nfsshare目录其他人拥有写权限,否则客户端不可写
chmod o+w /nfsshare
# 修改服务端配置文件
vim /etc/exports
配置内容如下:
# 在/etc/exportfs中增加以下一行内容
## 注意:网段和(权限)中间没有空格
## insecure允许客户端使用非特权端口(大于1024)
## async相比sync性能要高一些
## no_root_squash避免root越权
## 禁用子树检查以提高可靠性(no_subtree_check)
## fsid=0 根目录共享
# /nfsshare *(insecure,rw,async,no_root_squash)
# /nfsshare 192.168.32.0/24(rw,async,no_root_squash)
## 快捷编辑
echo '/nfsshare 192.168.32.0/24(rw,async,no_subtree_check,fsid=0)' > /etc/exports
| 共享目录 | 共享给哪些客户端 | 权限 |
|---|---|---|
| /nfsshare | 192.168.32.0/24 | (rw,async,no_root_squash) |
| /nfsshare | * | (insecure,rw,async,no_root_squash) |
使服务端配置生效
每次修改
/etc/exports文件时,都需要运行下面的命令使配置生效。如果有任何错误或警告,它们将显示在终端上。
exportfs命令用来管理当前NFS共享的文件系统列表.
常用参数:
| 参数 | 解释 |
|---|---|
-a | 打开或取消所有目录共享。 |
-o options,... | 指定一列共享选项,与 exports(5) 中讲到的类似。 |
-i | 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。 |
-r | 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。 |
-u | 取消一个或多个目录的共享。 |
-f | 在“新”模式下,刷新内核共享表之外的任何东西。任何活动的客户程序将在它们的下次请求中得到 mountd 添加的新的共享条目。 |
-v | 输出详细信息。当共享或者取消共享时,显示在做什么。显示当前共享列表的时候,同时显示共享的选项。 |
# -ar使共享配置生效(可以不重启nfs-server服务)
## -v查看当前的活动出口及其状态
exportfs -arv

使用exportfs命令查看已共享的资源
# 在服务器查看已共享的资源
exportfs

# 刷新显示已共享的资源
exportfs -rv

客户端挂载nfs
# 安装nfs客户端
## rhel系列安装nfs客户端
yum install -y nfs-utils
## Debian系列安装nfs客户端
apt update && apt install -y nfs-common
检查和测试nfs服务器是否可以连通
# 验证NFS是否可被export和挂载
## -e:显示NFS服务器上所有的共享目录。
showmount -e $nfs_server_ip

## -d:仅显示已被NFS客户端加载的目录
showmount -d 192.168.32.131

挂载NFS
# 客户端临时挂载NFS
mount -t nfs 192.168.32.131:/nfsshare /mnt/nfs
# 查看是否挂载
df -Th

# 将远程NFS共享目录挂载到本地文件系统,这里将远程NFS共享目录的根目录挂载到本地文件系统的/hdfs_2目录下
## -t nfs:指定文件系统类型为NFS
## -o:指定挂载选项,包括:
### vers=3:指定NFS版本为3
### proto=tcp:指定NFS使用TCP协议进行通信
### nolock:禁用NFS文件锁定机制
### noacl:禁用ACL(访问控制列表)
### sync:强制NFS挂载同步,确保数据的一致性
# 10.0.1.31:/:远程NFS服务器IP地址和共享目录路径
# 10.1.1.36:/hdfs_2:本地文件系统上的目标路径
mount -t nfs -o vers=3,proto=tcp,nolock,noacl,sync 10.0.1.31:/ 10.1.1.36:/hdfs_2
挂载时debug
## -v 显示挂载过程
mount -v

持久挂载
https://blog.youkuaiyun.com/omaidb/article/details/120091688
# 将nfs挂载写入/etc/fstab中持久挂载,需要加_netdev,防止客户端在网络就绪之前开始挂载文件系统
## _netdev 声明网络存储,网络就绪后才会执行挂载
192.168.32.131:/nfsshare /mnt/nfs nfs defaults,_netdev 0 0
# 或者
<本地挂载点> -rw,sync <远程nfs服务器>:/路径
NFS常用测试命令
验证NFS服务是否正在运行
# 验证NFS服务是否正在运行
rpcinfo -p $nfs_server

验证NFS空间是否可被export和挂载
# 验证NFS空间是否可被export和挂载
## -d:仅显示已被NFS客户端加载的目录;
## -e:显示NFS服务器上所有的共享目录。
showmount -e $nfs_server_ip

在服务器查看已共享的资源
# 使NFS配置热生效
## -ar使共享配置生效(可以不重启nfs-server服务)
## -v查看当前的活动出口及其状态
exportfs -arv
# 在服务器查看已共享的资源
exportfs

# 刷新显示已共享的资源
exportfs -rv

nfsstat列出NFS统计信息
https://www.linuxcool.com/nfsstat
常用参数:
| 参数 | 解释 |
|---|---|
| -s | 仅列出NFS服务器端状态 |
| -c | 仅列出NFS客户端状态 |
| -n | 仅列出NFS状态,默认显示nfs客户端和服务器的状态 |
| -m | 打印以加载的nfs文件系统状态 |
| -r | 仅打印rpc状态 |
参考实例 :
# 查看nfs版本
nfsstat -m <nfs服务器>

# 要显示关于客户机发送和拒绝的RPC和NFS调用数目的信息
nfsstat -c
# 要显示和打印与客户机NFS调用相关的信息
nfsstat -cn
# 要显示和打印客户机和服务器的与RPC调用相关的信息:
nfsstat -r
# 要显示关于服务器接收和拒绝的RPC和NFS调用数目的信息:
nfsstat –s
NFS常见问题
Linux操作系统上NFS客户端运行性能差?
参考: https://help.aliyun.com/document_detail/65228.html
问题描述:
Linux操作系统中出现NFS客户端读写速度只有几MB/s。
问题原因:
在Linux操作系统中,NFS客户端对于同时发起的NFS请求数量进行了控制,默认编译的内核中此参数值为2,严重影响性能。
解决方案:
修改同时发起的NFS请求数量,提高NFS性能。
NFS客户端对同时发起的NFS请求数量进行了控制,默认编译的内核中此参数值为2,严重影响性能,建议您将该参数值修改为128。
echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
sysctl -w sunrpc.tcp_slot_table_entries=128
## 可选
reboot
执行以下命令查看修改结果。
如果返回值为128,则说明修改成功。
# 查看NFS客户端对同时发起的NFS请求数量
cat /proc/sys/sunrpc/tcp_slot_table_entries
NFS备份方案
可以使用sersync方案来实时备份数据
https://blog.youkuaiyun.com/omaidb/article/details/133091969
本文详细介绍了如何在RHEL8和Debian系统上安装和配置NFS服务端,包括设置防火墙策略、端口管理和权限控制。讲解了NFS的常用端口、配置参数以及服务端配置文件/etc/exports的使用。此外,还阐述了客户端如何挂载NFS、检查服务器连接及持久挂载的方法,并提供了NFS性能优化和常见问题的解决方案。最后,提到了NFS的备份方案。
901






