首页/系统与基础设施/存储速查/NFSv4 ACL 与传统权限位的差异
NAS 与文件共享50 条

NFSv4 ACL 与传统权限位的差异

NFSv4 自带一套细粒度 ACL 模型,表达能力接近 Windows ACL,与传统的 rwx 权限位和 POSIX ACL 并存但语义不同。混淆两套模型是共享目录权限「看着对、实际不对」的常见根源。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​‌‌‌​‌‌​​​‌‌​‌​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

两套权限模型并存

传统 Unix 权限用 9 个位加属主/属组描述,最多再叠加 POSIX ACL 给个别用户开例外;而 NFSv4 协议内生一套 ACL:按主体(用户或组)逐个给允许或拒绝条目,带继承标志,还能做拒绝优先的判定。服务端既要能存这件事(ext4/XFS 上的 nfs4 ACL),客户端也要在挂载时协商到 v4 才能读写到协议层面。实际环境里常常是两套都在,于是产生「用 chmod 改了没效果」或「用 setfacl 加了条目在客户端看不见」的现象。

基本信息

适用平台Linux NFSv4 服务端与客户端
NFSv4 工具nfs4_getfacl、nfs4_setfacl(nfs-utils 提供)
POSIX 工具getfacl、setfacl(acl 包)
前提条件挂载协商为 vers=4.x 且导出未禁用 ACL 支持
要点同一目录上两套 ACL 的实际生效顺序由服务端文件系统实现决定

两套模型对照

维度NFSv4 ACLPOSIX 权限位与 ACL
表达粒度任意主体逐条允许或拒绝属主/属组/其他人三位,ACL 仅做例外
继承方式条目自带继承标志,向下复制目录默认 ACL 影响新建子项
拒绝语义显式拒绝条目优先没有拒绝概念,只能靠位与掩码
命名方式主体可用 user@domain 形式UID/GID 数字或本地名
常见现象chmod 之后结果不直观setfacl 在 v4 客户端可能不可见

两类命令示例

两类命令示例
# 查看 NFSv4 ACL:A 允许、D 拒绝,@ 表示主体是特殊标识
nfs4_getfacl /srv/data
# 给项目组放行读写,并对子目录设置继承
nfs4_setfacl -a A:g:project@example.com:rwx:d:fd:allow /srv/data
# 传统位与 POSIX ACL 的对照查看
getfacl -m g:project:rwx /srv/data && getfacl /srv/data

典型使用场景

  • 跨平台共享目录既服务 Windows 客户端又服务 Linux 客户端,需要一套能表达继承的权限模型
  • 项目目录要求「某个组可写、其他人只读、且新建文件自动继承」,权限位表达不了
  • 排查「服务端看得到权限、客户端看不到」的差异,需要判断当前用的到底是哪套 ACL
  • 已有大量 setfacl 规则的环境引入 NFSv4,需要评估规则是否会被新模型覆盖
只看传统位往往不够:在没有扩展 ACL 的朴素实现里,NFSv4 ACL 会先被压缩成 rwx 位;而支持完整 ACL 的文件系统会保留完整语义。判断办法是对同一路径分别运行 ls -l、getfacl 与 nfs4_getfacl,三者一致说明当前实现只维护位,三者出现差异说明完整的 v4 ACL 在起作用。
不要在共享目录正在被人写入时批量重写 ACL。NFSv4 的拒绝条目一旦覆盖了某个主体的读权限,正在运行的业务进程会立刻收到 Permission denied,而这类故障在客户端侧只表现为应用报错,很容易被判成应用问题。

易错点

  • 在 NFSv4 客户端用 setfacl 改权限,服务端却按自己的实现压缩成位:改动看似成功但不生效,排查时被表象带偏
  • 同时维护 setfacl 规则与 nfs4_setfacl 条目:两套规则叠加后实际结果与任一工具的输出都不一致,必须统一到一套模型
  • 忽略挂载版本:协商到 v3 的客户端读不到 v4 ACL,表现是「同一目录不同主机权限不同」
  • 把拒绝条目写得太宽(例如拒绝整组再逐人放行):新加入的成员一律被拒,需要逐条维护例外
  • 用 chmod 去修正 NFSv4 ACL 造成的权限偏差:在完整实现下 chmod 会改写整个 ACL,前面的条目全部丢失

数据来源与参考

  • RFC 7530《NFS Version 4 Protocol》第6章访问控制模型
  • RFC 8881《NFS Version 4 Minor Version 1》ACL 章节
  • Linux nfs4_acl(5) 手册页

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/storage/nfsv4-acl-versus-posix-mode.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​​‌‌‌​‌‌​​‌​‌​​‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌‌​​‌‌​‌‌‌​‌‌​​​‌‌​‌​​​​‌​‌‌​‌​‌‌​​​​‌​‌‌​​​‌‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌‌​​‌‌​‌‌‌​‌​‌​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌‌‌​​​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​