acl mask是决定非属主/非other的acl权限能否生效的硬性上限,它通过按位与运算限制扩展acl条目(如user:xxx、group:xxx)的实际权限,并确保posix兼容性;其值会随chmod或setfacl操作自动重算,且不可与umask混淆——后者是进程级创建文件时的默认权限掩码。

ACL mask 不是“可有可无”的附加项,而是决定非属主、非other权限能否真正生效的硬性上限。它像一道闸门,所有用户/组的ACL权限都必须经过它“过滤”后才起作用。
mask 为什么必须存在
Linux ACL 允许为多个用户和组单独设权限,但传统文件权限模型只预留了“组权限”这一字段来反映群体访问能力。mask 的作用,就是把所有扩展ACL条目(user:xxx、group:xxx等)的有效权限统一映射到这个字段上,保证POSIX兼容性与权限计算一致性。
- 没有 mask,系统无法安全地表达“user:A:rwx, group:B:r--”这种混合状态——因为 group 权限位只能存一个值
- mask 不限制属主(user::)和其他人(other::),只约束扩展条目和组权限(group::)
- 实际权限 = 设置权限 & mask 权限(按位与)
哪些操作会自动修改 mask
mask 并非静态配置,很多常见命令会触发它的重算:
- chmod 修改组权限位:如 chmod g+w dir → mask 可能升为 rwx;chmod g-w dir → mask 可能降为 r-x
- setfacl -m 添加新用户/组权限:若新增权限超出当前 mask,系统默认提升 mask 以覆盖(除非加 -n 参数)
- setfacl -x 删除某条ACL:可能使 mask 自动收缩,但行为不保证,建议显式重设
典型失效场景与修复方式
权限设了却没效果?十有八九是 mask 在“卡脖子”:
- getfacl 查看输出中出现 #effective:r-- 字样 → 表明该条ACL被 mask 截断,例如 user:jenkins:rwx #effective:r-- 就说明 mask 当前是 r--
- 新建文件后 getfacl 发现 default 条目存在,但新文件里对应 user:xxx 权限显示 #effective:--- → 默认ACL已生效,但 mask 过严,导致继承来的权限无效
- 修复方法统一:setfacl -m m::rwx /path(根据需要填 rwx/rw-/r-x 等),确保 mask 覆盖所有已设ACL的实际需求
和 umask 的本质区别
别把 mask 和 shell 的 umask 混淆:
- umask 是进程级掩码,影响新创建文件的初始权限(如 umask 002 → 新文件默认 664)
- mask 是文件/目录级属性,属于ACL结构的一部分,只对已有ACL条目做运行时限制,不参与文件创建过程
- umask 由用户环境控制,mask 由管理员通过 setfacl 显式管理











