3.9.2 NFS共享配置与权限控制
NFS(Network File System)用于在网络中共享目录与文件,服务端导出目录,客户端通过挂载访问。运维重点是导出配置、权限模型与故障定位。
原理草图(NFS共享与权限流向)
1)服务端安装与基础配置
- 安装与启动(以 RHEL/CentOS 为例):
# 安装服务端组件
yum -y install nfs-utils rpcbind
# 启动并设置开机自启
systemctl enable --now rpcbind nfs-server
# 验证服务状态
systemctl status nfs-server --no-pager
- 创建共享目录与权限(示例用户/组):
# 规划共享目录与专用用户
groupadd -g 9001 nfsgrp
useradd -u 9001 -g nfsgrp -M -s /sbin/nologin nfsuser
mkdir -p /srv/nfs/data
chown -R nfsuser:nfsgrp /srv/nfs/data
chmod 2770 /srv/nfs/data # 2 代表继承组
2)/etc/exports 配置与命令解释
- 配置文件示例(完整可执行):
cat >/etc/exports <<'EOF'
/srv/nfs/data 10.0.0.0/24(rw,sync,root_squash,no_subtree_check)
/srv/nfs/pub *(ro,async,all_squash,anonuid=65534,anongid=65534)
EOF
# 生效导出
exportfs -r
# 查看生效条目
exportfs -v
- 关键参数说明(与上面示例一致):
rw/ro:读写/只读。sync/async:同步/异步写入。root_squash:客户端 root 映射为匿名用户。all_squash:所有用户映射为匿名用户。anonuid/anongid:匿名用户 UID/GID。no_subtree_check:避免子目录校验性能损耗。
3)客户端挂载与参数含义
- 安装与手动挂载:
yum -y install nfs-utils
# 查看可导出目录
showmount -e 10.0.0.1
# 挂载
mkdir -p /mnt/data
mount -t nfs -o vers=4,hard,timeo=600,retrans=2 10.0.0.1:/srv/nfs/data /mnt/data
- 参数解释:
vers=3/4:指定协议版本。hard/soft:硬/软挂载,硬挂载更可靠。timeo/retrans:超时与重试策略。-
rsize/wsize:读写缓冲大小(性能调优时使用)。 -
持久挂载(/etc/fstab):
cat >>/etc/fstab <<'EOF'
10.0.0.1:/srv/nfs/data /mnt/data nfs vers=4,hard,_netdev,nofail 0 0
EOF
# 验证
mount -a
4)权限与身份映射示例
- UID/GID 一致性检查(服务端与客户端都执行):
# 检查 UID/GID 是否一致
id nfsuser
getent group nfsgrp
- 验证 root_squash 行为:
# 客户端以 root 写入测试
touch /mnt/data/root_test
ls -l /mnt/data/root_test
# 预期:文件属主映射为 nfsnobody 或匿名用户
5)常见故障排查(步骤+命令)
- 导出与网络:
# 服务端检查导出
exportfs -v
showmount -e localhost
# 服务状态
systemctl status nfs-server rpcbind --no-pager
# 防火墙放行(示例)
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
firewall-cmd --reload
- 客户端挂载失败:
# 查看系统日志
journalctl -u nfs-server --no-pager | tail -n 50
journalctl -k --no-pager | tail -n 50
# 重新挂载并输出详细信息
mount -v -t nfs 10.0.0.1:/srv/nfs/data /mnt/data
- 权限异常排查顺序:
1./etc/exports是否匹配客户端网段
2.exportfs -r是否生效
3. 防火墙与 SELinux(必要时执行setenforce 0验证)
4. 目录权限与 UID/GID 是否一致
6)练习题(动手验证)
1. 在服务端创建 /srv/nfs/project,仅允许 10.0.0.0/24 读写,启用 root_squash。
2. 客户端使用 vers=4 挂载并写入文件,验证属主是否被映射。
3. 修改导出为只读,客户端重新挂载后验证写入失败现象,并记录报错信息。
4. 配置 /etc/fstab 持久挂载,重启后确认自动挂载成功。