acl掩码(mask)是决定非属主/非other acl条目能否生效的硬性上限;它自动重算,取所有acl权限位的最大值,若某acl后显示#effective:r--而设为rwx,说明mask已截断权限。

ACL 掩码(mask)不是可有可无的“装饰项”,而是决定非属主、非 other 的 ACL 条目能否真正生效的硬性上限。当特定用户明明被 setfacl 显式授权了 rwx,却仍提示 Permission denied,十有八九是 mask 在背后悄悄截断了权限。
确认 mask 是否正在起作用
运行 getfacl /path/to/file,重点看两处:
- mask::xxx 行:这是当前生效的掩码值
- 每个非属主/非 other 的 ACL 条目(如 user:alice:rwx 或 group:dev:r-x)后面是否带 #effective:...
如果某条 ACL 后面写着 #effective:r--,而你给的是 rwx,说明 mask 已经把它压低了——实际生效的只有 r--。
理解 mask 的计算逻辑
mask 不是手动设出来的固定值,它会随 chmod 和 setfacl 自动重算,规则是:
- mask 值 = 所有 user::、group::、group:xxx、user:xxx 等 ACL 权限位中,对应位置(r/w/x)的“最大值”按位或结果
- 例如:user:alice:rwx + group:dev:r-x → mask 至少为 rwx;但若执行了 chmod 644 file,属组权限从 r-x 变成 r--,mask 就可能被重算为 rw-
- 一旦 mask 收紧,所有扩展 ACL 都会被“与”运算过滤,超出部分直接失效
快速修复 mask 覆盖问题
不要只改用户权限,必须同步确保 mask 覆盖所需权限:
- 显式提升 mask:setfacl -m m::rwx /path/to/file
- 或一步到位(推荐):setfacl -m u:alice:rwx,g:dev:rwx /path/to/file —— setfacl 会自动把 mask 扩展到能容纳这些权限的最小值
- 检查默认 ACL 的 mask(对目录):getfacl /dir | grep "default:.*mask",若缺失或过窄,用 setfacl -d -m m::rwx /dir 补上
避免 mask 意外被覆盖的实践
以下操作会触发 mask 重算,需格外注意:
- 对文件执行 chmod g-w 或 chmod o+r 等修改组/其他位的操作
- 在启用了默认 ACL 的目录下新建文件,但父目录的 default:mask 过窄
- 用 rsync -a 复制带 ACL 的文件时未加 --acls 参数,导致 ACL 丢失、mask 失效
排查时优先比对 getfacl 输出中的 effective 字段,它比“写了什么”更能说明“实际能用什么”。











