给目录加了 setfacl 之后应用能正常写,运维用 cp 搬了一次目录,权限退回 755,应用开始报 Permission denied,看上去像是文件被替换了。乍看像缓存或者权限的锅,追下去往往不是。
getfacl -R /data/app > /tmp/acl.bak cp -a /data/app /data/app.new tar --acls --xattrs -czf app.tgz /data/app sudo setfacl --restore=/tmp/acl.bak
追下去是这么回事:ACL 保存在文件的扩展属性里,普通拷贝只复制基本权限位,打包时 tar 不加 acls 参数也会丢,目录迁移和备份是权限最容易掉的两个环节。
「ACL 权限丢失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
具体做法是,先用 getfacl 递归导出目标目录作为对比基线 顺手存一份到临时目录;拷贝改用 cp -a 或者 tar 带上 acls 与 xattrs 参数 两者缺一个都会丢属性;搬完用 getfacl 对比差异再按基线恢复条目 确认用户和组都对。
验收就看一点,对比前后 getfacl 输出条目一致 应用写入不再报 Permission denied 重启应用再验一次。
