首页  /  常用服务搭建  /  正文

NFS 服务搭建与排错

常用服务搭建 2026-10-01📖 12 分钟👁 —
🔧 运维进阶 · 常用服务搭建第 2 / 8 页12345678📖 完整导航 →

一、NFS 是什么

思路参考:https://blog.csdn.net/wjk0312/article/details/130415937

NFS 是一种基于 TCP/IP 传输的网络文件系统协议。用了 NFS,客户机就能像访问本地目录一样,访问远程服务器里的共享资源。

NAS 存储:NFS 的实现依赖 RPC(Remote Process Call,远端过程调用)机制,用它来完成"远程到本地"的映射。

在 CentOS 7 里,需要装两个软件包:

软件包作用
nfs-utilsNFS 共享发布和访问
rpcbind提供 RPC 支持
⚠️ 手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。

端口: NFS 是 2049,RPC 是 111。

原理如图(关系到为什么要装这些服务):

NFS 与 RPC 的关系

要求:至少需要两台虚拟机。


二、搭建步骤

1. 修改主机名、配置主机映射(hosts)

略。

2. 安装 nfs 服务

3. 创建共享目录

mkdir /nfs      # controller 节点
mkdir /test     # compute 节点

4. 在第一个节点(controller)增加配置文件

[root@nfs1 ~]# vi /etc/exports
/nfs *(rw,sync,no_root_squash)

参数含义:

参数意思
rw读写权限
sync文件同时写入硬盘和内存
no_root_squashNFS 客户端连接服务端时,如果是 root,那么共享目录也是 root。(一般不开,不安全)

5. 开启第一节点的 NFS 服务

systemctl start nfs

6. 查看第一节点可共享的目录

[root@nfs2 ~]# showmount -e nfs1
Export list for nfs1:
/nfs *

这个输出的意思是:

7. 挂载(在员工机子上)

mount -t nfs nfs1:/nfs /test
⚠️ 两个坑:
1. 不要在服务器上自己挂载自己,会造成部分命令锁死!
2. 这一步可能被防火墙拦截

8. 查看磁盘使用情况

df -h,客户端如果看到了 /test 挂载点,并且文件系统是 服务器IP:/nfs,就 OK。

验证:创建文件看共享目录是否一样即可。


三、排错全记录(从零到通)

1. 发现问题

搭好之后死活挂不上,于是一步步排查:

步骤命令目的结果
1ping nfs1确认网络通不通✅ 通
2showmount -e nfs1看服务端共享了啥❌ 卡住
3rpcinfo -p nfs1看 RPC 注册了啥❌ 没有 nfs
4服务端 `rpcinfo -p \grep nfs`对比服务端自己有没有 nfs✅ 有
5`ss -tuln \grep 111`看 rpcbind 监听地址✅ *:111(对外)
6`ss -tuln \grep 2049`看 nfs 监听地址✅ *:2049(对外)
7nc -zv nfs1 2049测试 TCP 端口通不通❌ No route to host
8systemctl status firewalld检查防火墙✅ 开着
9firewall-cmd --list-all看防火墙开了啥❌ 只有 111/tcp,没有 nfs
10添加 nfs / rpc-bind / mountd 服务开防火墙端口✅
11再次 nc -zv nfs1 2049测试端口✅ Connected
12showmount -e nfs1查看共享✅ /nfs *
13mount -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 端口`过滤指定端口
-t TCP、-u UDP、-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/exportsNFS 共享配置文件
exportfs -v查看当前生效的共享配置
exportfs -r重新加载 /etc/exports
systemctl start/restart nfs启动 / 重启 NFS 服务
mount -t nfs 服务端IP:/共享目录 /本地挂载点挂载 NFS 共享
umount /test卸载 NFS 挂载

3. 踩坑点

问题原因解决
showmount 卡住服务端防火墙没开 rpc-bindfirewall-cmd --add-service=rpc-bind
nc 连不上 2049服务端防火墙没开 nfsfirewall-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