Ubuntu 配置 NFS 网络文件系统 🖥️

🌐 掌握在 Ubuntu 上配置和管理 NFS 网络文件系统的完整流程!本指南从基础概念到高级优化,涵盖服务器端和客户端的全方位配置,助你轻松实现跨网络文件共享。


📖 目录导航


✨ NFS 简介与优势

NFS (Network File System) 是一种分布式文件系统协议,允许通过网络在不同主机间共享文件系统,具有以下优势:

  • 🌐 网络共享:实现多台服务器之间的文件共享和访问
  • 高性能:提供快速的网络文件访问速度
  • 🔄 透明访问:客户端可以像访问本地文件一样访问远程文件
  • 👥 多用户支持:支持多个客户端同时访问共享目录
  • 🛡️ 权限控制:可以设置不同的访问权限和安全性选项
  • 💾 资源集中:集中存储管理,节省存储空间

📊 NFS 版本对比

版本 特性 适用场景
NFSv2 基础功能,32位文件大小限制 老旧系统兼容
NFSv3 64位文件大小,异步写入 大多数现有环境
NFSv4 状态协议,强安全性,复合操作 现代环境推荐
NFSv4.1 并行NFS(pNFS),会话 trunking 高性能计算环境
NFSv4.2 服务器端复制,空间预留 最新应用场景

🚀 快速开始

1. 使用科技lion一键脚本工具

1
2
# 下载并运行科技lion的一键配置脚本
sudo curl -sS -O https://kejilion.pro/kejilion.sh && chmod +x kejilion.sh && ./kejilion.sh

2. 安装 NFS 客户端和服务器软件

1
2
3
4
5
# 更新软件包列表并安装 NFS 相关软件
sudo apt update && sudo apt install nfs-kernel-server nfs-common -y

# 验证安装
dpkg -l | grep nfs

🖥️ 一、Ubuntu 作为 NFS 服务器配置

1. 创建并配置共享目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建共享目录并设置权限
sudo mkdir -pm 755 /mnt/mydisk

# 更改目录所有权(可选,根据需求)
sudo chown nobody:nogroup /mnt/mydisk

# 配置 NFS 导出设置
sudo tee /etc/exports <<'EOF'
## 共享 /mnt/mydisk 目录给所有客户端
/mnt/mydisk *(rw,fsid=0,no_subtree_check,no_root_squash,insecure,sync)

# 或者限制特定网段访问
# /mnt/mydisk 192.168.1.0/24(rw,sync,no_subtree_check)
# /mnt/mydisk 10.10.10.0/24(rw,sync,no_subtree_check)
EOF

# 重新加载导出配置
sudo exportfs -r

# 查看当前导出列表
sudo exportfs -v

2. 重启 NFS 服务器

1
2
3
4
5
6
7
8
9
10
11
# 方法一:使用 service 命令重启
sudo service nfs-kernel-server restart

# 方法二:使用 init.d 脚本重启
sudo /etc/init.d/nfs-kernel-server restart

# 方法三:使用 systemctl 重启(推荐)
sudo systemctl restart nfs-kernel-server

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

3. 验证 NFS 服务器状态

1
2
3
4
5
6
7
8
9
10
11
# 检查 NFS 服务状态
sudo systemctl status nfs-kernel-server

# 查看当前导出的共享目录
sudo showmount -e

# 查看端口映射
sudo rpcinfo -p

# 检查NFS统计信息
nfsstat -s

💻 二、Ubuntu 作为 NFS 客户端配置

1. 临时挂载 NFS 共享

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 挂载 ARS2 服务器的共享目录
mkdir -pm 755 /mnt/ARS2-NFS
mount -t nfs -o rw,hard,intr,timeo=300,retrans=3 10.10.10.251:/mnt/mydisk /mnt/ARS2-NFS

# 挂载 PVE 服务器的共享目录
mkdir -pm 755 /mnt/PVE-NFS
mount -t nfs -o rw,hard,intr,timeo=300,retrans=3 10.10.10.254:/mnt/ntfs /mnt/PVE-NFS

# 挂载 Debian 服务器的共享目录
mkdir -pm 755 /mnt/Debian-NFS
mount -t nfs -o rw,hard,intr,timeo=300,retrans=3 10.10.10.247:/mnt/mydisk /mnt/Debian-NFS

