Linux进阶篇:CentOS7搭建NFS文件共享服务

[复制链接]
发表于 2026-10-5 11:51:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一、NFS 是什么,它解决了什么问题

NFS(Network File System,网络文件系统)是 Unix/Linux 生态里历史最久的分布式文件协议之一。它的核心价值在于:把远端服务器上的目录"挂"到本机的一个目录上,本机进程读写这个目录时,实际操作的是远端磁盘,整个过程对应用程序完全透明。

在运维实操里,NFS 最常见的三个用途是:

  • 多台 Web 节点共用同一份用户上传目录或图片目录,避免各机库存不一致;
  • 把数据盘从应用服务器剥离,做独立的存储节点,方便后续整体迁移;
  • 测试环境里快速在集群间同步脚本、配置文件,不用每台机器单独 scp。

需要说明的是,NFS 走的是普通 TCP/UDP 上的远程过程调用,延迟明显高于本地磁盘。高并发小文件写入的场景建议评估对象存储或分布式文件系统,NFS 更适合"顺序读写为主、并发量可控"的共享目录。

二、实验环境规划

本文用两台 CentOS 7 虚拟机做完整验证,一台当服务端,一台当客户端。真实环境里请把 IP 换成自己的网段。

  • NFS 服务端:192.168.1.151
  • NFS 客户端:192.168.1.152

目标很明确:在服务端把 /data 目录共享出去,客户端把这个目录挂到本地 /mnt,之后在客户端命令行里操作 /mnt 里的文件,就等于在操作服务端的 /data。

三、服务端:安装并启动 NFS

NFS 服务依赖 rpcbind 做端口注册,所以两个包要一起装。下面这段在服务端执行:

yum -y install rpcbind nfs-utils
yum -y install gcc

装完后先启动 rpcbind,再启动 nfs,并且都设为开机自启。顺序不能反,rpcbind 不活着,nfs 注册不到端口映射表:

systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs
systemctl enable nfs

如果后面要用 netstat 看监听端口而提示命令不存在,补装一下工具包:

netstat -tunlp | grep -E 'nfs|rpcbind'

四、服务端:配置 /etc/exports 共享规则

NFS 的共享规则全部写在 /etc/exports 里。用 vi 打开它,加一行:

vi /etc/exports
# 内容如下
/data 192.168.1.0/24(rw,sync,no_root_squash)

这一行拆开看,前半段是"要共享的目录 + 允许访问的客户端网段",后半段是括号里的权限选项:

  • rw:客户端可读写,只读场景改成 ro;
  • sync:写入立即落盘,数据安全性高但性能略低;追求性能可改 async;
  • no_root_squash:客户端 root 用户保持 root 权限。这一项有安全含义,只有你完全信任同网段的客户端时才用,生产环境更推荐默认的 root_squash,把客户端 root 映射成 nfsnobody。

改完让规则立即生效,不需要重启服务:

exportfs -r
exportfs -v

五、服务端:准备共享目录与权限

这一步很多初学者会漏,漏了之后客户端能挂上却写不进去,排查半天。在服务端执行:

mkdir /data
chmod 755 /data
touch /data/1.txt
echo "hello nfs" >> /data/1.txt
chown -R nfsnobody:nfsnobody /data

要点有两个:一是目录本身要有可执行权限(x),否则客户端进不去;二是把属主设成 nfsnobody,这样配合 root_squash 时文件权限模型是统一的。

六、服务端自检:rpcinfo 与 showmount

挂载之前先在服务端自己确认一下服务是否真的对外可用:

rpcinfo -p 192.168.1.151
showmount -e 192.168.1.151

rpcinfo -p 会列出各个程序注册的端口号,其中 nfs、mountd、portmapper 三项都在,说明 RPC 侧正常;showmount -e 能打印出导出列表,看到 /data 就说明 exports 生效了。如果 showmount 不通,八成是服务端防火墙没放行 nfs 相关端口(2049 以及 rpcbind 的 111),而不是 exports 写错了。

七、客户端:装工具、检测、挂载

客户端不需要启动 nfs 服务,但要装 nfs-utils,因为 showmount 命令出自这个包:

yum -y install nfs-utils
systemctl start rpcbind
systemctl enable rpcbind

先看看服务端共享了什么,再执行挂载:

showmount -e 192.168.1.151
mkdir -p /mnt
mount -t nfs 192.168.1.151:/data /mnt

挂载完成后做两步验证。第一,看挂载表:

df -h
mount | grep nfs

第二,直接读文件,看服务端 /data/1.txt 里那句 hello nfs 能不能取到:

cat /mnt/1.txt
ls -l /mnt

能读到就说明整条链路通了。此时在客户端往 /mnt 里写一个新文件,回服务端看 /data 下是否同步出现,双向验证才算做完。

八、让挂载在重启后仍然存在

手动 mount 只在当前有效,机器重启就没了。生产环境必须写进 /etc/fstab:

vi /etc/fstab
# 新增一行
192.168.1.151:/data /mnt nfs defaults,_netdev 0 0

写完后用 mount -a 测试,没有报错就说明 fstab 语法没问题,下次开机会自动挂载。这个条目里 _netdev 很关键,它告诉挂载工具"等设备就绪后再挂",避免开机时网络还没起来就挂 NFS 导致卡住几十秒甚至进不去系统。

如果对可用性要求更高,还可以加装 NFStype 的 nofail 参数,即使 NFS 临时不可达,也不影响本机继续开机。

九、常见故障与排查思路

  • 客户端 showmount 报 "No route to host":服务端防火墙拦了,放行 nfs 服务或直接开端口 2049 与 111。
  • 能挂载但写入报 Permission denied:回到第五步检查 /data 的属主和权限,并检查 exports 里是 rw 还是 ro。
  • 客户端普通用户写入后属主变成 nobody:这是 root_squash 在起作用,属正常行为,不是故障。
  • 挂载后 df 卡住十几秒:典型的网络抖动,把挂载选项里的 sync 去掉、或改用 async 看是否好转。
  • 服务端重启后客户端还在用旧连接:在客户端重新 mount -o remount,或者重新挂载一次。

十、小结

NFS 的搭建主线其实只有四步:装包并启动 rpcbind/nfs、写 /etc/exports、建目录并给对权限、客户端 mount 并写进 fstab。真正决定能不能长期稳定跑的,是 exports 里的权限选项和 fstab 里的 _netdev、nofail 这类参数——它们决定了机器重启、网络波动时系统会怎么反应。把这两处想清楚了,NFS 基本就不会在工作时间给你添乱。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表