网络文件系统(NFS)是一种在网络中不同计算机之间共享文件的分布式文件系统协议,它允许客户端系统像访问本地存储一样透明地访问服务器上的远程文件,在 CentOS 7 系统中,配置和使用 NFS 是一项非常实用的技能,尤其适用于需要集中存储数据的场景,如 Web 服务器集群共享静态资源、开发环境共享代码库或提供统一的用户主目录,本文将详细介绍在 CentOS 7 上部署 NFS 服务端和客户端的完整流程。

环境准备与软件安装
在开始之前,我们需要准备两台 CentOS 7 机器,一台作为 NFS 服务器,另一台作为客户端,假设它们的 IP 地址如下:
- NFS 服务器: 192.168.1.10
- NFS 客户端: 192.168.1.20
在服务器和客户端上都需要安装 nfs-utils 软件包,它提供了 NFS 服务和客户端所需的所有工具。
在服务器端 (192.168.1.10) 执行:
sudo yum install -y nfs-utils rpcbind
rpcbind 是一个必需的服务,它负责管理 RPC(远程过程调用)服务的端口号映射。
在客户端 (192.168.1.20) 执行:
sudo yum install -y nfs-utils
服务器端配置
安装完成后,接下来配置 NFS 服务器。
启动并设置服务开机自启
NFS 服务依赖于 rpcbind,因此必须先启动并设置 rpcbind。
sudo systemctl start rpcbind sudo systemctl enable rpcbind sudo systemctl start nfs-server sudo systemctl enable nfs-server
创建共享目录
创建一个用于共享的目录,并设置适当的权限,我们创建 /shared/data 目录。
sudo mkdir -p /shared/data sudo chmod 755 /shared/data
配置导出目录
NFS 的核心配置文件是 /etc/exports,我们需要在这个文件中定义要共享的目录以及允许访问的客户端及其权限。
编辑 /etc/exports 文件:
sudo vi /etc/exports
在文件末尾添加以下行:

/shared/data 192.168.1.20(rw,sync,no_root_squash,no_subtree_check)
这行配置的含义是:
/shared/data: 要共享的目录路径。168.1.20: 允许访问此共享的客户端 IP 地址,也可以使用网段(如168.1.0/24)或主机名。(rw,sync,no_root_squash,no_subtree_check): 访问权限选项,括号内不能有空格。rw: 允许读写操作。sync: 数据同步写入磁盘,保证数据一致性,但性能稍低。no_root_squash: 允许客户端的 root 用户在共享目录上拥有服务器的 root 权限,为了安全,仅在信任的网络环境中使用。no_subtree_check: 禁用子目录检查,可以提高性能和稳定性。
使配置生效
保存 /etc/exports 文件后,使用以下命令重新加载配置,使其立即生效:
sudo exportfs -a
可以使用 showmount -e 命令查看当前服务器上已导出的共享列表。
客户端挂载与使用
在客户端机器上,我们需要将服务器共享的目录挂载到本地。
创建挂载点 在客户端创建一个目录作为挂载点。
sudo mkdir -p /mnt/nfs_data
执行挂载
使用 mount 命令进行挂载:
sudo mount -t nfs 192.168.1.10:/shared/data /mnt/nfs_data
验证挂载
挂载成功后,可以使用 df -hT 或 mount | grep nfs 命令来验证。
df -hT | grep nfs
输出应类似如下:
168.1.10:/shared/data nfs4 50G 1.5G 48G 4% /mnt/nfs_data
你可以在 /mnt/nfs_data 目录中创建、读取和删除文件,这些操作都会实时反映到服务器的 /shared/data 目录中。
实现开机自动挂载
为了确保客户端重启后能自动挂载 NFS 共享,我们需要将其添加到 /etc/fstab 文件中。
编辑 /etc/fstab 文件:

sudo vi /etc/fstab
在文件末尾添加以下行:
168.1.10:/shared/data /mnt/nfs_data nfs defaults,_netdev 0 0
这里的 _netdev 选项非常重要,它告诉系统这是一个网络设备,必须等待网络启动完成后再进行挂载,避免启动失败。
防火墙与NFS版本
防火墙配置
如果服务器开启了防火墙(默认 firewalld),需要开放 NFS 相关的服务。
sudo firewall-cmd --permanent --add-service=nfs sudo firewall-cmd --permanent --add-service=mountd sudo firewall-cmd --permanent --add-service=rpc-bind sudo firewall-cmd --reload
NFS 版本选择 CentOS 7 默认支持 NFSv4 和 NFSv3,NFSv4 相比 NFSv3 有显著改进。
| 特性 | NFSv3 | NFSv4 |
|---|---|---|
| 端口 | 使用随机端口,需配置 lockd 和 statd 端口 |
仅使用 TCP 2049 端口,防火墙配置更简单 |
| 安全性 | 依赖 IP/主机名验证,无内置加密 | 支持 Kerberos 强认证和加密(更安全) |
| 性能 | 性能良好 | 性能更优,尤其在处理大量小文件时 |
| 协议 | 无状态协议 | 有状态协议,网络中断恢复能力更强 |
在大多数新部署中,推荐使用 NFSv4,客户端在挂载时可以通过 -o vers=4 明确指定版本,但通常系统会自动协商使用最高版本。
相关问答FAQs
问题1:客户端挂载时出现 "Permission Denied" 错误,该如何排查? 解答: 这是一个常见问题,可以从以下几个方面进行排查:
- 服务器端
/etc/exports配置:检查客户端 IP 地址是否在允许列表中,权限选项(如rw)是否正确,修改后记得执行exportfs -r。 - 服务器端目录权限:检查被共享的目录本身(如
/shared/data)的 Linux 权限(ls -ld /shared/data),确保运行挂载命令的用户或 NFS 客户端用户有足够的访问权限。 - SELinux 状态:SELinux 处于
Enforcing模式,它可能会阻止 NFS 访问,可以临时关闭 SELinux(setenforce 0)测试,或永久设置布尔值允许 NFS 读写:setsebool -P nfs_export_all_rw on。 - 防火墙:确认服务器防火墙已正确开放
nfs,mountd,rpc-bind服务。
问题2:如何实现 NFS 的安全访问,避免 no_root_squash 带来的风险?
解答: no_root_squash 会带来严重的安全风险,因为它允许客户端的 root 用户直接操作服务器文件,更安全的做法是:
- 使用
root_squash(默认选项):这样客户端的 root 用户请求会被映射到服务器上的一个匿名用户(通常是nfsnobody),无法直接修改服务器的关键文件。 - 用户权限映射:在服务器和客户端上创建相同的普通用户(UID 和 GID 都为 1001 的
appuser),然后以该用户的身份进行文件操作,确保文件权限一致。 - 启用 NFSv4 和 Kerberos:这是最安全的方式,通过配置 Kerberos 认证,可以对用户进行强身份验证,并对网络传输的数据进行加密,有效防止未授权访问和数据窃听,但这需要搭建额外的 Kerberos 服务,配置相对复杂。