NFS 网络文件系统配置指南

NFS 网络文件系统配置指南

NFS(Network File System)是一种分布式文件系统协议,允许客户端通过网络访问服务器上的文件。本文档介绍如何在现代 Linux 发行版上配置 NFS 服务。

📋 前置要求

支持的 Linux 发行版

  • CentOS/Rocky Linux/AlmaLinux 8+
  • Ubuntu 20.04+
  • Debian 11+

网络要求

  • 服务器和客户端需要在同一网络或可路由的网络中
  • 确保防火墙允许 NFS 相关端口(见下方防火墙配置)

🔧 服务器端配置

1. 安装 NFS 服务

CentOS/Rocky Linux/AlmaLinux 8+:

1
2
3
4
# 使用 dnf(CentOS 8+)或 yum(CentOS 7)
sudo dnf install -y nfs-utils
# 或
sudo yum install -y nfs-utils

Ubuntu/Debian:

1
2
sudo apt update
sudo apt install -y nfs-kernel-server

2. 创建共享目录

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建主共享目录
sudo mkdir -p /mnt/data/nfs_data

# 示例:为 MySQL 数据创建子目录
sudo mkdir -p /mnt/data/nfs_data/mysql

# 设置适当的权限(根据实际需求调整)
sudo chown -R nfsnobody:nfsnobody /mnt/data/nfs_data/mysql
# 或指定特定用户
sudo chown -R 1000:1000 /mnt/data/nfs_data/mysql

# 设置目录权限
sudo chmod -R 755 /mnt/data/nfs_data

3. 配置 NFS 导出

编辑 /etc/exports 文件:

1
sudo vim /etc/exports

添加导出配置:

1
2
3
4
5
6
7
8
9
10
# 基本格式:共享目录 客户端IP/网段(选项)
# 示例:允许整个子网访问
/mnt/data/nfs_data/mysql 192.168.3.0/24(rw,sync,no_subtree_check,no_root_squash)

# 多个客户端配置示例
/mnt/data/nfs_data/mysql 192.168.3.10(rw,sync,no_subtree_check) \
192.168.3.20(ro,sync,no_subtree_check)

# 允许所有客户端(不推荐用于生产环境)
# /mnt/data/nfs_data/mysql *(rw,sync,no_subtree_check)

常用选项说明:

  • rw: 读写权限
  • ro: 只读权限
  • sync: 同步写入(更安全,但性能较低)
  • async: 异步写入(性能更好,但数据安全性较低)
  • no_subtree_check: 禁用子树检查(提高性能)
  • no_root_squash: 允许 root 用户保持 root 权限(谨慎使用)
  • root_squash: 将 root 用户映射为匿名用户(更安全,默认)
  • all_squash: 将所有用户映射为匿名用户

4. 重新加载 NFS 配置

1
2
3
4
5
# 重新导出所有配置
sudo exportfs -ra

# 验证导出配置
sudo exportfs -v

5. 启动并启用服务

CentOS/Rocky Linux/AlmaLinux:

1
2
3
4
5
6
7
8
9
10
11
# 启动必需的服务
sudo systemctl start rpcbind
sudo systemctl start nfs-server
sudo systemctl start nfs-lock
sudo systemctl start nfs-idmap

# 设置开机自启
sudo systemctl enable rpcbind
sudo systemctl enable nfs-server
sudo systemctl enable nfs-lock
sudo systemctl enable nfs-idmap

Ubuntu/Debian:

1
2
3
4
5
# 启动 NFS 服务
sudo systemctl start nfs-kernel-server

# 设置开机自启
sudo systemctl enable nfs-kernel-server

6. 配置防火墙

firewalld (CentOS/Rocky Linux):

1
2
3
4
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload

ufw (Ubuntu):

1
2
3
4
5
sudo ufw allow from 192.168.3.0/24 to any port nfs
sudo ufw allow 111/udp
sudo ufw allow 111/tcp
sudo ufw allow 2049/tcp
sudo ufw allow 2049/udp

🔍 验证服务

检查 RPC 服务

1
2
3
4
5
6
7
8
9
# 检查 RPC 服务状态
rpcinfo -p localhost

# 应该看到类似输出:
# program vers proto port service
# 100000 4 tcp 111 portmapper
# 100000 3 tcp 111 portmapper
# 100024 1 udp 54321 status
# 100024 1 tcp 54321 status

检查导出列表

1
2
3
4
5
# 在服务器上检查
showmount -e localhost

# 在客户端上检查(需要先安装 nfs-utils)
showmount -e <服务器IP>

💻 客户端配置

1. 安装 NFS 客户端

CentOS/Rocky Linux/AlmaLinux:

1
sudo dnf install -y nfs-utils

Ubuntu/Debian:

1
sudo apt install -y nfs-common

2. 创建挂载点

1
sudo mkdir -p /mnt/nfs/mysql

3. 手动挂载

1
2
3
4
5
# 临时挂载
sudo mount -t nfs <服务器IP>:/mnt/data/nfs_data/mysql /mnt/nfs/mysql

# 验证挂载
df -h | grep nfs

4. 自动挂载(推荐)

编辑 /etc/fstab

1
sudo vim /etc/fstab

添加以下行:

1
2
# NFS 自动挂载配置
<服务器IP>:/mnt/data/nfs_data/mysql /mnt/nfs/mysql nfs defaults,_netdev 0 0

选项说明:

  • defaults: 使用默认挂载选项
  • _netdev: 表示网络设备,系统启动时等待网络就绪后再挂载
  • 0 0: dump 和 fsck 选项

测试配置:

1
2
3
4
5
# 测试 fstab 配置(不实际挂载)
sudo mount -a

# 验证挂载
mount | grep nfs

🔒 安全建议

  1. 限制访问范围:只允许必要的 IP 或子网访问
  2. 使用只读权限:如果客户端不需要写入,使用 ro 选项
  3. **避免使用 no_root_squash**:除非有特殊需求,否则使用默认的 root_squash
  4. 使用 NFSv4:NFSv4 提供更好的安全性和性能
  5. 配置 SELinux(如适用):
1
2
3
# 允许 NFS 服务
sudo setsebool -P nfs_export_all_rw 1
sudo setsebool -P nfs_export_all_ro 1

🐛 故障排查

检查服务状态

1
2
3
4
5
6
# CentOS/Rocky Linux
sudo systemctl status nfs-server
sudo systemctl status rpcbind

# Ubuntu/Debian
sudo systemctl status nfs-kernel-server

查看日志

1
2
3
4
5
6
# 查看系统日志
sudo journalctl -u nfs-server -f
sudo journalctl -u rpcbind -f

# 查看 NFS 日志
sudo tail -f /var/log/messages

常见问题

  1. 挂载失败:Connection refused

    • 检查防火墙配置
    • 确认 NFS 服务正在运行
    • 检查网络连通性
  2. 权限被拒绝

    • 检查 /etc/exports 配置
    • 确认目录权限设置
    • 检查 SELinux 配置(如适用)
  3. 挂载后无法写入

    • 检查导出配置中的权限选项
    • 确认目录的所有者和权限
    • 检查客户端用户权限

📚 参考资源

0%