setfacl 并非万能,需文件系统支持acl且路径可写;设默认acl(-d)才使新建文件继承权限;mask限制非所有者/组权限,需显式更新;清空acl用-b,备份恢复用--restore。

setfacl 不是万能的权限补丁,它只在文件系统启用 ACL 支持且目标路径可写时才生效;直接执行 setfacl -m 却没反应,大概率是底层不支持或权限不足。
检查文件系统是否真正支持 ACL
很多用户跳过这步就开干,结果 setfacl 看似成功、getfacl 却报错或显示无变化。根本原因在于:ACL 是文件系统特性,不是内核默认全开的。
- 运行
tune2fs -l /dev/your_partition | grep "Default mount options"(把/dev/your_partition换成实际挂载点对应设备,如/dev/sda1),输出里必须含acl - 若没有,需修改
/etc/fstab,在对应挂载项的 options 字段加acl,例如:/dev/sda1 /data ext4 defaults,acl 0 2,然后执行sudo mount -o remount /data - 临时启用(不改 fstab)可用
sudo mount -o remount,acl /mount/point,但重启后失效
给单个用户设读写权限,但新创建的文件不继承?
这是最常被忽略的坑:setfacl -m u:alice:rw file 只影响当前文件,对目录下后续新建文件完全无效。要让子文件自动获得权限,必须设「默认 ACL」(default ACL),且仅对目录有效。
- 先确保目标是目录(比如
/shared),不是普通文件 - 执行
setfacl -d -m u:alice:rwx /shared—— 注意-d参数,它表示“默认”,后续在此目录中新建的文件/子目录会自动带上该规则 - 已有子内容不会自动更新,需额外加
-R:setfacl -R -m u:alice:rwx /shared(设当前权限) +setfacl -R -d -m u:alice:rwx /shared(设默认权限) - 注意:默认 ACL 不会改变已存在文件的访问权限,只影响未来创建项
权限没生效?可能是 mask 掩码锁住了
ACL 中的 mask 是一道隐形闸门,它限制了所有非所有者、非所属组条目的最大有效权限。即使你写了 u:bob:rwx,如果 mask 是 r--,bob 实际只有读权限。
- 运行
getfacl /path,查看输出里是否有mask::rwx这一行;若权限比预期窄,就是它在起作用 - 手动刷新 mask:执行
setfacl --mask -m mask::rwx /path(把rwx换成你需要的最大权限组合) - 更省事的做法是加
--mask参数让setfacl自动重算:setfacl -m u:bob:rwx --mask /path - 某些旧版工具(如老内核或 NFS 挂载)可能不自动更新 mask,必须显式触发
批量删 ACL 或恢复基础权限
调试时加了一堆规则,想一键清空?别用 chmod,它不碰 ACL;也别只删用户项,残留的 mask 或 default 仍可能干扰后续操作。
- 彻底清除所有扩展 ACL(保留 owner/group/other 基础权限):
setfacl -b /path - 只删默认 ACL(不影响当前文件权限):
setfacl -k /path - 递归清理整个目录树:
setfacl -R -b /dir,但注意:若目录有 default ACL,子目录新建文件仍会继承——所以建议先-k再-b - 误操作后想回滚?提前用
getfacl -R /dir > acl-backup.txt备份,恢复时用setfacl --restore=acl-backup.txt
ACL 的复杂性不在命令本身,而在 mask、default、递归作用域三者的叠加效果。一次 setfacl 调用可能同时触发三类变更,而 getfacl 输出里的 mask:: 和 default: 行就是唯一真相来源——别信 ls -l 结尾那个 + 号,它只告诉你“有 ACL”,不告诉你“具体是什么”。










