目录
- NFS 简介
- 环境准备
- 服务器端配置
- 1 安装 NFS 软件包
- 2 创建共享目录
- 3 编辑
/etc/exports文件 - 4 启动并启用 NFS 服务
- 5 检查配置和防火墙
- 客户端配置
- 1 安装客户端工具
- 2 挂载 NFS 共享
- 3 开机自动挂载 (
/etc/fstab)
- 高级配置与安全
- 1 NFSv4 的 ID 映射问题 (重要!)
- 2 使用
sync和async选项 - 3 限制客户端访问
- 4 使用 NFS over SSL/TLS (加密)
- 常见问题排查
NFS 简介
NFS (Network File System) 是一种允许网络中的计算机之间像访问本地文件一样访问远程文件的协议,它基于客户端/服务器模型。

- 服务器端: 运行 NFS 服务,将其本地目录导出(共享)给网络上的其他计算机。
- 客户端: 运行 NFS 客户端,将服务器导出的目录挂载到本地文件系统中。
版本选择:
- NFSv4: 推荐使用,它集成了身份验证(通过 Kerberos)、状态监控,并且默认使用 TCP 协议,安全性更高,配置更简单(尤其在跨网络时)。
- NFSv3: 旧版,仍广泛使用,功能相对简单,但兼容性好。
- NFSv2: 已基本淘汰。
本指南主要基于 NFSv4。
环境准备
假设我们有两台 Linux 机器:
- NFS 服务器:
168.1.100(操作系统: CentOS Stream 9 / Rocky Linux 9 / Ubuntu 22.04) - NFS 客户端:
168.1.101(操作系统同上)
关键前提:

- 网络连通: 确保客户端和服务器之间可以互相
ping通。 - 时间同步: 强烈建议服务器和客户端使用 NTP (Network Time Protocol) 服务同步时间,这对于 NFSv4 的身份验证至关重要。
- 防火墙: 确保防火墙允许 NFS 相关的端口通信,NFSv4 默认使用 TCP 2049 端口,但启动时还会向
rpcbind(port 111) 和mountd等服务注册动态端口,最简单的方法是使用firewalld或ufw的预定义服务。
服务器端配置
以下操作在 NFS 服务器 (168.1.100) 上执行。
1 安装 NFS 软件包
对于 RHEL/CentOS/Rocky Linux 系统:
# 更新软件包列表 sudo dnf update -y # 安装 NFS 服务器软件包 sudo dnf install -y nfs-utils
对于 Debian/Ubuntu 系统:
# 更新软件包列表 sudo apt update # 安装 NFS 服务器软件包 sudo apt install -y nfs-kernel-server
2 创建共享目录
我们将创建一个目录 /srv/nfs_share 并设置合适的权限。