# 查看所有挂载点
df -hT /mnt/*

# 测试挂载点写入权限
touch /mnt/ARS2-NFS/test_file && echo "写入测试成功" || echo "写入测试失败"

2. 永久挂载 NFS 共享

方法一:覆盖 /etc/fstab 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建挂载点目录
sudo mkdir -pm 755 /mnt/ARS2-NFS /mnt/PVE-NFS /mnt/Debian-NFS

# 配置 fstab 文件实现永久挂载
sudo tee /etc/fstab <<'EOF'
# NFS 共享配置
10.10.10.251:/mnt/mydisk /mnt/ARS2-NFS nfs rw,hard,intr,timeo=300,retrans=3,nofail,x-systemd.device-timeout=15s 0 0
10.10.10.254:/mnt/ntfs /mnt/PVE-NFS nfs rw,hard,intr,timeo=300,retrans=3,nofail,x-systemd.device-timeout=15s 0 0
10.10.10.245:/mnt/mydisk /mnt/Debian-NFS nfs rw,hard,intr,timeo=300,retrans=3,nofail,x-systemd.device-timeout=15s 0 0
EOF

# 测试 fstab 配置是否正确
sudo mount -av

# 重启系统使配置生效
sudo reboot

方法二:追加到 /etc/fstab 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建 Alpine 服务器的挂载点
sudo mkdir -pm 755 /mnt/Alpine-NFS

# 追加 Alpine 服务器的 NFS 共享配置
sudo tee -a /etc/fstab <<'EOF'
# 追加 Alpine 服务器 NFS 共享
10.10.10.242:/mnt/mydisk /mnt/Alpine-NFS nfs rw,hard,intr,timeo=300,retrans=3,nofail,x-systemd.device-timeout=15s 0 0
EOF

# 立即挂载新增的共享
sudo mount /mnt/Alpine-NFS

# 重启系统使配置生效
sudo reboot

3. 测试挂载配置

1
2
3
4
5
6
7
8
# 测试 fstab 配置是否正确(不实际挂载)
sudo mount -a

# 查看所有挂载的 NFS 共享
mount | grep nfs

# 检查挂载点状态
df -hT | grep nfs

🔧 三、NFS 挂载管理

1. 查看 NFS 挂载状态

1
2
3
4
5
6
7
8
9
10
11
# 查看所有挂载点
df -hT /mnt/*

# 查看 NFS 特定的挂载信息
mount | grep nfs

# 查看详细的挂载选项
cat /proc/mounts | grep nfs

# 查看NFS客户端统计信息
nfsstat -c

挂载目录详情示例:
| 文件系统 | 类型 | 大小 | 已用 | 可用 | 已用% | 挂载点 |
| :———————————- | :—: | :—: | :—: | :—: | :—-: | :——————— |
| 10.10.10.251:/mnt/mydisk | nfs | 2.7T | 1.8T | 823G | 69% | /mnt/ARS2-NFS |
| 10.10.10.254:/mnt/ntfs | nfs | 932G | 216G | 717G | 24% | /mnt/PVE-NFS |
| 10.10.10.247:/mnt/mydisk | nfs | 16G | 7.9G | 6.9G | 54% | /mnt/Ubuntu-NFS |

2. 取消 NFS 挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 取消单个挂载点
sudo umount /mnt/ARS2-NFS

# 取消所有 NFS 挂载
sudo umount -a -t nfs

# 强制取消挂载(当设备忙时)
sudo umount -f /mnt/ARS2-NFS

# 延迟取消挂载(当设备忙时)
sudo umount -l /mnt/ARS2-NFS

# 查找并终止使用挂载点的进程
sudo fuser -km /mnt/ARS2-NFS

🔍 四、NFS 共享查看与管理

1. 查看 NFS 共享信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看远程服务器的 NFS 共享
sudo showmount -e 10.10.10.254

# 查看本机的 NFS 共享
sudo showmount -e

# 查看已连接本机 NFS 共享的客户端
sudo showmount -a

# 查看NFS服务器状态
nfsstat -s

# 查看RPC服务状态
rpcinfo -p

2. NFS 状态监控

1
2
3
4
5
6
7
8
9
10
11
# 查看 NFS 服务器状态
nfsstat -s

# 查看 NFS 客户端状态
nfsstat -c

# 实时监控 NFS 活动
sudo nfsstat -m

# 监控NFS性能
nfsiostat 5 # 每5秒刷新一次

3. 自动检查 NFS 共享脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 创建检查脚本
cat > ./check_nfs_shares.sh <<'EOF'
#!/bin/bash

# 定义要检查的服务器列表
servers=(
"10.10.10.242"
"10.10.10.252"
"10.10.10.243"
"10.10.10.254"
"10.10.10.251"
"10.10.10.245"
"10.10.10.246"
"10.10.10.247"
)

# 循环检查每个服务器的 NFS 共享
for server in "${servers[@]}"; do
echo "-----------------------"
echo -e "\033[1;31m检查服务器: $server\033[0m"

# 检查服务器是否在线
if ping -c 1 -W 1 "$server" &> /dev/null; then
echo -e "\033[1;32m✓ 服务器在线\033[0m"

# 尝试获取共享列表,设置超时防止长时间等待
timeout 5s showmount -e "$server" 2>/dev/null && \
echo -e "\033[1;32m✓ NFS服务正常\033[0m" || \
echo -e "\033[1;31m✗ NFS服务异常或未运行\033[0m"
else
echo -e "\033[1;31m✗ 服务器离线\033[0m"
fi

echo "-----------------------"
done
EOF

# 赋予脚本执行权限并运行
chmod +x ./check_nfs_shares.sh
./check_nfs_shares.sh

# 添加到定时任务,每小时检查一次
(crontab -l 2>/dev/null; echo "0 * * * * /path/to/check_nfs_shares.sh >> /var/log/nfs_check.log") | crontab -

⚙️ 五、高级配置与优化

1. NFS 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 编辑 /etc/nfs.conf 文件进行高级配置
sudo tee -a /etc/nfs.conf <<'EOF'
[nfsd]
threads=16
host=
port=
vers4=y
vers4.0=y
vers4.1=y
vers4.2=y

[mountd]
manage-gids=y
host=
port=

[statd]
state-directory-path=/var/lib/nfs/statd

[nfsdcld]
storage-directory=/var/lib/nfs/nfsdcld

[exportd]
debug=0

EOF

# 调整内核参数优化NFS性能
sudo tee -a /etc/sysctl.conf <<'EOF'
# NFS 性能优化
sunrpc.tcp_slot_table_entries = 128
sunrpc.udp_slot_table_entries = 128
fs.nfs.nfs_congestion_kbps = 125000
EOF

# 应用内核参数
sudo sysctl -p

# 重启 NFS 服务使配置生效
sudo systemctl restart nfs-kernel-server

2. 防火墙配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 允许 NFS 相关端口通过防火墙
sudo ufw allow from 10.10.10.0/24 to any port nfs
sudo ufw allow from 10.10.10.0/24 to any port mountd
sudo ufw allow from 10.10.10.0/24 to any port nlockmgr

# 或者固定NFS端口并开放
sudo tee -a /etc/sysctl.conf <<'EOF'
fs.nfs.nfs_callback_port = 8765
fs.nfs.nlm_udpport = 8766
fs.nfs.nlm_tcpport = 8767
EOF

# 查看防火墙状态
sudo ufw status

# 查看NFS使用的端口
rpcinfo -p

3. 自动挂载 (autofs) 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装 autofs
sudo apt install autofs -y

# 配置 autofs
sudo tee /etc/auto.master <<'EOF'
/mnt/nfs /etc/auto.nfs --timeout=300 --ghost
EOF

# 创建 NFS 自动挂载配置
sudo tee /etc/auto.nfs <<'EOF'
ars2 -fstype=nfs,rw,hard,intr,timeo=300,retrans=3 10.10.10.251:/mnt/mydisk
pve -fstype=nfs,rw,hard,intr,timeo=300,retrans=3 10.10.10.254:/mnt/ntfs
debian -fstype=nfs,rw,hard,intr,timeo=300,retrans=3 10.10.10.247:/mnt/mydisk
EOF

# 重启 autofs 服务
sudo systemctl restart autofs

# 测试自动挂载
ls /mnt/nfs/ars2

🔒 六、安全注意事项

1. 限制 NFS 访问权限

1
2
3
4
5
6
7
8
9
10
11
# 只允许特定 IP 段访问 NFS 共享
sudo tee /etc/exports <<'EOF'
/mnt/mydisk 10.10.10.0/24(rw,sync,no_subtree_check,no_root_squash)
/mnt/secure 10.10.20.5(ro,sync,no_subtree_check) 10.10.20.6(ro,sync,no_subtree_check)
EOF

# 重新加载配置
sudo exportfs -r

# 查看当前导出配置
sudo exportfs -v

2. 使用更安全的 NFSv4

1
2
3
4
5
6
7
8
9
10
# 在 /etc/fstab 中使用 NFSv4
sudo tee -a /etc/fstab <<'EOF'
10.10.10.251:/mnt/mydisk /mnt/ARS2-NFS nfs4 rw,hard,intr,timeo=300,retrans=3,nofail,x-systemd.device-timeout=15s,sec=krb5p 0 0
EOF

# 配置NFS服务器只使用NFSv4
sudo sed -i 's/^RPCNFSDOPTS=".*"$/RPCNFSDOPTS="-N 2 -N 3 -V 4.2"/' /etc/default/nfs-kernel-server

# 重启NFS服务
sudo systemctl restart nfs-kernel-server

3. 定期检查 NFS 安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查 NFS 共享权限
sudo showmount -e

# 检查谁在访问 NFS 共享
sudo showmount -a

# 检查 NFS 日志
sudo tail -f /var/log/syslog | grep nfs

# 检查不安全的导出配置
sudo exports -v | grep -E '(insecure|no_root_squash)'

# 安全扫描NFS服务
sudo nmap -sV -p 111,2049,20048 --script nfs* 10.10.10.251

4. 使用Kerberos认证(高级)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装Kerberos客户端
sudo apt install krb5-user libpam-krb5 -y

# 配置/etc/krb5.conf
sudo cp /etc/krb5.conf /etc/krb5.conf.backup
sudo editor /etc/krb5.conf

# 配置NFS使用Kerberos
sudo sed -i 's/^SECURE_NFS=.*/SECURE_NFS="yes"/' /etc/default/nfs-common

