Linux文件ACL是叠加在传统权限之上的精细控制层,需文件系统挂载时启用acl选项,用setfacl添加、getfacl查看、setfacl -b清除,且受mask限制实际生效权限。

Linux 文件权限本身只管“能不能”,而存储属性(如文件系统挂载选项、目录结构设计)决定了“能不能用上ACL”。两者配合得当,才能真正实现精细控制——不是加了ACL就自动生效,得先让底层支持、再让规则落地。
文件系统必须启用 ACL 支持
ACL 不是内核默认强制开启的功能,它依赖文件系统挂载时的 acl 选项。即使你装了 acl 工具包(apt install acl 或 yum install acl),若挂载参数没包含 acl,setfacl 会静默失败或报错 “Operation not supported”。
- 检查是否启用:
mount | grep "$(df . | tail -1 | awk '{print $1}')" | grep acl - 临时启用:
sudo mount -o remount,acl /(重启后失效) - 永久启用:编辑
/etc/fstab,在对应分区的挂载选项中加入acl,例如:UUID=xxx / ext4 defaults,acl 0 1
目录结构影响 ACL 继承效果
ACL 的默认规则(-d)只对目录生效,且仅作用于新创建的子项。这意味着:如果目标是让整个协作目录树都受控,必须在父目录设置默认 ACL,而不是逐个子目录重复操作。
- 正确做法:
setfacl -d -m g:marketing:r-x /shared/docs→ 后续新建的文件自动获得 group:marketing:r-x - 常见误区:只对已有文件设 ACL(
-m),却忘了加-d,导致新人上传的文件不继承权限 - 注意:默认 ACL 不会改变已有子项,需配合
-R单独补设:setfacl -R -m g:marketing:r-x /shared/docs
mask 是实际生效权限的“天花板”
ACL 条目写的权限,不一定就是最终能用的权限。系统会通过 mask 字段取所有命名用户/组权限的并集,并以此为上限。比如你给用户 alice 设了 rwx,但 mask 是 r--,alice 实际只能读。
- 查看 mask:
getfacl file中mask::rwx行即为当前上限 - 通常无需手动设 mask,系统会自动计算;若手动调低(如
setfacl -m m::r-- file),所有命名条目都会被裁剪 - 重算 mask:
setfacl --recompute-mask file可恢复合理值
权限叠加逻辑:ACL 不覆盖,而是补充基础权限
ACL 不是替代传统 ugo 权限,而是叠加在其之上。访问检查顺序是:先验所有者 → 再验 ACL 中匹配的用户/组 → 最后验属组和其他人。只要任一路径满足要求,即可放行。
- 举例:文件属主是 alice,权限为
rw-r--r--;又用setfacl -m u:bob:r-- file加了 bob 的读权限 → bob 能读,不影响 alice 的读写,也不影响其他人权限 - 关键点:ACL 条目不会削弱原有权限,只会增强或细化;删除 ACL(
setfacl -b)后,立刻回归原始 ugo 控制


















