acl未生效需排查文件系统是否启用acl选项、mask是否压制权限、默认acl是否被umask或父目录权限抑制,以及selinux、隐藏属性等干扰机制。

ACL 权限没生效,不是“加了就该起作用”,而是整个访问链路上多个环节都可能卡住。核心要确认:ACL 规则是否被正确写入、是否被内核识别、是否被应用层(如 Samba/SFTP)尊重、是否被 mask 或其他机制压制。
检查文件系统是否真正启用 ACL 支持
即使用了 setfacl,若底层文件系统未开启 ACL,命令会静默成功但实际不生效:
- 运行 mount | grep "$(df . | tail -1 | awk '{print $1}')" ,确认输出中含 acl 选项(如
rw,relatime,acl) - 若无 acl,临时启用:sudo mount -o remount,acl /mount/point
- 永久生效需编辑 /etc/fstab,在对应挂载项的 options 列加入 acl(如
defaults,acl),再 sudo mount -o remount /mount/point
验证 ACL 是否真实写入且未被 mask 削弱
getfacl 输出里的 mask 是实际生效权限的“天花板”,它和用户/组条目做按位与运算:
- 执行 getfacl /path/to/file,重点看 mask:: 行和目标 user/group 条目(如
user:alice:rwx) - 若 mask 是
r-x,而 user 条目是rwx,则 alice 实际只有r-x - 修复方式:setfacl -m m::rwx /path/to/file(提升 mask 上限),或用 setfacl --recompute-mask 自动重算
确认默认 ACL 在目录中是否被新建文件继承
default ACL 只对目录有效,且仅影响其下新创建的文件/子目录,不会回溯修改已有内容:
- 先用 getfacl /dir 确认存在
default:user:xxx:类条目 - 手动创建测试文件:touch /dir/test_new,再 getfacl /dir/test_new —— 若无预期权限,说明 default ACL 未触发
- 常见原因:umask 值过大(如 0077)会覆盖 default ACL;或父目录缺少执行(x)权限导致创建失败
排查干扰机制:SELinux、特殊权限位与隐藏属性
ACL 生效前,还要过几道关。这些机制优先级高,会直接拦截访问:
- SELinux:运行 sestatus,若为 enforcing,尝试 sudo setenforce 0 临时关闭,观察问题是否消失
-
文件隐藏属性:用 lsattr /path 检查是否设了
i(不可修改)或a(仅追加),它们会让 chmod/setfacl 失效 - setuid/setgid/sticky bit:虽不直接禁用 ACL,但异常设置(如目录丢失 sticky bit)可能引发服务行为异常,间接影响权限判断