# 创建共享目录 sudo mkdir -p /srv/nfs_share # 设置目录所有者为 root,组为 root,权限为 755 (rwxr-xr-x) sudo chown -R root:root /srv/nfs_share sudo chmod -R 755 /srv/nfs_share # (可选) 在目录中创建一个测试文件 echo "Hello from NFS Server!" | sudo tee /srv/nfs_share/welcome.txt
3 编辑 /etc/exports 文件
这是 NFS 服务器的核心配置文件,它定义了哪些目录被共享,以及哪些客户端可以访问,以及访问权限。
使用你喜欢的编辑器打开文件:
sudo vim /etc/exports
NFSv4 推荐配置格式:
/path/to/directory client_ip(options)
/path/to/directory: 要共享的本地路径。client_ip: 客户端的 IP 地址或子网。168.1.101: 单个 IP 地址。168.1.0/24: 整个 C 类子网。- 任何客户端 (不推荐,不安全)。
options: 访问选项,用逗号分隔。
常用选项:
ro: 只读 (Read-Only)。rw: 读写 (Read-Write)。sync: 推荐,写操作会同步到磁盘,确保数据一致性,但性能稍差。async: 写操作先保存在内存中,稍后写入磁盘,性能高,但可能在服务器宕机时丢失数据。no_root_squash: 重要! 默认情况下,客户端的 root 用户会被映射为nfsnobody用户(称为 "squashing"),如果需要客户端的 root 用户在共享目录上拥有 root 权限,使用此选项。安全风险高,请谨慎使用!root_squash: 默认选项,将客户端的 root 用户映射为nfsnobody。all_squash: 将所有用户(包括 root)都映射为nfsnobody。anonuid和anongid: 配置all_squash或root_squash使用的匿名用户和组的 UID/GID。
示例配置:
在 /etc/exports 文件中添加以下行:
# /srv/nfs_share 共享给 192.168.1.101 这个客户端,允许读写,同步写入 /srv/nfs_share 192.168.1.101(rw,sync) # 如果你想共享给整个子网,并允许所有用户(包括 root)以匿名用户身份访问 # /srv/nfs_share 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
保存并退出编辑器后,让系统应用新的配置:
# exportfs 命令会重新读取 /etc/exports 文件并更新共享列表 sudo exportfs -a
4 启动并启用 NFS 服务
# 启动 NFS 服务 sudo systemctl start nfs-server # 设置 NFS 服务开机自启 sudo systemctl enable nfs-server # 检查服务状态 sudo systemctl status nfs-server
5 检查配置和防火墙
检查导出列表:
# 查看当前正在导出的目录和选项 sudo exportfs -v
输出应该类似于:
/srv/nfs_share
192.168.1.101(rw,wdelay,root_squash,no_subtree_check)
配置防火墙:
对于使用 firewalld 的系统 (CentOS/RHEL/Rocky):
# 永久允许 NFS 服务 sudo firewall-cmd --permanent --add-service=nfs # 永久允许 RPC-bind 服务 (NFSv4 依赖) sudo firewall-cmd --permanent --add-service=rpc-bind # 永久允许 mountd 服务 (NFSv4 依赖) sudo firewall-cmd --permanent --add-service=mountd # 重新加载防火墙配置以应用更改 sudo firewall-cmd --reload
对于使用 ufw 的系统 (Ubuntu/Debian):
# 允许 NFS 服务 sudo ufw allow nfs # 允许 rpcbind 服务 sudo ufw allow rpcbind # 允许 mountd 服务 sudo ufw allow mountd # 重新加载防火墙 sudo ufw reload
客户端配置
以下操作在 NFS 客户端 (168.1.101) 上执行。
1 安装客户端工具
对于 RHEL/CentOS/Rocky Linux 系统:
sudo dnf install -y nfs-utils
对于 Debian/Ubuntu 系统:
sudo apt install -y nfs-common
2 挂载 NFS 共享
创建一个本地挂载点:
sudo mkdir -p /mnt/nfs_share
使用 mount 命令挂载,NFSv4 的语法非常简洁:
# 格式: mount nfs_server_ip:/shared_path /local_mount_point sudo mount 192.168.1.100:/srv/nfs_share /mnt/nfs_share
验证挂载是否成功:
# 查看挂载点信息 df -hT /mnt/nfs_share # 查看挂载点中的文件 ls -l /mnt/nfs_share # 应该能看到服务器创建的 welcome.txt 文件
3 开机自动挂载 (/etc/fstab)
为了在客户端重启后能自动挂载 NFS 共享,需要编辑 /etc/fstab 文件。
强烈建议先使用 nofail 选项,这样即使 NFS 服务器在客户端启动时不可用,客户端也能正常启动。
# 使用 vim 编辑 /etc/fstab sudo vim /etc/fstab
在文件末尾添加以下行:
# 格式: <server_ip>:<shared_path> <local_mount_point> nfs <options> 0 0 192.168.1.100:/srv/nfs_share /mnt/nfs_share nfs defaults,nofail,_netdev 0 0
选项解释:
defaults: 使用默认挂载选项(包括rw,suid,dev,exec,auto,nouser,async)。nofail: 非常重要,如果挂载失败,系统不会进入紧急救援模式,而是继续启动。_netdev: 告诉系统这是一个网络设备,需要在网络启动之后再进行挂载。
保存文件后,可以测试一下配置是否正确:
# 卸载刚刚手动挂载的目录 sudo umount /mnt/nfs_share # 根据 /etc/fstab 的内容重新挂载所有文件系统 sudo mount -a # 再次检查是否挂载成功 df -hT /mnt/nfs_share
高级配置与安全
1 NFSv4 的 ID 映射问题 (重要!)
NFSv4 使用字符串形式的用户和组名(如 "alice")而不是数字 ID (UID/GID) 来传递身份信息,当客户端的用户(如 UID=1000)访问服务器上的文件时,服务器需要知道这个 UID=1000 对应哪个用户名,如果服务器和客户端的用户名/UID 映射不一致,就会出现奇怪的权限问题(比如显示为 nfsnobody)。
解决方案:
- 确保用户名和 UID/GID 一致: 最佳实践是使用 LDAP 或 NIS 等集中式身份管理系统。
- 使用
idmapd服务: 这是最常用的方法。nfsidmap服务会读取/etc/libnfsidmap.conf和/etc/idmapd.conf来进行转换。
配置 /etc/idmapd.conf:
sudo vim /etc/idmapd.conf
找到 [General] 部分,确保 Domain 设置正确,这个域名应该与你的网络域名匹配,或者可以自定义一个。
[General]
# Domain = localdomain
Domain = example.com # 修改为你的域名或自定义一个
保存后,重启 nfs-idmapd 服务:
sudo systemctl restart nfs-idmapd
2 使用 sync 和 async 选项
sync(默认推荐): 数据在写入客户端缓存后,会立即同步到服务器的磁盘,这保证了数据的持久性,但会增加延迟,降低写入性能,对于关键数据(如数据库),必须使用。async: 数据先写入客户端缓存,稍后再批量写入服务器磁盘,写入性能高,但存在数据丢失风险(例如服务器突然断电),适用于对数据一致性要求不高的场景,如视频流媒体缓存。
3 限制客户端访问
除了在 /etc/exports 中使用 IP 地址限制外,还可以通过以下方式增强安全性:
- 使用
rw和ro: 明确指定客户端是只读还是读写。 - 避免使用
no_root_squash: 除非有特殊且受控的需求,否则始终使用默认的root_squash,防止客户端的 root 用户破坏服务器文件系统。 - 使用防火墙规则: 使用
iptables或firewalld进一步限制哪些 IP 可以访问 NFS 的端口。
4 使用 NFS over SSL/TLS (加密)
标准的 NFSv4 并不加密数据传输,如果需要在不受信任的网络中传输敏感数据,可以使用 nfs-ganesha 或通过 stunnel 等工具为 NFS 流量包装一层 SSL/TLS 加密,这会增加配置复杂度,但能提供端到端的加密。
常见问题排查
-
mount.nfs: access denied by server- 原因: 服务器端的防火墙阻止了连接,或者
/etc/exports文件中的客户端 IP 地址或选项配置错误。 - 排查:
- 在服务器上运行
sudo exportfs -v检查配置是否正确。 - 在客户端上用
telnet <server_ip> 2049测试端口是否通。 - 检查服务器和客户端的防火墙规则。
- 在服务器上运行
- 原因: 服务器端的防火墙阻止了连接,或者
-
Permission denied(挂载成功,但访问文件时报错)- 原因: 这通常是 ID 映射问题(见 5.1 节)或文件权限问题。
- 排查:
- 在客户端上,用
id your_username查看自己的 UID/GID。 - 在服务器上,用
ls -l /srv/nfs_share查看文件的属主和属组,如果文件属主是nfsnobody,而你的 UID 不是nfsnobody的 UID (通常是 65534),就会出问题。 - 确保服务器端共享目录的权限 (
755) 允许其他用户读取和执行。 - 检查
/etc/idmapd.conf的配置并重启nfs-idmapd服务。
- 在客户端上,用
-
mount: /mnt/nfs_share: special device ... does not exist- 原因: 通常是 NFS 服务器未启动、网络不通或防火墙阻止了
rpcbind等服务端口。 - 排查:
- 在服务器上确认
systemctl status nfs-server为active (running)。 - 在客户端确认
ping得通服务器 IP。 - 检查服务器防火墙是否允许
nfs,rpc-bind,mountd服务。
- 在服务器上确认
- 原因: 通常是 NFS 服务器未启动、网络不通或防火墙阻止了
-
客户端无法开机自动挂载 (
/etc/fstab配置后)- 原因: 网络服务在挂载尝试时还未启动。
- 排查:
- 确保在
/etc/fstab中使用了_netdev选项。 - 使用
nofail选项,防止因 NFS 服务器不可用而导致系统启动失败。 - 检查
/var/log/messages或journalctl -xe中的错误信息。
- 确保在
