Linux文件ACL继承需手动设置目录默认ACL,仅影响新建文件和子目录,且对目录和文件的继承行为不同;必须确保文件系统挂载时启用acl选项,配合setgid、粘滞位及umask等机制才能实现稳健共享。

Linux 文件 ACL 继承不是自动发生的,必须通过为目录设置“默认 ACL”(default ACL)来实现。它不作用于现有文件,只影响后续新建的文件和子目录,且规则在不同类型对象上的生效方式不同——这是配置时最容易出错的核心点。
确认文件系统已启用 ACL 支持
即使系统装了 acl 工具,若挂载时未开启 acl 选项,所有 setfacl 操作都形同虚设:
- 运行 mount | grep " $(df . | awk 'NR==2 {print $1}')" | grep acl,检查目标挂载点是否含 acl 字样
- 若无输出,需编辑 /etc/fstab,在对应分区的挂载选项中追加 ,acl(如 defaults,acl),再执行 sudo mount -o remount /path
- 临时启用(仅当前会话有效):sudo mount -o remount,acl /
为目录设置默认 ACL 规则
只有目录能设置默认 ACL;对普通文件执行 setfacl -d 会报错。命令格式固定为 setfacl -d -m [entity:perm]:
- 给组 devteam 对 /srv/project 下所有新建项赋予读写执行权:
setfacl -d -m g:devteam:rwx /srv/project - 同时允许用户 alice 读写、禁止其他用户访问:
setfacl -d -m u:alice:rwX,o::--- /srv/project(大写 X 表示“有目录或已有执行位才加 x”,更安全) - 设置后用 getfacl /srv/project 查看,确认输出中存在以 default: 开头的行
理解新建对象的实际继承行为
默认 ACL 不是简单复制粘贴,而是按类型区别处理:
- 新子目录:完整继承父目录的默认 ACL,并自动将其设为自身的默认 ACL(具备向下继续继承能力)
- 新普通文件:只继承权限位(rwx),不继承执行位(x)——除非源 ACL 中用了大写 X;也不继承 default 标记,因此无法再作为继承源
- umask 始终参与计算:例如默认 ACL 给 rw-rw-rw-,但用户 umask 是 002,则新建文件最终为 rw-rw-r--;建议协作环境统一设 umask 002
- mask 限制实际权限上限:若默认 ACL 中某条目是 rwx,但 mask 是 r-x,则实际生效为 r-x;可用 setfacl -d -m m::rwx /srv/project 主动放宽掩码
配合基础权限机制强化管理
单靠默认 ACL 不足以构建稳健的共享目录策略,需组合使用:
- 添加 setgid 位:chmod g+s /srv/project,确保新创建项继承父目录所属组
- 启用 粘滞位(尤其多人可写时):chmod +t /srv/project,防止非所有者删除他人文件
- 定期审计默认 ACL 是否残留:getfacl -R /srv/project | grep "^default:"
- 清理默认 ACL:setfacl -d -b /srv/project(-d 确保只清默认项,不误删常规 ACL)


















