tar 保留 xattr 与 ACL 的归档迁移清单
使用 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 也使工作流的格式选择可见。

归档路径不要放进源目录,否则可能把正在生成的包纳入输入。脚本启用失败即停,但仍需记录 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有效权限、属主编号和目标环境,而不是重新压缩文件内容。
能把系统目录整体套用这份脚本吗?
本例是受控数据目录迁移方案。整机恢复还涉及特殊文件、挂载布局、安全策略和应用一致性,需要独立计划。
没有保留的属性可以在恢复端补回来吗?
若归档和其他记录都没有该信息,恢复端不能凭空重建。先区分源端未采集还是目标端无法应用,再决定补救方式。
ip rule 配合 fwmark 实现策略路由的设计
- 上一篇
- ip rule 配合 fwmark 实现策略路由的设计
- 下一篇
- nftables set timeout 自动清理临时地址的配置
-
- 文章 · linux | 35分钟前 |
- journalctl --after-cursor 从指定位置继续读取日志
- 358浏览 收藏
-
- 文章 · linux | 36分钟前 | Linux · 服务管理 · systemd Linux服务 Restart=on-failure SuccessExitStatus
- systemd.service SuccessExitStatus 自定义正常退出码的配置方法
- 289浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux getconf 怎样查看系统支持的路径参数
- 464浏览 收藏
-
- 文章 · linux | 1天前 | Linux · Linux 文件监听 inotify IN_Q_OVERFLOW 状态重建
- inotify 出现 IN_Q_OVERFLOW 后怎么重建文件状态
- 224浏览 收藏
-
- 文章 · linux | 1天前 | Linux · overlayfs upperdir whiteout opaque directory lowerdir 容器层 OCI Image Spec
- OverlayFS 白化文件怎样影响容器层
- 324浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux getfacl -n 怎样显示数字 UID 和 GID
- 388浏览 收藏
-
- 文章 · linux | 1天前 |
- AppArmor profile 怎样区分 enforce 与 complain
- 428浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1015次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1019次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1144次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1119次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 960次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

