登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux tar 保留 ACL 和 xattr 需要哪些参数

来源:17golang原创

时间:2026-09-12 22:41:54 435浏览 收藏

用 Linux tar 做目录迁移时,最容易漏掉的不是文件内容,而是文件旁边的元数据:POSIX ACL 和扩展属性(xattr)。保留它们不能只加 -p,创建归档和恢复归档都要明确写出 --acls--xattrs。如果还要跨机器保持属主,创建端再考虑 --numeric-owner,恢复端则要结合权限和目标文件系统能力检查。

最小可靠组合是:创建和恢复都使用 --acls --xattrs-p--same-permissions 只负责普通 mode 权限,不能代替 ACL/xattr。恢复成功也不等于所有命名空间都能落地,必须用 getfaclgetfattr 分开核对。

官方资料:https://www.gnu.org/software/tar/manual/tar.html

Linux xattr 说明:https://man7.org/linux/man-pages/man7/xattr.7.html

要点速览
  • --acls 保存和恢复 POSIX ACL,--xattrs 保存和恢复扩展属性。
  • --numeric-owner 记录数字 UID/GID;--same-owner--same-permissions 是恢复阶段的属主和 mode 选择。
  • 目标盘不支持 xattr、权限不足或命名空间受限时,参数不会凭空创造能力。

先确认源文件真的有 ACL 和 xattr

先看源文件,而不是直接给 tar 叠参数。ACL 通常通过系统属性保存,但它和普通的 rwx 位不是一回事;xattr 还可能属于 usersecuritytrustedsystem 命名空间。下面的检查命令只读元数据,输出以实际机器为准。

# 查看普通权限、属主以及 POSIX ACL 条目
getfacl -p /srv/app/config.yaml

# 列出所有可读的扩展属性;没有属性时可能没有输出
getfattr -d -m- /srv/app/config.yaml

如果源文件只有基础 mode,没有额外 ACL,--acls 仍可以保留“没有额外条目”的状态;如果源文件没有 xattr,--xattrs 也不会凭空增加内容。这个预检查的价值,是让恢复后的差异有参照物。

创建归档时分别打开 --acls--xattrs

GNU tar 把两个能力拆成两个开关。--acls 写入 POSIX ACL,--xattrs 写入扩展属性;使用它们创建归档时会采用适合承载这些元数据的 pax 归档格式。可以把普通文件、目录和元数据一起打包:

# -C 让归档内使用相对路径,避免把 /srv 写成成员名前缀
# --numeric-owner 记录数字 UID/GID,跨机器时不依赖同名用户
sudo tar --acls --xattrs --numeric-owner -cpf /backup/app-metadata.tar \
  -C /srv app

这里的 -p 是 create/extract 的操作组合写法,真正表达“恢复时不要套用当前 umask”的是 --same-permissions。它们都不负责保存 ACL 或 xattr,所以不要把下面几种概念混在一起。

参数解决什么问题常见边界
--acls归档或恢复 POSIX ACL目标系统需要能设置 ACL
--xattrs归档或恢复扩展属性受命名空间、权限和文件系统支持影响
--numeric-owner使用数字 UID/GID 记录属主只记录身份,不创建目标机器上的用户
--same-permissions恢复归档中的 mode与 ACL/xattr 是不同元数据层
Linux GNU tar 归档结构示意图,展示 --acls 保存 POSIX ACL、--xattrs 保存 user 和 security 命名空间扩展属性
图1:归档输入结构示意图,--acls--xattrs 分别携带 ACL 和扩展属性。

恢复时再次打开元数据选项并处理属主权限

解包时仍要写 --acls --xattrs,因为创建端打开开关不会自动改变恢复端的策略。迁移到新目录时,可以这样组织命令:

# 先创建恢复目录;真实环境请替换为经过确认的目标路径
sudo mkdir -p /restore

# --same-owner 需要足够权限;--same-permissions 只针对普通 mode
sudo tar --acls --xattrs --same-owner --same-permissions -xpf \
  /backup/app-metadata.tar -C /restore

GNU tar 在恢复 xattr 时有命名空间策略:归档时可以保存更多属性,但默认恢复范围并不等于“无条件写回全部属性”。若业务明确依赖某个命名空间,应使用 --xattrs-include='user.*' 或相应的精确模式,并确认执行用户和目标文件系统都允许写入。SELinux 上下文、trusted 属性等安全相关数据尤其不适合跨发行版盲目复制。

用原始工具对比恢复结果

不要只看 tar 返回码。分别检查 mode、属主、ACL 和 xattr,才能判断是哪一层丢失。恢复目录中的路径应与归档内的成员路径对应:

# 检查恢复文件的基础权限与 ACL
getfacl -p /restore/app/config.yaml

# 检查恢复文件的扩展属性;-m- 表示匹配所有属性名
getfattr -d -m- /restore/app/config.yaml

# 查看归档成员及其扩展属性提示,辅助确认归档是否携带元数据
tar --acls --xattrs -tvf /backup/app-metadata.tar

如果 ACL 与 mode 一致,但 xattr 为空,优先排查目标文件系统是否支持扩展属性、当前用户是否具备命名空间所需权限,以及恢复命令是否被显式的 include/exclude 规则限制。Linux 内核文档也说明,xattr 的存储和限制由具体文件系统实现决定;换到不支持的介质时,tar 参数无法绕过这个前提。

Linux tar 恢复结果核对示意图,分栏比较 mode、owner、POSIX ACL、xattr 与文件系统支持
图2:恢复结果核对示意图,权限、ACL、xattr 和属主应分栏确认。

常见问题

只加 -p 能保留 ACL 和 xattr 吗?

不能。-p--same-permissions 处理普通 mode 权限;ACL 和 xattr 需要各自的 --acls--xattrs

为什么归档有 xattr,恢复后却没有?

可能是恢复阶段没有启用 --xattrs,也可能是默认命名空间范围、权限或目标文件系统能力不匹配。用 getfattr 查看具体属性名,比只看命令是否报错更可靠。

--numeric-owner 会同步用户和用户组吗?

不会。它只让归档记录数字 UID/GID;目标机器仍需要有合适的账号映射,恢复命令也需要足够权限才能设置属主。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>