NFS(Network File System)是Linux系统管理中常用的网络文件共享协议,广泛应用于IDC数据中心的存储集群搭建和服务器运维场景。通过NFS,多台服务器可以共享同一个存储后端,实现文件级别的数据统一管理。本文从实际运维角度出发,给出NFS服务端配置、客户端挂载、权限控制和性能调优的完整方案。
NFS服务端安装与共享目录配置
NFS服务端需要安装nfs-utils软件包,并配置导出目录。以CentOS/RHEL和Ubuntu/Debian为例:
# CentOS/RHEL 安装
yum install -y nfs-utils rpcbind
systemctl enable --now rpcbind
systemctl enable --now nfs-server
# Ubuntu/Debian 安装
apt install -y nfs-kernel-server
systemctl enable --now nfs-kernel-server
# 创建共享目录
mkdir -p /data/shared
chown nfsnobody:nfsnobody /data/shared
chmod 755 /data/shared
配置导出规则是NFS服务端的核心步骤。编辑/etc/exports文件定义共享策略:
# /etc/exports 文件格式
# 共享目录 客户端地址(选项)
# 允许整个内网段读写访问,同步写入,非root用户映射
/data/shared 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
# 允许特定IP只读访问
/data/readonly 10.0.0.100(ro,sync,root_squash)
# 允许所有客户端访问,适合内网测试环境
/data/public *(rw,sync,no_root_squash)
导出选项说明:
# rw 读写权限
# ro 只读权限
# sync 同步写入,数据实时落盘,保证一致性但性能略低
# async 异步写入,先写缓存再落盘,性能高但断电可能丢数据
# no_root_squash root用户不被映射为匿名用户,保留root权限
# root_squash root用户映射为nfsnobody,安全性更高
# no_subtree_check 不检查子目录权限,提升性能
# all_squash 所有用户映射为匿名用户
# anonuid/anongid 指定匿名用户UID/GID
生效导出配置并验证:
# 重新加载导出表
exportfs -arv
# 查看当前导出状态
exportfs -v
# 检查NFS服务监听端口
ss -tlnp | grep -E "rpcbind|nfs"
# 确认RPC服务注册正常
rpcinfo -p localhost
防火墙与SELinux策略配置
NFS依赖多个RPC服务端口,防火墙需开放相关端口。NFSv4相比v3简化了端口管理,推荐使用NFSv4:
# firewalld 防火墙规则(NFSv4)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
# 或直接开放端口
firewall-cmd --permanent --add-port=2049/tcp # NFS
firewall-cmd --permanent --add-port=111/tcp # rpcbind
firewall-cmd --permanent --add-port=20048/tcp # mountd
firewall-cmd --reload
NFSv4固定监听2049端口,如果使用NFSv3需要配置固定端口以简化防火墙管理:
# /etc/sysconfig/nfs 固定NFSv3端口
MOUNTD_PORT=20048
STATD_PORT=20049
LOCKD_TCPPORT=20050
LOCKD_UDPPORT=20050
RQUOTAD_PORT=20051
systemctl restart nfs-server
SELinux环境下需要调整安全上下文:
# 查看SELinux状态
getenforce
# 临时设为宽容模式用于排查问题
setenforce 0
# 设置NFS共享目录SELinux标签
semanage fcontext -a -t nfsd_rw_t "/data/shared(/.*)?"
restorecon -Rv /data/shared
# 允许NFS写入
setsebool -P nfs_export_all_rw on
setsebool -P nfs_export_all_ro on
NFS客户端挂载与开机自动挂载
客户端安装nfs-utils后即可挂载NFS共享目录:
# 安装客户端工具
yum install -y nfs-utils # CentOS
apt install -y nfs-common # Ubuntu
# 查看服务端可挂载的共享列表
showmount -e 192.168.1.100
# 手动挂载
mount -t nfs4 192.168.1.100:/data/shared /mnt/nfs
# 验证挂载状态
df -h /mnt/nfs
mount | grep nfs
生产环境中应配置开机自动挂载。推荐使用systemd automount而非/etc/fstab,避免网络未就绪时导致启动卡住:
# /etc/fstab 方式(传统)
192.168.1.100:/data/shared /mnt/nfs nfs4 rw,hard,timeo=600,retrans=2,_netdev 0 0
# systemd automount 方式(推荐)
# 创建 /etc/systemd/system/mnt-nfs.mount
cat > /etc/systemd/system/mnt-nfs.mount << 'EOF'
[Unit]
Description=NFS Mount
Requires=network-online.target
After=network-online.target
[Mount]
What=192.168.1.100:/data/shared
Where=/mnt/nfs
Type=nfs4
Options=rw,hard,timeo=600,retrans=2,noatime
TimeoutSec=30
[Install]
WantedBy=multi-user.target
EOF
# 创建 /etc/systemd/system/mnt-nfs.automount
cat > /etc/systemd/system/mnt-nfs.automount << 'EOF'
[Unit]
Description=NFS Automount
[Automount]
Where=/mnt/nfs
TimeoutIdleSec=300
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mnt-nfs.automount
挂载参数详解:
# hard 硬挂载,网络中断时进程阻塞等待恢复(生产环境推荐)
# soft 软挂载,超时后返回I/O错误(可能导致数据损坏)
# timeo=600 超时时间,单位0.1秒(600=60秒)
# retrans=2 重试次数
# noatime 不更新文件访问时间,减少写操作
# rsize/wsize 读写块大小,建议32768或1048576
# sec=sys 安全模式,krb5i为加密认证
NFS权限管理与用户映射机制
NFS的权限控制基于UID/GID映射,这是服务器故障排查中的高频问题点。理解映射机制对正确配置共享权限至关重要。
# 查看文件的实际属主
ls -ln /mnt/nfs/testfile
# 输出示例: -rw-r--r-- 1 1000 1000 0 Aug 20 10:00 testfile
# UID=1000 GID=1000
# 服务端对应用户
cat /etc/passwd | grep 1000
# user1:x:1000:1000::/home/user1:/bin/bash
# 客户端对应用户可能不同
cat /etc/passwd | grep 1000
# dev:x:1000:1000::/home/dev:/bin/bash
当客户端和服务端UID不一致时,需要使用idmapd进行名称映射(NFSv4),或统一UID/GID分配策略:
# NFSv4 idmapd配置
# /etc/idmapd.conf
[General]
Domain = example.com
[Translation]
Method = nsswitch
# 启动idmapd服务
systemctl enable --now nfs-idmapd
# 使用all_squash统一权限(简单粗暴方案)
# /etc/exports
/data/shared 192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
# 所有客户端用户映射为UID=1000 GID=1000
NFS性能调优与监控方案
共享存储的性能直接影响服务器故障排查的效率。通过调整读写块大小和并发参数可以显著提升吞吐:
# 挂载时指定大块读写
mount -t nfs4 -o rw,rsize=1048576,wsize=1048576,hard,timeo=600 192.168.1.100:/data/shared /mnt/nfs
# 内核NFS调优
# /etc/sysctl.conf
sunrpc.tcp_slot_table_entries=128
sunrpc.tcp_max_slot_table_entries=128
net.core.rmem_max=16777216
net.core.wmem_max=16777216
sysctl -p
# 使用nfsstat监控NFS请求统计
nfsstat -c # 客户端统计
nfsstat -s # 服务端统计
# 关注关键指标
# retrans 重传次数,过高说明网络不稳定
# timeout 超时次数
# read/write操作比例
使用nfsiostat监控I/O性能:
# 安装sysstat包后可用
nfsiostat /mnt/nfs 2
# 输出字段:
# ops/s 每秒操作数
# rpc bklog RPC积压队列长度
# rt/exe 平均RTT/执行时间(ms)
# kB/s 传输速率
# I/O基准测试
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=1024 oflag=direct
dd if=/mnt/nfs/testfile of=/dev/null bs=1M count=1024 iflag=direct
NFS高可用与故障排查实战
在服务器安全加固层面,NFS的故障排查需关注网络层、RPC层和文件系统层三个维度:
# 层级排查清单
# 1. 网络连通性
ping 192.168.1.100
telnet 192.168.1.100 2049
# 2. RPC注册状态
rpcinfo -p 192.168.1.100
# 应看到nfs(100003)和mountd(100005)注册
# 3. 导出权限检查
showmount -e 192.168.1.100
# 如果显示空,检查/etc/exports和exportfs -arv
# 4. 客户端挂载调试
mount -t nfs4 -v 192.168.1.100:/data/shared /mnt/nfs
# -v 参数输出详细协商过程
# 5. 日志排查
journalctl -u nfs-server --since "10 min ago" # 服务端
journalctl -u nfs-mount --since "10 min ago" # 客户端
tail -f /var/log/messages | grep nfs
对于NFS高可用场景,推荐使用NFSv4.1的pNFS(Parallel NFS)或多路径挂载配合Keepalived实现VIP漂移,保障存储服务的连续性。算力资源规划时需评估NFS带宽是否满足并发I/O需求,必要时采用分布式文件系统(如CephFS、GlusterFS)作为扩展方案。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-nfs-wang-luo-wen-jian-xi-tong-gong-xiang-cun/