NFS(Network File System)是Linux环境中常用的网络共享文件系统协议,广泛应用于集群节点间配置同步、日志集中存储及容器持久化卷等场景。本文围绕NFSv4在CentOS/Ubuntu环境下的服务端配置、客户端挂载、权限映射及性能调优展开,提供可直接复用的配置模板和故障排查方法。
NFS服务端安装与共享目录配置
CentOS/RHEL环境安装NFS服务端:
# 安装NFS服务端包
yum install -y nfs-utils
# Ubuntu/Debian环境
apt install -y nfs-kernel-server
# 启动NFS服务并设置开机自启
systemctl enable --now nfs-server
systemctl status nfs-server
# 验证NFS版本支持
cat /proc/fs/nfsd/versions
# 输出应包含 +4.2 +4.1 +4.0
# 确认rpcbind服务运行
systemctl enable --now rpcbind
rpcinfo -p localhost | grep nfs
创建共享目录并配置导出策略:
# 创建共享目录
mkdir -p /data/shared/webroot
mkdir -p /data/shared/logs
mkdir -p /data/shared/backups
# 设置目录基础权限
chmod 755 /data/shared/webroot
chmod 770 /data/shared/logs
# 编辑NFS导出配置
cat > /etc/exports << 'EOF'
# 格式: 共享目录 客户端IP(选项)
# 通用共享 - 同网段只读
/data/shared/webroot 192.168.1.0/24(ro,sync,root_squash,no_subtree_check)
# 日志目录 - 指定节点读写
/data/shared/logs 192.168.1.101(rw,sync,no_root_squash,no_subtree_check) 192.168.1.102(rw,sync,no_root_squash,no_subtree_check)
# 备份目录 - 单节点写入
/data/shared/backups 192.168.1.200(rw,sync,root_squash,no_subtree_check,anonuid=1000,anongid=1000)
EOF
# 应用导出配置
exportfs -rav
# 验证导出状态
exportfs -v
# 输出示例:
# /data/shared/webroot 192.168.1.0/24(sync,ro,root_squash,no_subtree_check)
关键导出选项说明:
选项 说明
─────────────────────────────────────────
ro / rw 只读 / 读写
sync / async 同步写入 / 异步写入(性能高但有数据风险)
root_squash 将root用户映射为匿名用户(安全推荐)
no_root_squash 保留root权限(谨慎使用)
no_subtree_check 跳过子树检查(提升性能)
anonuid/anongid 匿名用户映射的UID/GID
sec=sys 使用UID/GID进行安全认证
sec=krb5 使用Kerberos认证
NFS客户端挂载与自动挂载配置
客户端安装与手动挂载:
# 客户端安装NFS工具
yum install -y nfs-utils # CentOS
apt install -y nfs-common # Ubuntu
# 创建挂载点
mkdir -p /mnt/nfs/webroot
mkdir -p /mnt/nfs/logs
# 查看服务端导出列表
showmount -e 192.168.1.10
# 输出:
# Export list for 192.168.1.10:
# /data/shared/webroot 192.168.1.0/24
# /data/shared/logs 192.168.1.101
# 手动挂载
mount -t nfs4 -o rw,hard,timeo=600,retrans=2 192.168.1.10:/data/shared/webroot /mnt/nfs/webroot
mount -t nfs4 -o rw,hard,timeo=600,retrans=2,noacl 192.168.1.10:/data/shared/logs /mnt/nfs/logs
# 验证挂载
mount | grep nfs
df -hT /mnt/nfs/webroot
配置开机自动挂载(使用/etc/fstab):
# 追加NFS挂载项到fstab
cat >> /etc/fstab << 'EOF'
# NFS挂载配置
# 格式: server:/export/path /mount/point nfs4 options 0 0
192.168.1.10:/data/shared/webroot /mnt/nfs/webroot nfs4 rw,hard,timeo=600,retrans=2,_netdev 0 0
192.168.1.10:/data/shared/logs /mnt/nfs/logs nfs4 rw,hard,timeo=600,retrans=2,_netdev 0 0
EOF
# 测试fstab配置(不实际挂载)
mount -a -t nfs4 -v
# 使用systemd automount实现按需挂载(推荐)
cat > /etc/systemd/system/mnt-nfs-webroot.mount << 'EOF'
[Unit]
Description=NFS Mount for Web Root
After=network-online.target
Wants=network-online.target
[Mount]
What=192.168.1.10:/data/shared/webroot
Where=/mnt/nfs/webroot
Type=nfs4
Options=rw,hard,timeo=600,retrans=2
[Install]
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/mnt-nfs-webroot.automount << 'EOF'
[Unit]
Description=NFS Auto Mount for Web Root
After=network-online.target
Wants=network-online.target
[Automount]
Where=/mnt/nfs/webroot
TimeoutIdleSec=300
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mnt-nfs-webroot.automount
NFS权限映射与用户ID同步方案
NFS基于UID/GID进行权限验证,当服务端与客户端的用户ID不一致时会出现权限混乱:
# 服务端查看共享目录所有者
ls -ln /data/shared/webroot
# drwxr-xr-x 1000 1000 /data/shared/webroot
# 客户端挂载后查看(UID 1000可能映射到不同用户)
ls -ln /mnt/nfs/webroot
# 如果客户端UID 1000对应不同用户,权限可能不正确
# 方案一:统一UID/GID(推荐)
# 在所有节点创建相同UID的用户
groupadd -g 1000 webapp
useradd -u 1000 -g 1000 -s /sbin/nologin webapp
# 方案二:使用NFSv4 ID映射域(跨域环境)
# 服务端配置
cat > /etc/idmapd.conf << 'EOF'
[General]
Domain = internal.yunthe.com
[Mapping]
Nobody-User = nobody
Nobody-Group = nobody
[Translation]
Method = nsswitch
EOF
systemctl restart nfs-idmapd
# 客户端同样配置相同Domain
cat > /etc/idmapd.conf << 'EOF'
[General]
Domain = internal.yunthe.com
EOF
systemctl restart nfs-idmapd
# 清除ID映射缓存
nfsidmap -c
NFSv4安全认证与Kerberos配置
NFSv4支持Kerberos强认证,提供更高的安全性:
# 前提:已部署KDC(如FreeIPA或MIT Kerberos)
# 服务端配置Kerberos认证导出
cat > /etc/exports << 'EOF'
/data/shared/webroot 192.168.1.0/24(rw,sync,sec=krb5p,no_subtree_check)
# sec选项:
# sec=sys - 传统UID认证(默认)
# sec=krb5 - Kerberos认证
# sec=krb5i - Kerberos认证+完整性校验
# sec=krb5p - Kerberos认证+数据加密(最安全)
EOF
exportfs -rav
# 客户端获取Kerberos票据并挂载
kinit admin@INTERNAL.YUNTHE.COM
mount -t nfs4 -o sec=krb5p 192.168.1.10:/data/shared/webroot /mnt/nfs/webroot
# 验证安全模式
mount | grep nfs4
# 应显示 sec=krb5p
NFS性能调优参数与网络优化
# 挂载性能优化选项
mount -t nfs4 -o \
rw,hard,\
rsize=1048576,wsize=1048576,\
timeo=600,retrans=2,\
noatime,nodiratime,\
actimeo=60,\
vers=4.2\
192.168.1.10:/data/shared/webroot /mnt/nfs/webroot
# 关键参数说明:
# rsize/wsize 读写块大小(NFSv4最大1MB)
# timeo 超时时间(单位0.1秒,600=60秒)
# retrans 重传次数
# noatime 不更新访问时间(减少IO)
# actimeo 属性缓存超时(秒)
# hard 硬挂载(IO失败后重试,不返回错误)
# vers=4.2 使用NFSv4.2(支持服务器端拷贝)
# 服务端性能调优
cat >> /etc/sysctl.conf << 'EOF'
# NFS服务端网络缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# NFS服务端线程数
# 修改 /etc/nfs.conf 或 /etc/sysconfig/nfs
# RPCNFSDCOUNT=64
EOF
sysctl -p
# 调整NFS服务端线程数
sed -i 's/^#RPCNFSDCOUNT=.*/RPCNFSDCOUNT=64/' /etc/nfs.conf
systemctl restart nfs-server
# 监控NFS性能
nfsstat -s # 服务端统计
nfsstat -c # 客户端统计
mountstats /mnt/nfs/webroot # 详细挂载统计
NFS故障排查与常见问题处理
1. 挂载超时或拒绝连接
# 检查服务端防火墙
firewall-cmd --list-services | grep nfs
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
# 检查RPC服务状态
rpcinfo -p 192.168.1.10
# 检查导出权限
showmount -e 192.168.1.10
# 日志排查
journalctl -u nfs-server -u rpcbind --since "10 min ago"
tail -f /var/log/messages | grep nfs
2. "Stale file handle"错误
# 服务端重启或导出配置变更后客户端出现此错误
# 解决方案:卸载后重新挂载
umount -lf /mnt/nfs/webroot
mount -t nfs4 192.168.1.10:/data/shared/webroot /mnt/nfs/webroot
# 如果umount卡住,强制懒卸载
umount -l /mnt/nfs/webroot
3. 文件锁争用与性能下降
# NFSv4默认使用网络锁管理器(NLM)
# 高并发场景下禁用NLM锁,使用本地锁
mount -t nfs4 -o nolock 192.168.1.10:/data/shared/webroot /mnt/nfs/webroot
# 检查锁状态
cat /proc/fs/nfsd/clients/*/state
4. 权限问题排查清单
# 1. 确认服务端目录权限
ls -ld /data/shared/webroot
# 2. 确认导出选项中的root_squash设置
cat /etc/exports | grep webroot
# 3. 确认客户端和服务端UID映射
id webapp # 两端应返回相同UID
# 4. NFSv4检查ID映射
nfsidmap -l # 查看映射缓存
nfsidmap -c # 清除缓存
# 5. 使用nfs4_getfacl查看ACL
nfs4_getfacl /mnt/nfs/webroot/test.txt
NFS在中小规模集群共享存储场景中配置简单、性能可靠。对于更高性能要求的场景,可结合万兆网络和SSD存储将吞吐量提升至GB/s级别;对于跨数据中心场景,建议使用NFSv4.2配合Kerberos保障数据安全,或考虑切换至GlusterFS等分布式文件系统。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nfs-wang-luo-wen-jian-xi-tong-gong-xiang-cun/