nfs服务端acl生效需协同配置导出层(/etc/exports)与文件系统acl:ext4需挂载含acl选项,xfs默认支持;导出须禁用no_root_squash并启用root_squash;再通过setfacl设置用户/组权限及默认acl,配合nfs4协议挂载并禁用属性缓存。

在 NFS 共享存储中配置并生效服务端 ACL 权限,核心在于两层控制:**NFS 导出层权限(/etc/exports)** 和 **底层文件系统 ACL(POSIX 或 NFSv4 ACL)**。二者必须协同,缺一不可。单纯改 exports 不影响文件级细粒度权限;只设文件 ACL 而不开放对应客户端访问,也会被 NFS 层拦截。
确保底层文件系统支持并启用 ACL
ACL 权限最终由挂载的本地文件系统承载,不是 NFS 协议本身实现的:
-
ext3/ext4 文件系统:默认支持 ACL,但需确认挂载时启用了
acl选项。检查命令:mount | grep " /path/to/export ",输出中应含acl。若无,临时启用:sudo mount -o remount,acl /path/to/export;永久生效需修改/etc/fstab对应行,追加,acl到挂载参数中。 -
XFS 文件系统:CentOS/RHEL 7+ 默认启用 ACL,无需额外操作。可运行
xfs_info /mount/point确认输出含attr2,inode64,quota等字段,ACL 已就绪。 - 验证 ACL 工具可用:
getfacl --version和setfacl --version应正常返回版本号。
正确配置 NFS 服务端导出权限
/etc/exports 中的选项决定客户端能否连上、以什么身份访问,直接影响 ACL 是否有机会生效:
- 避免使用
no_root_squash(除非绝对必要),它会让 root 用户绕过所有 ACL 检查,导致 ACL 失效。推荐保持默认root_squash。 - 若需保留客户端 UID/GID 映射(使 setfacl 设置的用户/组权限真正匹配),确保
no_all_squash或显式设置anonuid/anongid与目标用户一致;同时保证服务端和客户端用户 ID 一致,或通过rpc.idmapd正确映射(尤其在 LDAP 环境下)。 - 导出时至少赋予
rw和sync(保障一致性),例如:/data/shared 192.168.10.0/24(rw,sync,root_squash,no_subtree_check) - 配置后务必重载导出表:
sudo exportfs -ra,再用showmount -e localhost验证共享已生效。
在共享目录上设置并验证文件级 ACL
ACL 是施加在服务端本地文件系统上的,对所有挂载该共享的客户端统一生效:
- 给特定用户授权:
sudo setfacl -m u:alice:rwx /data/shared/project - 给特定组授权:
sudo setfacl -m g:devteam:rx /data/shared/docs - 设置默认 ACL(新创建文件自动继承):
sudo setfacl -d -m g:devteam:rwx /data/shared/project - 查看效果:
getfacl /data/shared/project—— 输出中应清晰列出user:alice、group:devteam及mask行;mask必须包含你授予的权限位,否则实际不生效(例如 mask 是 r--,即使给了 u:alice:rwx,实际也只读)。
客户端挂载需兼容 ACL 语义
服务端配好了,客户端挂载方式也得配合:
- 使用 NFSv4 协议挂载(推荐):
sudo mount -t nfs4 server:/data/shared /mnt/nfs。NFSv4 原生理解 ACL 语义,nfs4_getfacl/nfs4_setfacl工具可直接操作。 - 若用 NFSv3,ACL 仅作为扩展属性存在,客户端需安装
nfs4-acl-tools并用getfacl/setfacl查看/设置,但部分权限可能降级为 POSIX 模拟行为。 - 挂载选项建议加上
noac(关闭属性缓存)或actimeo=1,避免因缓存导致 ACL 修改延迟可见。











