ACL mask是命名用户/组ACL条目的生效上限,通过按位与运算(ACL条目权限 & mask)决定实际有效权限,仅约束扩展条目和group::,不影响user::和other::,是POSIX ACL兼容性必需字段。

ACL 掩码(mask)不是“额外权限”,而是所有命名用户/组 ACL 条目的生效上限。它不决定谁有权限,而是决定已设置的权限中哪些位真正起作用。
mask 是怎么裁决有效权限的
实际生效权限 = ACL 条目所设权限 & mask 权限(按位与运算)。只要某权限位在 mask 中为 0,该位即使在 user:xxx 或 group:xxx 条目里设为 1,也会被清零。
- 例如:user:jenkins:rwx,但 mask::r-- → 实际效果是 user:jenkins:r--(w 和 x 被 mask 截断)
- 再如:group:devs:rw-,mask::r-x → 实际效果是 group:devs:r--(w 被屏蔽,x 因原条目未设也不出现)
- 注意:mask 不影响属主(user::)和其他人(other::),只约束扩展条目(user:xxx、group:xxx)和组权限位(group::)
为什么必须有 mask 这个字段
Linux 传统权限模型只预留了“组权限”这一字段(即 ls -l 中第二组 rwx)。而 ACL 允许添加多个用户/组条目,系统必须把它们的权限“收敛”到这个字段上,才能兼容旧工具和内核权限检查逻辑。
- mask 就是这个收敛结果:它取所有命名用户/组条目权限的按位或,再与当前 group:: 权限对齐
- 没有 mask,系统无法安全表达“user:A:rwx, group:B:r--”这种混合状态——因为 group 权限位只能存一个值
- 所以 mask 是 POSIX ACL 兼容性的技术必需,不是可选项
哪些操作会悄悄改掉 mask
mask 是动态计算的,很多日常命令会触发重算,运维中容易忽略其副作用:
-
chmod g+rwx dir:提升组权限位,通常导致 mask 升为 rwx -
setfacl -m u:alice:rx file:若新权限超出当前 mask,系统默认自动提升 mask(除非加-n) -
setfacl -x u:bob file:删除条目后,mask 可能收缩,但行为不保证,不建议依赖 - 最稳妥做法:每次增删 ACL 后,用
getfacl检查是否出现#effective:...;如有,立即setfacl -m m::rwx(按需调整)显式重设
和 umask 的关键区别
别把 mask 和 shell 的 umask 混为一谈:
- umask 是进程级掩码,只影响新创建文件的初始权限(比如 touch、mkdir 默认权限减去 umask)
- mask 是文件/目录自身的 ACL 属性,属于 inode 元数据,只对已有 ACL 条目做运行时限制,不参与创建过程
- umask 由用户环境控制(如 ~/.bashrc),mask 必须用
setfacl -m m::...显式管理


















