Ubuntu 22.04 上一台文件服务器给外包开了只读 ACL,setfacl -m u:dev01:r 之后 getfacl 能看到,用 cp -a 拷到新盘再挂回来,外包账号全被拒,getfacl 输出里只剩基本位。

一开始怀疑是「用 rsync 时漏了 -A 参数,扩展属性同样不会被同步过去」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。cp 默认不保留扩展属性,ACL 在拷贝过程里被丢掉,只留下了基础权限位。另一种情况是目标文件系统挂载时没开 acl 选项,setfacl 执行时直接报 Operation not supported。

不容易想到的是,tar 打包没加 xattr 选项,解包后 ACL 无法还原。

先确认源端 ACL 都还在,先留一份清单

getfacl -R /srv/share > /root/acl_before.txt

随后挂载开关确认支持 ACL

findmnt -o TARGET,OPTIONS /srv/share | grep -w acl

拷贝时同时保留权限与扩展属性

rsync -aHAX /srv/share/ /data/share/

末了按清单逐项核对差异

getfacl -R /data/share > /root/acl_after.txt && diff /root/acl_before.txt /root/acl_after.txt

改完先别撤,确认这几项。diff 输出为空,getfacl 在目标目录能看到同样的 user:dev01:r– 条目,用外包账号 su – dev01 后能读不能写。

ACL 丢了一般不会有任何报错,等到有人访问失败才发现;跨文件系统拷贝前先 getfacl 备份,比事后补要省一大截时间。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189