目录
- 概述
- 服务器端配置
- 步骤 1: 更新系统并安装 NFS 服务器
- 步骤 2: 创建要共享的目录
- 步骤 3: 配置 NFS 导出文件 (
/etc/exports) - 步骤 4: 应用 NFS 配置并启动服务
- 步骤 5: 防火墙配置
- 客户端配置
- 步骤 1: 安装 NFS 客户端工具
- 步骤 2: 创建本地挂载点
- 步骤 3: 挂载 NFS 共享
- 步骤 4: 设置开机自动挂载 (
/etc/fstab)
- 高级配置选项
- 常见问题排查
- 安全注意事项
概述
NFS 工作在客户端/服务器模型中:

- 服务器: 一台运行 NFS 服务的机器,它“导出”(共享)一个或多个目录。
- 客户端: 另一台机器,它通过 NFS 协议“挂载”服务器上共享的目录,就像访问本地文件一样。
本教程将使用两台机器作为示例:
- NFS 服务器:
168.1.100 - NFS 客户端:
168.1.101
请将以下 IP 地址替换为你自己环境的实际 IP 地址。
服务器端配置
在运行以下命令前,请确保你拥有 sudo 权限。
步骤 1: 更新系统并安装 NFS 服务器
更新你的软件包列表,然后安装 nfs-kernel-server 包,这是 Ubuntu 上最常用的 NFS 服务器实现。

sudo apt update sudo apt install nfs-kernel-server -y
步骤 2: 创建要共享的目录
为了安全起见,我们建议为 NFS 共享创建一个专门的目录,并设置适当的权限。
# 创建共享目录,/srv/nfs/share sudo mkdir -p /srv/nfs/share # 设置目录所有者为当前用户(可选,方便管理) # 将 your_username 替换为你的实际用户名 sudo chown -R $USER:$USER /srv/nfs/share # 设置目录权限,确保客户端可以读写 sudo chmod -R 777 /srv/nfs/share
注意:
777权限非常开放,仅用于演示,在生产环境中,你应该根据需要设置更严格的权限(如775)和正确的用户/组。
步骤 3: 配置 NFS 导出文件 (/etc/exports)
/etc/exports 文件定义了哪些目录被共享,以及哪些客户端可以访问它们,以及访问权限。
使用你喜欢的文本编辑器打开该文件,nano:

