两台服务器 NFS 共享目录实战

两台服务器 NFS 共享目录实战:实现数据同步与故障转移兼容

在分布式部署(如 K8s 集群、多节点服务)场景中,经常需要解决 "跨服务器数据共享" 问题 ------ 例如 Pod 故障转移后需访问原路径数据、多节点读写同一配置文件 / 日志等。NFS(Network File System,网络文件系统)是 Linux 环境下轻量高效的解决方案,可通过网络将一台服务器的目录共享给其他节点,实现目录数据实时同步。本文将详细拆解两台服务器 NFS 共享目录的完整实现流程,包含环境配置、权限优化、挂载验证、开机自启等关键步骤,兼顾实用性与可落地性。

一、NFS 核心原理与应用场景

1. 核心原理

NFS 允许客户端将服务器端的共享目录挂载到本地文件系统,客户端对该目录的读写操作会通过网络实时同步到服务器端,相当于在本地操作远程目录。其核心优势在于:

  • 轻量无依赖:基于 Linux 内核实现,无需额外部署复杂服务;
  • 实时同步:客户端与服务器端数据实时一致,无延迟;
  • 兼容性强:支持所有 Linux 发行版,可直接对接 K8s、Docker 等容器化环境。

2. 典型应用场景

  • 容器故障转移:Pod 从 A 服务器迁移到 B 服务器后,仍可通过挂载的 NFS 目录访问原数据(如业务日志、配置文件、持久化存储);
  • 多节点数据共享:多台服务器需读写同一批文件(如静态资源、共享配置),避免重复存储;
  • 数据备份:多节点数据集中存储在 NFS 服务器,便于统一备份与管理。

二、环境准备

1. 服务器规划

节点角色 服务器 IP 操作系统 共享 / 挂载目录 核心作用
NFS 服务器(主节点) 192.168.3.122 CentOS 7.8 /nfs/data(共享目录) 提供目录存储,接收客户端读写请求
NFS 客户端(从节点) 192.168.3.123 CentOS 7.8 /bak/data(挂载目录) 挂载服务器共享目录,本地读写同步到服务器

2. 依赖安装(所有节点执行)

NFS 依赖nfs-utils(NFS 核心工具)和rpcbind(远程过程调用服务,负责端口映射),需在服务器和客户端同时安装:

复制代码
# CentOS/RHEL 系列(yum包管理器)

yum install -y nfs-utils rpcbind

# 若为Ubuntu/Debian 系列(apt包管理器),替换为:

apt-get update && apt-get install -y nfs-common nfs-kernel-server rpcbind

3. 防火墙与 SELinux 配置(关键!避免访问失败)

NFS 默认使用 111 端口(rpcbind)和动态端口(1024-65535),需开放防火墙规则,同时临时关闭 SELinux(或配置例外):

(1)防火墙配置(所有节点)
复制代码
# 开放nfs和rpcbind相关端口

firewall-cmd --permanent --add-service=nfs

firewall-cmd --permanent --add-service=rpcbind

firewall-cmd --permanent --add-service=mountd  # NFS挂载依赖服务

firewall-cmd --reload  # 重载防火墙规则生效
(2)SELinux 配置(所有节点)

SELinux 可能会限制 NFS 的目录访问权限,建议临时关闭:

复制代码
# 临时关闭SELinux

setenforce 0	#重启后失效,适合测试/快速部署

# 查看SELinux状态

getenforce	#返回Permissive即为关闭

# 若需永久关闭(编辑配置文件):

sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config	# 重启服务器生效

三、NFS 服务器(主节点)配置

1. 创建共享目录

在服务器端创建用于共享的本地目录,后续客户端将挂载该目录:

复制代码
# 创建共享目录

mkdir -p /nfs/data

# 设置目录权限(关键!确保客户端有读写权限)

chmod -R 755 /nfs/data

chown -R nobody:nobody /nfs/data  # 映射为匿名用户,避免权限冲突

2. 配置 NFS 共享规则

编辑 NFS 核心配置文件/etc/exports,定义共享目录、允许访问的客户端及权限:

复制代码
# 编辑配置文件

vi /etc/exports

# 添加以下内容(核心规则)

