一、NFS 是什么
思路参考:https://blog.csdn.net/wjk0312/article/details/130415937
NFS 是一种基于 TCP/IP 传输的网络文件系统协议。用了 NFS,客户机就能像访问本地目录一样,访问远程服务器里的共享资源。
NAS 存储:NFS 的实现依赖 RPC(Remote Process Call,远端过程调用)机制,用它来完成"远程到本地"的映射。
在 CentOS 7 里,需要装两个软件包:
| 软件包 | 作用 |
|---|---|
nfs-utils | NFS 共享发布和访问 |
rpcbind | 提供 RPC 支持 |
⚠️ 手动加载 NFS 共享服务时,应该先启动rpcbind,再启动nfs。
端口: NFS 是 2049,RPC 是 111。
原理如图(关系到为什么要装这些服务):

要求:至少需要两台虚拟机。
二、搭建步骤
1. 修改主机名、配置主机映射(hosts)
略。
2. 安装 nfs 服务
- CentOS 里是
nfs-utils - 服务器和员工虚拟机都要装
- 但只需要服务端开启服务,员工装上就行
3. 创建共享目录
mkdir /nfs # controller 节点
mkdir /test # compute 节点
4. 在第一个节点(controller)增加配置文件
[root@nfs1 ~]# vi /etc/exports
/nfs *(rw,sync,no_root_squash)
参数含义:
| 参数 | 意思 |
|---|---|
rw | 读写权限 |
sync | 文件同时写入硬盘和内存 |
no_root_squash | NFS 客户端连接服务端时,如果是 root,那么共享目录也是 root。(一般不开,不安全) |
5. 开启第一节点的 NFS 服务
systemctl start nfs
6. 查看第一节点可共享的目录
[root@nfs2 ~]# showmount -e nfs1
Export list for nfs1:
/nfs *
这个输出的意思是:
Export list for nfs1—— 这是服务端(nfs1)共享出来的目录列表/nfs—— 服务端共享的目录叫/nfs*—— 允许所有人(任何 IP)来挂载
7. 挂载(在员工机子上)
mount -t nfs nfs1:/nfs /test
mount—— 挂载命令,把别处的存储挂到自己目录下-t nfs—— 指定文件系统类型是 NFSnfs1:/nfs—— 要挂载的"源":服务端的 IP + 它共享的目录/test—— 挂载的"目标":客户端上的本地目录
⚠️ 两个坑:
1. 不要在服务器上自己挂载自己,会造成部分命令锁死!
2. 这一步可能被防火墙拦截
8. 查看磁盘使用情况
df -h,客户端如果看到了 /test 挂载点,并且文件系统是 服务器IP:/nfs,就 OK。
验证:创建文件看共享目录是否一样即可。
三、排错全记录(从零到通)
1. 发现问题
搭好之后死活挂不上,于是一步步排查:
| 步骤 | 命令 | 目的 | 结果 | |
|---|---|---|---|---|
| 1 | ping nfs1 | 确认网络通不通 | ✅ 通 | |
| 2 | showmount -e nfs1 | 看服务端共享了啥 | ❌ 卡住 | |
| 3 | rpcinfo -p nfs1 | 看 RPC 注册了啥 | ❌ 没有 nfs | |
| 4 | 服务端 `rpcinfo -p \ | grep nfs` | 对比服务端自己有没有 nfs | ✅ 有 |
| 5 | `ss -tuln \ | grep 111` | 看 rpcbind 监听地址 | ✅ *:111(对外) |
| 6 | `ss -tuln \ | grep 2049` | 看 nfs 监听地址 | ✅ *:2049(对外) |
| 7 | nc -zv nfs1 2049 | 测试 TCP 端口通不通 | ❌ No route to host | |
| 8 | systemctl status firewalld | 检查防火墙 | ✅ 开着 | |
| 9 | firewall-cmd --list-all | 看防火墙开了啥 | ❌ 只有 111/tcp,没有 nfs | |
| 10 | 添加 nfs / rpc-bind / mountd 服务 | 开防火墙端口 | ✅ | |
| 11 | 再次 nc -zv nfs1 2049 | 测试端口 | ✅ Connected | |
| 12 | showmount -e nfs1 | 查看共享 | ✅ /nfs * | |
| 13 | mount -t nfs nfs1:/nfs /test | 挂载 | ✅ 成功 |
结论:本地一切正常,问题出在服务端的防火墙。
2. 这次用到的命令
网络诊断:
| 命令 | 作用 |
|---|---|
ping IP | 测试网络通不通(ICMP 协议) |
nc -zv IP 端口 | 测试 TCP 端口是否开放(-z 扫描,-v 显示详情) |
telnet IP 端口 | 另一种测试端口的方法 |
RPC 相关:
| 命令 | 作用 |
|---|---|
rpcinfo -p IP | 查看远程主机的 RPC 服务注册情况 |
rpcinfo -p | 查看本机的 RPC 服务注册情况 |
showmount -e IP | 查看远程主机的 NFS 共享目录 |
端口监听:
| 命令 | 作用 | |
|---|---|---|
ss -tuln | 查看所有监听的 TCP/UDP 端口 | |
| `ss -tuln \ | grep 端口` | 过滤指定端口 |
-tTCP、-uUDP、-l监听、-n不解析服务器名。
防火墙:
| 命令 | 作用 |
|---|---|
systemctl status firewalld | 查看防火墙状态 |
systemctl stop firewalld | 临时关闭防火墙(测试用) |
firewall-cmd --list-all | 查看当前区域的所有规则 |
firewall-cmd --permanent --add-service=nfs | 永久开放 nfs 服务(2049) |
firewall-cmd --permanent --add-service=rpc-bind | 永久开放 rpc-bind 服务(111) |
firewall-cmd --permanent --add-service=mountd | 永久开放 mountd 服务(动态端口) |
firewall-cmd --reload | 重新加载防火墙配置 |
NFS 配置与挂载:
| 文件 / 命令 | 作用 |
|---|---|
/etc/exports | NFS 共享配置文件 |
exportfs -v | 查看当前生效的共享配置 |
exportfs -r | 重新加载 /etc/exports |
systemctl start/restart nfs | 启动 / 重启 NFS 服务 |
mount -t nfs 服务端IP:/共享目录 /本地挂载点 | 挂载 NFS 共享 |
umount /test | 卸载 NFS 挂载 |
3. 踩坑点
| 问题 | 原因 | 解决 |
|---|---|---|
showmount 卡住 | 服务端防火墙没开 rpc-bind | firewall-cmd --add-service=rpc-bind |
nc 连不上 2049 | 服务端防火墙没开 nfs | firewall-cmd --add-service=nfs |
No route to host | 端口被防火墙拦了 | 开对应端口或服务 |
客户端 rpcinfo 看不到 nfs | 防火墙挡住了 RPC 的 UDP 包 | 开了 rpc-bind 后恢复 |
/etc/hosts 写反 | nfs2 里把 nfs1 的 IP 写成了自己 | 修正 hosts 文件 |
4. 一句话总结
NFS 不通,先查网络(ping),再查端口(nc),再查 RPC(rpcinfo),最后查防火墙。
八成是防火墙没开nfs和rpc-bind服务。
5. 验证成功的标志
# 服务端
[root@nfs1 ~]# exportfs -v
/nfs <world>(rw,sync,no_root_squash)
# 客户端
[root@nfs2 ~]# showmount -e nfs1
Export list for nfs1:
/nfs *
[root@nfs2 ~]# mount -t nfs nfs1:/nfs /test
[root@nfs2 ~]# df -h | grep nfs
nfs1:/nfs 36G 5.8G 30G 17% /test
# 验证文件共享
[root@nfs1 ~]# touch /nfs/hello.txt
[root@nfs2 ~]# ls /test/
hello.txt
原文链接:https://blog.csdn.net/wjk1020312/article/details/130415937