Ubuntu NFS 服务器配置完整指南
NFS (Network File System) 允许您通过网络将文件系统挂载到另一台计算机上,就像使用本地硬盘一样,这对于需要在多台服务器之间共享文件(Web 服务器的静态文件、用户主目录等)的场景非常有用。

本指南将分为以下几个部分:
- 服务器端配置
- 客户端配置
- 防火墙设置
- 高级选项与优化
- 常见问题排查
第一部分:服务器端配置
这部分操作在您的 Ubuntu 服务器上进行。
步骤 1: 更新系统并安装 NFS 服务器
更新软件包列表并安装 nfs-kernel-server 包。
sudo apt update sudo apt install nfs-kernel-server -y
步骤 2: 创建要共享的目录
选择一个您希望共享的目录,这里我们创建一个 /srv/nfs/share 目录作为示例。

sudo mkdir -p /srv/nfs/share
为了方便演示,我们给这个目录设置一些基本的权限。
# 设置目录所有者为 root,组为 root sudo chown -R root:root /srv/nfs/share # 设置目录的权限为 755 (所有者读写执行,组和其他用户读执行) sudo chmod -R 755 /srv/nfs/share
步骤 3: 配置 /etc/exports 文件
/etc/exports 文件是 NFS 服务器的核心配置文件,它定义了哪些目录共享给哪些客户端,以及共享的权限。
使用您喜欢的编辑器(如 nano 或 vim)打开该文件:
sudo nano /etc/exports
在文件末尾添加以下配置行,格式为:
<共享目录> <客户端1>(选项1,选项2) <客户端2>(选项3)