/data/nfs 192.168.3.0/24(insecure,rw,sync,no\_root\_squash,no\_subtree\_check)

3. 启动 NFS 服务并生效配置

复制代码
# 启动rpcbind服务(NFS依赖,需先启动)

systemctl enable rpcbind --now  # enable设置开机自启,--now立即启动

# 启动nfs-server服务

systemctl enable nfs-server --now

# 使共享配置生效(修改/etc/exports后无需重启服务,执行此命令即可)

exportfs -r
验证服务器配置是否正常
复制代码
# 查看NFS服务器共享的目录列表

showmount -e localhost

若输出以下内容,说明服务器配置成功:

复制代码
Export list for localhost:

/nfs/data 192.168.3.0/24

四、NFS 客户端(从节点)配置

1. 验证服务器共享目录

先在客户端测试是否能访问服务器的 NFS 共享目录,确保网络通畅:

复制代码
# 查看NFS服务器(192.168.3.122)的共享目录

showmount -e 192.168.3.122

若输出与服务器端showmount -e localhost一致,说明网络和服务器配置无问题。

2. 创建本地挂载目录

在客户端创建用于挂载服务器共享目录的本地目录(自定义路径,如 /bak/data,与业务需求一致):

复制代码
mkdir -p /bak/data  # 目录路径可自定义,如/data/nfs-mount

3. 挂载 NFS 共享目录

将服务器的/nfs/data目录挂载到客户端的/bak/data目录:

复制代码
# 执行挂载命令(-t nfs指定文件系统类型为NFS)

mount -t nfs 192.168.3.122:/nfs/data /bak/data

4. 验证挂载是否成功

(1)查看挂载状态
复制代码
# 方式1:查看所有挂载点,过滤nfs

mount | grep nfs

# 方式2:查看NFS相关挂载(更简洁)

df -h | grep nfs

若输出以下类似内容,说明挂载成功:

复制代码
192.168.3.122:/nfs/data  100G  5.8G   95G   6% /bak/data
(2)数据同步测试

通过读写文件测试客户端与服务器端数据是否同步:

复制代码
# 客户端在挂载目录创建测试文件

echo "123" > /bak/data/test.txt

# 服务器端查看共享目录是否存在该文件

cat /nfs/data/test.txt  # 输出:123

# 服务器端修改文件,客户端验证

echo "321" >> /nfs/data/test.txt

cat /bak/data/test.txt  # 输出两行内容,说明双向同步成功

五、部署过程遇到的问题(避坑)

1. 客户端执行 showmount -e 服务器 IP 报错 "clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)"

  • 原因:服务器防火墙未开放 NFS 相关端口,或网络不通;

  • 解决:重新执行服务器防火墙开放命令(firewall-cmd --permanent --add-service=nfs --add-service=rpcbind --add-service=mountd && firewall-cmd --reload),并测试服务器与客户端网络(ping ``192.168.3.122)。

2. 客户端挂载时报错 "mount.nfs: access denied by server while mounting 192.168.3.122:/nfs/data"

  • 原因:服务器/etc/exports中允许的客户端网段不包含当前客户端 IP,或权限参数配置错误;

  • 解决:修改服务器/etc/exports,将客户端 IP 加入允许网段(如192.168.3.123),执行exportfs -r生效。

相关推荐
Hard but lovely2 小时前
linux: centos 软件包管理 yum源
linux·运维·centos
悲伤小伞3 小时前
Linux_Socket_UDP
linux·服务器·网络·c++·网络协议·udp
2301_816073833 小时前
Chrony服务器
运维·服务器
学网络的APang3 小时前
Apache HTTP Server 2.4.65 详细安装教程(基于 CentOS 7)
运维·网络
非典型代码3 小时前
Jenkins发不出邮件
运维·servlet·jenkins
b***25113 小时前
储能电池组的生产流程|深圳比斯特自动化
运维·自动化
实心儿儿3 小时前
Linux系统 —— 基础命令1
linux·运维·服务器
FreeBuf_4 小时前
SesameOp 恶意软件滥用 OpenAI Assistants API 实现与 C2 服务器的隐蔽通信
运维·服务器·网络
凤凰战士芭比Q5 小时前
部署我的世界-java版服务器-frp内网穿透
java·服务器