linux acl 是在传统权限之上添加的独立权限层,需文件系统挂载时启用 acl 选项,否则 setfacl 无效;其权限受 mask 控制,且默认 acl 仅对新文件生效。

Linux ACL 不是“替代传统权限”,而是给特定用户或组加一道独立权限层,必须确认文件系统已启用 acl 挂载选项,否则所有 setfacl 命令都只是在改传统权限位,且会报错或静默失效。
检查并启用文件系统 ACL 支持
ACL 依赖底层挂载参数,不是装了 acl 包就能用。常见错误是执行 setfacl 后 ls -l 看不到 +,或 getfacl 报 “Operation not supported”。
- 运行
mount | grep "$(df . | tail -1 | awk '{print $1}')"查当前分区挂载选项,确认输出含acl - 若无
acl,临时启用:sudo mount -o remount,acl /path/to/mount(如/或/home) - 永久生效需编辑
/etc/fstab,在对应行 options 字段追加acl,例如:UUID=xxx / ext4 defaults,acl 0 1 - 注意:XFS 文件系统默认支持 ACL,但 ext4 在某些旧内核或精简发行版中可能未编译进 ACL 支持
用 setfacl 添加用户/组权限
setfacl -m 是最常用操作,但权限不会直接生效——它受 mask 控制。很多人设了 u:alice:rw- 却发现还是打不开文件,就是因为 mask 当前是 r--。
- 给用户加读写:
setfacl -m u:alice:rw /data/file.txt - 给组加读写执行(目录):
setfacl -m g:devs:rwx /var/www - 递归设置(慎用):
setfacl -Rm u:bob:r-x /shared/project,但子目录的mask可能被重算,建议后续补setfacl -Rm m:rwx /shared/project - 多规则一次写全:
setfacl -m u:alice:rx,g:qa:rw- /report
设置默认 ACL 实现新建文件自动继承
默认 ACL(d: 前缀)只对目录有效,且仅影响新创建的文件/子目录,不影响已有内容。这是团队共享目录长期维持权限一致的关键。
- 设置默认规则:
setfacl -m d:u:john:rwx,d:g:team:rx /project - 验证是否生效:新建文件后立即
getfacl,看是否有user:john:rwx和group:team:rx条目 - 注意:默认 ACL 不会自动复制到已存在子目录;若要批量应用,先
setfacl -d -b /project清空再重设,再对现有子目录单独跑setfacl -Rm d:... /project - 如果子目录自己也设了默认 ACL,则以子目录的为准,父目录默认规则不穿透
排查 mask 导致权限“设了却无效”
mask 是 ACL 最容易被忽略的环节。它像一个总闸,所有非属主、非 other 的 ACL 条目(user:、group:)实际生效权限不能超过 mask 定义的范围。
- 查看当前 mask:
getfacl /target中找mask::rwx行 - 手动收紧 mask(比如禁止写):
setfacl -m m:r-x /target,此时即使u:alice:rw-存在,她也无法写 - 自动更新 mask:
setfacl -m u:charlie:rw /target会触发setfacl自动把mask扩大到rwx;但如果你先chmod g-w /target,mask可能被意外缩为r-x,导致 ACL 失效 - 强制重算 mask:
setfacl --mask -m m:rwx /target
真正踩坑的地方不在命令怎么敲,而在于 mask 和挂载选项这两个隐性开关——它们不报错、不警告,只让权限“看起来设了,其实没用”。每次配完 ACL,务必 getfacl 看全量输出,重点盯 mask:: 和各条规则是否在 mask 范围内。