sudo nano /etc/exports
在文件末尾添加以下内容,这是最基本和最常用的配置:
# <共享目录> <客户端IP>(选项1,选项2,...)
/srv/nfs/share 192.168.1.101(rw,sync,no_subtree_check)
配置详解:
/srv/nfs/share: 你要共享的目录路径。168.1.101: 允许访问的客户端 IP 地址,你可以使用通配符:- 允许任何客户端(不安全)。
168.1.0/24: 允许168.1.*网段的所有客户端。example.com: 允许example.com域内的所有客户端。
- 括号内是访问选项,用逗号分隔。
rw: Read-Write,允许客户端读写,这是最常用的选项。ro: Read-Only,只读。sync: 数据在请求写入后才确认回复,这保证了数据的一致性,但性能稍差。推荐在生产环境使用。async: 数据先在内存中处理,然后异步写入磁盘,性能更好,但有数据丢失的风险。no_subtree_check: 如果共享目录是子目录,禁用子树检查可以提高性能。推荐使用。no_root_squash: 默认情况下,客户端的root用户会被映射为匿名用户(nfsnobody),设置此选项后,客户端的root用户在共享目录中将拥有root权限。非常危险,请谨慎使用! 通常用于无盘工作站等需要 root 权限的场景。root_squash: 默认选项,将客户端的root用户映射为匿名用户,更安全。
保存并关闭文件 (Ctrl+X, 然后按 Y, 最后按 Enter)。
步骤 4: 应用 NFS 配置并启动服务
修改了 /etc/exports 文件后,需要让 NFS 服务器重新加载配置。
# 使新的导出配置生效 sudo exportfs -a # 启动并启用 nfs-kernel-server 服务 sudo systemctl start nfs-kernel-server sudo systemctl enable nfs-kernel-server # 检查服务状态,确保为 active (running) sudo systemctl status nfs-kernel-server
步骤 5: 防火墙配置
如果服务器上启用了 ufw (Uncomplicated Firewall),你需要为 NFS 服务开放端口,NFS 使用多个动态端口,因此最简单的方法是使用 rpcbind 服务来管理这些端口。
# 允许 rpcbind 服务,NFS 依赖它 sudo ufw allow rpcbind # 允许 nfs 服务 sudo ufw allow nfs # 如果你的客户端 IP 是固定的,也可以只允许来自该 IP 的访问 # sudo ufw allow from 192.168.1.101 to any port nfs
然后启用防火墙(如果尚未启用):
sudo ufw enable
客户端配置
在客户端机器 (168.1.101) 上执行以下操作。
步骤 1: 安装 NFS 客户端工具
sudo apt update sudo apt install nfs-common -y
步骤 2: 创建本地挂载点
在客户端创建一个目录,作为远程 NFS 共享的挂载点。
sudo mkdir -p /mnt/nfs_share
步骤 3: 挂载 NFS 共享
使用 mount 命令手动挂载。
# 语法: sudo mount <服务器IP>:<共享目录> <本地挂载点> sudo mount 192.168.1.100:/srv/nfs/share /mnt/nfs_share
验证是否挂载成功:
# 查看挂载信息 df -hT # 输出应该包含类似下面的一行 # 192.168.1.100:/srv/nfs/share 25G 4.5G 21G 18% /mnt/nfs_share # 在挂载点创建一个文件测试 sudo touch /mnt/nfs_share/test_file.txt
然后回到服务器上,检查 /srv/nfs/share 目录下是否出现了 test_file.txt,如果出现,说明挂载成功。
步骤 4: 设置开机自动挂载 (/etc/fstab)
为了在客户端重启后自动挂载 NFS 共享,需要编辑 /etc/fstab 文件。
# 备份 fstab 文件是个好习惯 sudo cp /etc/fstab /etc/fstab.bak # 编辑 fstab sudo nano /etc/fstab
在文件末尾添加以下行:
# <服务器IP>:<共享目录> <本地挂载点> nfs _netdev,auto,bg,soft,intr 0 0
192.168.1.100:/srv/nfs/share /mnt/nfs/share nfs defaults 0 0
/etc/fstab 选项详解:
defaults: 使用默认的挂载选项 (rw, suid, dev, exec, auto, nouser, async)。_netdev: 告诉系统这是一个需要网络设备就绪的设备,在启动网络后才挂载。非常重要!soft: 如果服务器无响应,客户端会返回一个错误,而不是无限期挂起。hard(默认) 会一直等待,直到服务器恢复。intr: 允许中断挂载操作(例如用Ctrl+C)。bg: 如果首次挂载失败,会在后台尝试重新挂载。- 最后两个
0 0表示不进行备份和文件系统检查。
保存文件后,你可以通过以下命令测试 fstab 是否正确配置:
# 卸载已挂载的目录 sudo umount /mnt/nfs/share # 根据 fstab 重新挂载所有文件系统 sudo mount -a
如果命令没有报错,说明 fstab 配置正确,再次使用 df -hT 验证。
高级配置选项
NFSv4 配置 (推荐)
NFSv4 是更新的版本,它简化了防火墙配置(只使用一个 TCP 端口 2049),并提供了更好的安全性和性能。
服务器端:
-
安装 NFSv4 相关包:
sudo apt install nfs-kernel-server nfs4-acl-tools
-
修改
/etc/default/nfs-kernel-server,启用锁定管理器:sudo nano /etc/default/nfs-kernel-server
找到并取消注释这行:
# RPCMOUNTDOPTS="--manage-gids"改为:
RPCMOUNTDOPTS="--manage-gids" -
强烈建议 在 NFSv4 中设置一个共享的域名,编辑
/etc/idmapd.conf:sudo nano /etc/idmapd.conf
将
Domain的值修改为你的网络域名(localdomain或lan):#Domain = localdomain Domain = lan -
重启 NFS 服务:
sudo systemctl restart nfs-kernel-server
客户端:
-
安装客户端工具:
sudo apt install nfs-common
-
同样,客户端也需要配置
/etc/idmapd.conf,使其与服务器上的Domain值一致。 -
挂载时指定 NFSv4 版本:
sudo mount -t nfs4 -o vers=4 192.168.1.100:/ /mnt/nfs_share
注意,在 NFSv4 中,共享路径是相对于服务器导出的根目录的,如果服务器导出
/srv/nfs/share,那么客户端挂载时路径就是 ,实际访问的是/mnt/nfs_share/share。
常见问题排查
-
mount.nfs: access denied by server- 原因: 服务器
/etc/exports文件配置错误或客户端 IP 不在允许列表中。 - 解决: 检查服务器上的
/etc/exports文件,确保客户端 IP 地址正确,并执行sudo exportfs -r重新导出。
- 原因: 服务器
-
mount.nfs: an incorrect mount option was specified- 原因:
/etc/exports文件中的选项有拼写错误或使用了不支持的选项。 - 解决: 检查
/etc/exports文件的语法。
- 原因:
-
rpc.statd: unable to contact statd on server- 原因: 服务器端的
statd服务未运行或防火墙阻止了 RPC 端口。 - 解决: 在服务器上确保
nfs-statd服务正在运行 (sudo systemctl status nfs-statd),并检查防火墙规则。
- 原因: 服务器端的
-
挂载后,客户端显示
Permission denied- 原因 1: 服务器共享目录权限不正确,检查
ls -ld /srv/nfs/share的输出,确保客户端用户有读写权限。 - 原因 2: 服务器开启了
root_squash(默认),而客户端正在使用root用户操作,这是正常的安全行为,建议在客户端创建一个普通用户来操作。 - 原因 3: 客户端和服务器之间的用户/组 ID 不匹配,NFS 默认使用 UID/GID 来识别用户,如果服务器上的用户
www-data(UID 33) 在客户端上不存在,那么客户端上以www-data身份创建的文件,在服务器上会显示为nobody。
- 原因 1: 服务器共享目录权限不正确,检查
-
如何查看 NFS 服务器导出了什么?
- 在服务器上运行:
showmount -e
- 在客户端上可以查看服务器导出的列表:
showmount -e 192.168.1.100
- 在服务器上运行:
安全注意事项
- 网络隔离: NFS 应该在受信任的内网环境中使用,绝对不要将其暴露在公共互联网上。
- 谨慎使用
no_root_squash: 这会允许客户端的 root 用户完全控制你的共享文件,存在巨大的安全风险。 - 使用
ro(只读): 如果客户端只需要读取文件,请务必在服务器端配置ro权限。 - 使用防火墙: 始终使用防火墙(如
ufw)限制只有特定的客户端 IP 才能访问 NFS 服务。 - 定期更新: 保持你的系统和 NFS 软件包为最新版本,以修复已知的安全漏洞。
