-p 参数默认保留 acl,只要文件系统支持并正确挂载;现代 gnu coreutils 中 -p 等价于 --preserve=mode,ownership,timestamps 且已内置 acl 和 xattr 支持,无需额外参数。

要防止 ACL 规则在 cp 复制过程中丢失,关键不是“加 -p 参数以防丢失”,而是明确:-p 本身就会保留 ACL —— 只要系统支持且权限配置正确。
ACL 是 -p 默认保留的属性之一
-p 参数等价于 --preserve=mode,ownership,timestamps,但在大多数现代 Linux 发行版(如 RHEL/CentOS 7+、Ubuntu 16.04+、Debian 9+)中,GNU coreutils 的 cp 实现已将 ACL 和扩展属性(xattr)纳入 -p 的默认保留范围。也就是说,只要执行:
- cp -p source_file dest_file
- 或 cp -p source_dir/ dest_dir/(注意目录需配合 -r)
ACL 就会被一并复制过去,无需额外参数或开关。
验证 ACL 是否成功保留
复制后用 getfacl 对比源与目标:
- getfacl source_file
- getfacl dest_file
两者的输出应完全一致(除文件路径外)。若不一致,说明复制未生效,常见原因包括:
- 目标文件系统不支持 ACL(如 vfat、ntfs-3g 默认禁用)
- 挂载时未启用 acl 选项(ext4/xfs 需确保 /etc/fstab 中有 acl 或默认启用)
- 普通用户执行 cp -p 时,ownership 无法保留,但 ACL 仍可保留(ACL 不依赖 uid/gid,只依赖文件系统支持)
备份恢复场景下的实用建议
在做 ACL 敏感文件(如 web 应用配置、数据库凭证目录)的备份恢复时:
- 单文件或少量文件:直接用 cp -p
- 整个目录结构(含子目录、符号链接、SELinux 上下文等):优先用 cp -a(它隐含 -p,并自动递归 + 保留全部元数据)
- 跨机器或归档传输:搭配 tar 更可靠,例如 tar --acls -cf backup.tar dir/,再解压时加 --acls
注意几个实际限制
-p 虽保留 ACL,但有边界:
- 目标分区必须挂载支持 ACL(多数现代发行版默认开启,可用 mount | grep acl 确认)
- 若目标路径已有文件,cp -p 会覆盖内容并重写 ACL;不会合并 ACL 条目
- 某些精简版 busybox 或旧版 coreutils 可能不支持 ACL 保留,此时需确认 cp --help | grep preserve 是否列出 acl











