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

tar 保留 xattr 与 ACL 的归档迁移清单

来源:17golang原创

时间:2026-11-13 19:04:17 240浏览 收藏

使用 GNU tar 迁移 Linux 文件时,创建和恢复两端都显式添加 --xattrs --acls,并把归档格式设为 pax。只加 -p 不能代替扩展属性与 ACL 选项。恢复端还要具备相应权限,并且目标文件系统支持这些属性;归档命令成功不等于业务权限已经迁移完整。

我会把这类迁移拆成“属性采集、归档、隔离恢复、业务切换”四项交付。这样安排的原因是,普通文件内容与额外授权信息需要分别判断。以下为操作方案与示例命令,不是已执行的生产迁移记录。

GNU tar 官方地址:https://www.gnu.org/software/tar/。属性选项说明:https://www.gnu.org/software/tar/manual/html_node/Extended-File-Attributes.html。本文讨论 GNU tar 与 Linux POSIX ACL,不把 BSD tar 或其他 ACL 模型视为等价实现。

明确迁移触发场景与工具

当共享目录依靠命名用户 ACL 授权,或应用在 user 命名空间保存文件标记时,只复制文件内容会漏掉业务所需元数据。先列出源路径、停写窗口、恢复目录、应用账号与属性范围,再安排定时任务或人工触发。数据库与持续写入目录应采用应用一致性备份或已准备的快照,tar 本身不能把变化中的目录变成事务快照。

# 在源端和目标端分别确认实现与可用参数
tar --version
tar --help
# 检查属性查看工具是否存在,不自动安装依赖
command -v getfacl
command -v getfattr

不要仅凭命令名称判断它一定是 GNU tar。自动化任务应固定执行程序与运行账号,记录版本和参数;发现不支持的选项就停止,而不是删掉参数继续跑。

配置读取权限与属性清单

采集账号必须能遍历目录并读取所需对象;恢复账号需要有权设置计划恢复的属主、ACL和属性。涉及跨机器用户时,提前确定 UID/GID 对应关系,不能假设同名用户编号相同。以下以已准备的 /srv/archive-source 为源,报告目录放在源目录之外。

# 报告路径需预先准备;本段只读取源对象
getfacl -R -P -n /srv/archive-source > /srv/migration-report/source.acl
# -m - 表示读取所有可见命名空间,-h 不跟随符号链接
getfattr -R -h -d -m - -e hex /srv/archive-source > /srv/migration-report/source.xattr

getfacl 的数字形式便于讨论身份映射;目录的 default ACL 也需要纳入清单。getfattr 默认显示范围有限,显式 -m - 用于查看当前账号能读取的全部属性,读取权限不足时仍会报告错误。清单只能作为调查输入,不能因为文件非空就认为没有遗漏。

创建归档时明确保存属性

#!/usr/bin/env bash
set -euo pipefail
# 替换为已冻结或进入停写窗口的源目录
source_dir=/srv/archive-source
archive_file=/srv/migration-report/payload.tar
# 归档放在源目录之外;以相对成员名保存整棵目录
tar --create --file="$archive_file" --format=pax \
    --xattrs --acls --numeric-owner -C "$source_dir" .

这里的 pax归档包含文件内容、POSIX ACL 和可读取的扩展属性。GNU tar 对 xattr 的保存与恢复默认范围不同:开启保存时收集全部名称,恢复时默认只应用 user 范围。若需要限制采集范围,可为特定方案增加 include/exclude;模式需要引号,避免 shell 提前展开。显式 pax 也使工作流的格式选择可见。

创建归档时明确保存属性
静态结构图:源目录的内容、ACL与扩展属性共同构成归档范围。

归档路径不要放进源目录,否则可能把正在生成的包纳入输入。脚本启用失败即停,但仍需记录 tar 的标准错误和退出状态。出现“文件在读取期间变化”之类异常,应重新准备一致的源输入,而不是把警告简单隐藏。

恢复范围由目标环境共同决定

#!/usr/bin/env bash
set -euo pipefail
archive_file=/srv/migration-report/payload.tar
restore_dir=/srv/migration-stage/payload
# 使用新建目录隔离本次恢复,目录已存在时立即停止
mkdir "$restore_dir"
# 仅适用于已经批准保留数字身份的迁移
tar --extract --file="$archive_file" -C "$restore_dir" \
    --xattrs --acls --numeric-owner --same-owner --same-permissions

父目录需先准备好,本例不覆盖已有恢复目录。--same-owner 涉及权限,非特权账号不能保证恢复任意属主;--numeric-owner 只控制数字身份使用方式,不会替你创建用户。若两端身份空间不同,先制定映射方案,再决定是否采用这组参数。

恢复范围由目标环境共同决定
静态结构图:归档包含属性与目标能恢复属性是不同条件。

不要把 --xattrs-include='*' 当作通用修复。security、trusted、system 等范围可能依赖目标策略和二进制语义,明确兼容后才按需恢复具体属性。SELinux 上下文另有 --selinux 支持,应根据目标策略制定保留或重新标记方案;本文基础命令不承诺完整克隆安全策略。

设置切换条件与失败处理

对于自动化,我倾向把“能解包”与“允许切换业务路径”设成不同状态。源端保持原样,恢复端先做属性与业务访问核对,批准后再切换;失败时继续使用原目录,并保留归档和错误记录。下面是迁移操作人员可采用的判断清单,不代表本文执行过这些检查。

现象处理方向
属性设置提示不支持核对目标挂载与文件系统能力,不忽略后继续切换
无法设置属主或ACL核对恢复账号权限和身份映射
用户ACL存在但访问失败结合getfacl有效权限、mask、父目录与应用身份判断
归档源仍在变化重新建立停写或快照输入,重新安排归档

核对时同时看命名用户、组、mask 和目录 default ACL;不要只看 ls 的权限字符串。扩展属性比较应只针对计划迁移的范围,并按相对路径对应源与目标。通知记录应包含任务标识、源快照或停写窗口、归档路径、选项、失败阶段和是否切换,避免只发送“备份完成”。

常见问题

创建时加了选项,恢复时还要加吗?

要。保存元数据与恢复元数据是两端动作,不能依赖解包默认行为。

为什么文件大小相同,权限仍然不对?

文件内容与授权信息不同。应继续检查ACL有效权限、属主编号和目标环境,而不是重新压缩文件内容。

能把系统目录整体套用这份脚本吗?

本例是受控数据目录迁移方案。整机恢复还涉及特殊文件、挂载布局、安全策略和应用一致性,需要独立计划。

没有保留的属性可以在恢复端补回来吗?

若归档和其他记录都没有该信息,恢复端不能凭空重建。先区分源端未采集还是目标端无法应用,再决定补救方式。

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