用getfacl -r导出、setfacl --restore恢复acl权限:需确保递归导出、路径一致、文件系统支持acl、还原前测试语法并验证结果。

用 getfacl 备份、setfacl 还原生产目录权限,不是“一键”但足够可靠——关键在导出完整、路径一致、ACL可用、验证到位。
备份:确保递归、完整、可读
对生产目录执行全量 ACL 导出,必须加 -R(递归)并确认有足够读取权限:
-
标准命令:
getfacl -R /data/prod > /backup/prod_acl_$(date +%F).acl - 路径含空格或特殊字符时,务必加英文双引号:
getfacl -R "/data/app v2" > appv2.acl - 非 root 用户导出他人目录?需 sudo:
sudo getfacl -R /var/www > www.acl - 导出前检查目标是否存在、未被 overlay/NFS 覆盖,且文件系统支持 ACL(ext4/xfs 通常默认启用)
灾备恢复:还原前先测试,避免批量失败
把备份文件传到灾备机后,不要直接执行还原。先做语法和路径校验:
- 测试备份文件是否可解析:
setfacl --test --restore=prod_acl_2026-05-19.acl 2>&1 | head -8—— 若无报错,说明格式合法 - 检查关键路径是否真实存在(如
/data/prod),否则还原会跳过并警告 - 执行还原:
setfacl --restore=prod_acl_2026-05-19.acl - 若只想恢复子目录(如仅
/data/prod/logs),可用 sed 提取段落再还原:sed -n '/# file: \/data\/prod\/logs/,/^# file:/p' prod_acl_2026-05-19.acl | setfacl --restore=-
验证:别只信命令返回 success
还原完成后,必须人工抽查,尤其关注 owner/group/ACL 条目是否匹配原始状态:
- 查单个文件:
getfacl /data/prod/config.yaml,对比备份文件中对应段落 - 比对差异(需保留原始备份):
diff -u - 注意 UID/GID 映射:备份在 A 机生成,还原到 B 机时,只要用户 UID 相同,权限就生效,不依赖用户名一致
额外提醒:防踩坑的硬性条件
以下任一不满足,还原就会静默失败或部分失效:
- 灾备机文件系统挂载时必须含 acl 选项(
mount | grep " /data " | grep acl) - 目标路径需已存在,且权限允许 setfacl 写入(例如目录需有写 + 执行权限)
- 备份时若跳过了某些文件(因权限不足),还原时也不会补上——建议用 root 备份核心生产路径
- 不建议用
getfacl -R /全盘备份,既慢又易因 /proc /sys 等虚拟文件系统报错;应按业务目录分段备份











