一、适用场景
本教程适用于 Ubuntu 系统(Debian 系通用),实现 NFS(网络文件系统)的服务端搭建与客户端挂载,核心用途:
- 多服务器共享文件(如应用程序配置文件、日志存储);
- 跨服务器数据传输(无需手动拷贝,实时同步);
- 简化集群环境的文件管理。
二、前提准备
1. 环境确认
- 服务端:Ubuntu 16.04+/20.04+(需管理员权限),固定 IP 192.168.0.1(示例 IP,需替换为实际服务端 IP);
- 客户端:Ubuntu 16.04+/20.04+(需管理员权限),能与服务端 192.168.0.1 网络互通;
- 防火墙:服务端需开放 NFS 相关端口(默认端口范围 111、2049 及动态端口,建议关闭防火墙或放行规则)。
2. 核心概念
- 服务端:提供共享目录的服务器,通过 /etc/exports 配置共享规则;
- 客户端:挂载服务端共享目录的机器,挂载后可像本地目录一样读写文件;
- 关键工具:nfs-kernel-server(服务端核心包)、showmount(查看共享目录)、mount(挂载命令)。
三、第一部分:NFS 服务端配置
1. 安装 NFS 服务端软件
# 更新软件源(可选,确保安装最新版本)
sudo apt update
# 安装 NFS 服务端核心包
sudo apt install -y nfs-kernel-server
2. 检查 NFS 服务状态
sudo systemctl status nfs-server
- 成功状态:显示 active (running),表示服务已启动;
- 若未启动:执行 sudo systemctl start nfs-server 手动启动。
3. 创建共享目录并授权
# 创建 NFS 共享根目录(自定义路径,示例:/root/nfs_root)
sudo mkdir -p /root/nfs_root
# 授予目录读写权限(777 为全权限,测试环境使用;生产环境建议按用户授权)
sudo chmod -R 777 /root/nfs_root
- 说明:-p 确保目录不存在时自动创建,避免报错。
4. 配置共享规则(/etc/exports)
# 编辑 NFS 配置文件
sudo vim /etc/exports
# 在文件末尾添加以下配置(允许指定客户端访问,替换为实际需求)
/root/nfs_root 192.168.0.0/24(insecure,rw,sync,no_root_squash)
- 配置参数说明:
| 配置项 | 含义 |
|---|---|
| /root/nfs_root | 服务端共享目录路径 |
| 192.168.0.0/24 | 允许访问的客户端网段(生产环境推荐限制网段,而非 * 所有 IP) |
| insecure | 允许客户端从非特权端口连接 |
| rw | 读写权限(ro 为只读权限) |
| sync | 同步写入(数据实时写入磁盘,保证一致性,推荐生产环境使用) |
| no_root_squash | 客户端 root 用户映射为服务端 root 用户(测试环境使用;生产环境建议 root_squash) |
- 安全优化:避免使用 * 开放所有 IP 访问,严格限制为业务所需网段(如 192.168.0.0/24)。
5. 启动 NFS 服务并应用配置
# 启动 rpcbind 服务(NFS 依赖的端口映射服务)
sudo systemctl enable rpcbind # 设置开机自启
sudo systemctl start rpcbind # 启动服务
# 启动 NFS 服务并设置开机自启
sudo systemctl enable nfs-server
sudo systemctl restart nfs-server # 重启服务使配置生效
# 重新导出共享目录(无需重启服务,快速应用配置)
exportfs -r
6. 验证服务端配置生效
# 查看当前 NFS 共享目录列表
exportfs
- 成功输出示例:
/root/nfs_root 192.168.0.0/24
四、第二部分:NFS 客户端配置(验证服务可用性)
1. 安装 NFS 客户端工具
# 安装 NFS 客户端依赖包
sudo apt install -y nfs-common
2. 查看服务端共享目录
# 执行命令,查看服务端(192.168.0.1)的共享目录
showmount -e 192.168.0.1
- 成功输出示例(表示服务端共享配置正常):
Export list for 192.168.0.1:
/root/nfs_root 192.168.0.0/24
- 若报错「Connection refused」:检查服务端防火墙是否放行,或 NFS 服务是否启动。
3. 创建本地挂载目录
# 在客户端创建挂载点(自定义路径,示例:/root/nfsmount)
sudo mkdir -p /root/nfsmount
4. 挂载服务端共享目录
# 执行挂载命令(将服务端目录挂载到客户端本地)
sudo mount -t nfs 192.168.0.1:/root/nfs_root /root/nfsmount
- 参数说明:
-
- -t nfs:指定文件系统类型为 NFS;
-
- 192.168.0.1:/root/nfs_root:服务端 IP + 共享目录路径;
-
- /root/nfsmount:客户端本地挂载点路径。
5. 验证挂载成功(读写测试)
# 客户端写入测试文件(无需密码,依赖目录权限)
echo "hello nfs server" > /root/nfsmount/test.txt
# 客户端读取测试文件,确认写入成功
cat /root/nfsmount/test.txt
# 输出:hello nfs server
# (可选)服务端验证:登录服务端,查看文件是否同步
# cat /root/nfs_root/test.txt # 输出相同内容,说明挂载正常
6. 设置开机自动挂载(可选)
避免重启客户端后挂载失效,配置 /etc/fstab 自动挂载:
# 编辑 fstab 配置文件
sudo vim /etc/fstab
# 在文件末尾添加以下内容
192.168.0.1:/root/nfs_root /root/nfsmount nfs defaults 0 0
# 保存后,执行以下命令验证配置是否生效(无报错则正常)
sudo mount -a
- 说明:defaults 包含 rw、suid、dev 等默认参数,适用于大部分场景。
五、安全配置补充(生产环境必看)
1. 权限优化(避免 777 全权限)
# 服务端:创建专用用户(如 nfsuser),仅授权该用户访问共享目录
sudo useradd -m nfsuser
sudo passwd nfsuser # 输入密码 test123(按要求替换)
sudo chown -R nfsuser:nfsuser /root/nfs_root
sudo chmod -R 755 /root/nfs_root # 仅所有者有读写权限
2. 限制客户端 IP(强化 /etc/exports 配置)
# 仅允许指定单个IP访问(推荐生产环境)
/root/nfs_root 192.168.0.100(insecure,rw,sync,root_squash)
# 或允许多个IP/网段(用空格分隔)
/root/nfs_root 192.168.0.100 192.168.0.0/24(insecure,rw,sync,root_squash)
- root_squash:客户端 root 用户映射为服务端匿名用户(避免权限泄露,生产环境推荐)。
3. 防火墙放行规则(Ubuntu 防火墙示例)
# 放行 NFS 核心端口(111、2049)
sudo ufw allow 111/tcp
sudo ufw allow 2049/tcp
sudo ufw reload # 重载防火墙规则
六、常见问题排查
1. 客户端挂载时提示「Permission denied」
- 原因:服务端共享目录权限不足,或 /etc/exports 未允许客户端 IP;
- 解决:
-
- 服务端执行 sudo chmod -R 777 /root/nfs_root(测试环境);
-
- 检查 /etc/exports 客户端 IP 配置,执行 exportfs -r 重新应用。
2. 开机自动挂载失效
- 原因:/etc/fstab 配置错误,或 NFS 服务启动慢于挂载时机;
- 解决:
-
- 验证配置:sudo mount -a 查看报错信息,修正路径或参数;
-
- 添加延迟挂载:在 fstab 配置中添加 x-systemd.automount,如:
192.168.0.1:/root/nfs_root /root/nfsmount nfs defaults,x-systemd.automount 0 0
3. 客户端无法写入文件
- 原因:服务端共享目录为只读权限(ro),或 root_squash 限制;
- 解决:
-
- 服务端修改 /etc/exports 为 rw 权限,执行 exportfs -r;
-
- 若需客户端 root 写入,将 root_squash 改为 no_root_squash(谨慎使用)。
七、核心注意事项
- 安全风险:NFS 协议本身未加密,生产环境建议在局域网使用,或通过 VPN/SSH 隧道加密传输;
- 权限控制:避免使用 777 全权限和 * 开放所有 IP,遵循「最小权限原则」;
- 数据一致性:sync 参数确保数据实时写入磁盘,避免突然断电导致数据丢失;
- 卸载目录:客户端如需卸载,执行 sudo umount /root/nfsmount(需确保当前不在挂载目录下)。