# 获取Kerberos票据
kinit nfs/$(hostname -f)

# 检查票据
klist

# 重启NFS服务
sudo systemctl restart nfs-common nfs-kernel-server

🐛 七、故障排除

1. 常见问题解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 如果挂载失败,检查网络连通性
ping -c 3 10.10.10.251

# 检查 NFS 服务是否运行
sudo systemctl status nfs-kernel-server

# 检查防火墙设置
sudo ufw status

# 查看详细的错误信息
dmesg | grep nfs

# 检查RPC服务状态
rpcinfo -p

# 检查端口是否开放
sudo netstat -tulnp | grep -E '(2049|111|20048)'

# 强制重新注册RPC服务
sudo rpcbind -w
sudo systemctl restart nfs-common

2. 强制重新挂载

1
2
3
4
5
6
7
8
9
# 强制重新挂载所有 NFS 共享
sudo umount -a -t nfs
sudo mount -a

# 检查挂载结果
mount | grep nfs

# 如果挂载仍然失败,检查服务器端配置
ssh nfs-server "sudo exportfs -v"

3. 清除 NFS 缓存

1
2
3
4
5
6
7
8
9
10
11
# 清除 NFS 客户端缓存
sudo /etc/init.d/nfs-common restart

# 清除 NFS 服务器缓存
sudo /etc/init.d/nfs-kernel-server restart