示例配置:
允许特定 IP 地址访问
假设您想允许 IP 地址为 168.1.10 的客户端访问。
/srv/nfs/share 192.168.1.10(rw,sync,no_subtree_check)
允许特定子网访问
如果您想允许整个 168.1.0/24 网段的所有客户端访问。
/srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check)
允许任何客户端访问 (不推荐用于生产环境) 仅用于测试,非常不安全。
/srv/nfs/share *(rw,sync,no_subtree_check)
配置选项详解:
rw: 允许客户端以读写方式挂载,这是最常用的选项。ro: 只读方式挂载。sync: 文件写入到磁盘后,才对客户端返回确认,这保证了数据的一致性,但性能稍差。async: 数据先在内存中缓存,稍后再写入磁盘,性能更好,但有数据丢失的风险(例如服务器断电)。no_subtree_check: 禁用子树检查,当共享的目录是文件系统的一部分时,这个选项可以避免一些问题,特别是在客户端有文件被移动或删除时。强烈推荐使用此选项。no_root_squash: 如果客户端以 root 用户身份访问,那么在 NFS 共享上,它也将拥有 root 权限。对于管理工具或需要 root 权限的脚本很有用,但有安全风险。root_squash: 这是默认行为,客户端的 root 用户会被映射成匿名用户(通常是nfsnobody),从而限制了其权限,这是更安全的选择。all_squash: 将所有用户(包括 root)都映射成匿名用户,当您希望所有客户端用户都使用同一个匿名账户时很有用。
步骤 4: 应用新的导出配置
修改完 /etc/exports 文件后,需要让 NFS 服务器重新读取配置并应用它。
# 重新导出所有共享目录 sudo exportfs -a # 或者重启 NFS 服务 sudo systemctl restart nfs-kernel-server
步骤 5: 启动并启用 NFS 服务
确保 NFS 服务正在运行,并设置为开机自启。
# 检查服务状态 sudo systemctl status nfs-kernel-server # 如果未运行,启动它 sudo systemctl start nfs-kernel-server # 设置为开机自启 sudo systemctl enable nfs-kernel-server
至此,NFS 服务器端配置完成!
第二部分:客户端配置
这部分操作在需要挂载 NFS 共享的 Ubuntu (或其他 Linux) 客户端上进行。
步骤 1: 安装 NFS 客户端工具
客户端需要安装 nfs-common 包来提供挂载 NFS 共享所需的功能。
sudo apt update sudo apt install nfs-common -y
步骤 2: 创建本地挂载点
在客户端上创建一个目录,作为 NFS 共享的挂载点。
sudo mkdir -p /mnt/nfs_share
步骤 3: 手动挂载 NFS 共享
使用 mount 命令进行手动挂载,格式为:
mount <服务器IP>:<共享目录> <本地挂载点>
假设您的服务器 IP 是 168.1.100。
sudo mount 192.168.1.100:/srv/nfs/share /mnt/nfs_share
步骤 4: 验证挂载
检查共享是否成功挂载。
# 使用 df -h 命令查看磁盘使用情况 df -h | grep nfs_share # 或者使用 mount 命令 mount | grep nfs_share
如果看到类似以下的输出,说明挂载成功:
168.1.100:/srv/nfs/share on /mnt/nfs_share type nfs4 (rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.10,locallock=none,addr=192.168.1.100)
步骤 5: 测试读写
在挂载点创建一个文件,以测试写权限。
sudo touch /mnt/nfs_share/test_file.txt ls -l /mnt/nfs_share/
如果文件创建成功,说明配置正确。
步骤 6: 设置开机自动挂载 (可选)
为了让客户端在重启后自动挂载 NFS 共享,需要修改 /etc/fstab 文件。
警告: 编辑 /etc/fstab 错误可能导致系统无法启动,请务必谨慎。
使用 blkid 或 mount 命令获取 NFS 共享的详细信息,特别是 vers=4 等选项,以确保兼容性。
# 获取挂载信息 mount | grep nfs_share
用编辑器打开 /etc/fstab:
sudo nano /etc/fstab
在文件末尾添加以下行:
# <服务器IP>:<共享目录> <本地挂载点> nfs <选项> 0 0
192.168.1.100:/srv/nfs/share /mnt/nfs_share nfs defaults,timeo=600,retrans=2,_netdev 0 0
/etc/fstab 选项说明:
defaults: 使用默认的挂载选项(包括 rw, suid, dev, exec, auto, nouser, async)。_netdev: 这是一个重要的选项,它告诉系统这是一个网络设备,应该在网络启动之后再尝试挂载。timeo=600: 设置 NFS 操作超时时间,单位为十分之一秒(600 = 60秒),在网络不稳定的环境下很有用。retrans=2: 设置重传次数。x-systemd.automount(更现代的方案): 使用systemd的自动挂载服务,可以实现按需挂载,提高系统启动速度和网络性能。
保存文件后,可以通过以下命令测试 fstab 是否正确配置:
# 卸载已挂载的目录 sudo umount /mnt/nfs_share # 尝试根据 fstab 重新挂载所有 sudo mount -a
如果命令没有报错,说明 fstab 配置正确,再次使用 df -h 验证。
第三部分:防火墙设置
如果您的服务器启用了 UFW (Uncomplicated Firewall),需要开放 NFS 使用的端口。
NFS v4 主要使用 TCP 的 2049 端口,但 rpcbind、mountd、nlockmgr、statd 等服务也需要开放端口,最简单的方法是使用 ufw 的应用配置。
# 允许 NFS 服务 sudo ufw allow 'NFS' # 如果还需要允许其他服务,如 Samba (SMB) 或 RPC,可以一并开放 # sudo ufw allow 'Samba' # sudo ufw allow 'rpcbind' # 重新加载防火墙规则 sudo ufw reload
如果您使用的是 iptables,则需要手动添加规则,
sudo iptables -A INPUT -p tcp --dport 2049 -j ACCEPT sudo iptables -A INPUT -p udp --dport 2049 -j ACCEPT # ... 其他端口规则 sudo iptables-save | sudo tee /etc/iptables/rules.v4
第四部分:高级选项与优化
NFSv4 vs NFSv3 vs NFSv2
- NFSv4 (推荐): 是最新的稳定版本,安全性更高(内置了 Kerberos 认证),通过单一 TCP 端口 (2049) 进行通信,配置更简单,性能也更好,现代 Linux 发行版默认使用 NFSv4。
- NFSv3: 仍然广泛使用,但需要多个端口,配置稍复杂。
- NFSv2: 已经过时,不推荐使用。
如何指定 NFS 版本?
在 /etc/exports 文件中,可以使用 fsid 选项来明确指定为 NFSv4 共享。
/srv/nfs/share 192.168.1.0/24(rw,sync,no_subtree_check,fsid=0)
fsid=0 告诉 NFS 客户端这是 NFSv4 的根文件系统。
在客户端挂载时,可以指定版本:
# 强制使用 NFSv4 sudo mount -t nfs4 -o vers=4 192.168.1.100:/srv/nfs/share /mnt/nfs_share
NFS 缓存和性能优化
rsize和wsize: 定义了读/写操作的数据块大小,较大的值(如1048576,即 1MB)可以提高性能,但需要网络支持。- 在
/etc/fstab中添加:rsize=1048576,wsize=1048576
- 在
asyncvssync: 如前所述,async性能更好但有数据丢失风险,对于非关键数据可以考虑使用。noatime: 禁用文件访问时间更新,可以减少磁盘 I/O,提升性能。- 在
/etc/fstab中添加:noatime
- 在
第五部分:常见问题排查
-
mount.nfs: access denied by server while mounting- 原因: 服务器
/etc/exports文件配置错误,或客户端 IP 不在允许列表中。 - 解决: 检查服务器端
/etc/exports文件,确保客户端 IP 或子网配置正确,使用showmount -e <服务器IP>查看服务器当前导出的共享列表。
- 原因: 服务器
-
rpc.statd: unable to contact statmon service- 原因: 服务器端的
statd服务未运行或防火墙阻止了相关端口。 - 解决: 确保服务器上
nfs-kernel-server服务正在运行,检查防火墙规则是否放开了rpc.statd的端口。
- 原因: 服务器端的
-
mount.nfs: requested NFS version or transport protocol is not supported- 原因: 客户端或服务器端不支持您指定的 NFS 版本。
- 解决: 检查两端系统是否都安装了 NFS 相关软件包,尝试不指定版本进行挂载,或指定一个更通用的版本(如
vers=3)。
-
showmount: unable to retrieve localhost- 原因:
rpcbind服务未运行。 - 解决: 在服务器上启动
rpcbind服务:sudo systemctl start rpcbind && sudo systemctl enable rpcbind。
- 原因:
-
挂载后出现 "Operation not permitted" 或 "Permission denied"
- 原因: 通常是文件系统权限问题,检查服务器端共享目录的权限 (
ls -ld /srv/nfs/share) 和文件所有者,检查/etc/exports中的root_squash选项,如果客户端需要 root 权限,服务器端可能需要设置no_root_squash(但请注意安全风险)。
- 原因: 通常是文件系统权限问题,检查服务器端共享目录的权限 (
希望这份详细的指南能帮助您成功配置和使用 Ubuntu NFS 服务器!