# 清除RPC缓存
sudo rpcbind -w

# 清除DNS缓存(如果使用主机名)
sudo systemd-resolve --flush-caches

4. 日志分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看系统日志中的NFS相关条目
sudo journalctl -u nfs-kernel-server -f
sudo journalctl -u nfs-common -f

# 查看详细的NFS调试信息
sudo cat /proc/fs/nfsd/versions
sudo cat /proc/fs/nfsd/pool_stats

# 启用NFS调试日志
echo 32767 > /proc/sys/sunrpc/nfsd_debug
echo 32767 > /proc/sys/sunrpc/nfs_debug

# 监控NFS操作
sudo nfsstat -m

📊 总结

通过本指南,你已经学会了在 Ubuntu 系统上配置和管理 NFS 共享的完整流程:

  1. NFS 服务器配置:设置共享目录和访问权限
  2. NFS 客户端配置:临时和永久挂载远程共享
  3. 挂载管理:查看、取消和监控 NFS 挂载
  4. 高级配置:性能优化和安全设置
  5. 故障排除:解决常见的 NFS 连接问题

🎯 最佳实践总结

  1. 版本选择:尽可能使用 NFSv4,它更安全且功能更丰富
  2. 安全配置:限制访问IP范围,避免使用 no_root_squash
  3. 性能优化:根据网络条件调整超时和重传参数
  4. 监控日志:定期检查NFS日志,及时发现和解决问题
  5. 备份配置:定期备份 /etc/exports 和 /etc/fstab 文件

📚 扩展资源

💡 提示:在生产环境中,建议使用更安全的 NFSv4 协议,并限制只有可信的 IP 地址可以访问 NFS 共享。定期检查 NFS 日志和权限设置,确保系统安全。

🌐 现在你可以轻松地在多个服务器之间共享文件了!如果有任何问题,欢迎查阅上述资源或在社区寻求帮助。