Linux tar 与 zstd 组合时怎么保留权限和稀疏文件
来源:17golang原创
时间:2026-09-07 19:54:32 196浏览 收藏
用 GNU tar 配合 zstd 归档时,创建命令建议写成 tar --zstd --sparse -cf backup.tar.zst data/。其中 --sparse 让 tar 识别并记录稀疏文件的空洞,--zstd 负责把 tar 归档流交给 zstd;恢复时再用 -p(--same-permissions)按归档中的权限位创建文件。不要把 --sparse 当成解包阶段的“开关”,它只对创建或更新归档有意义。
- 创建:
tar --zstd --sparse -cf backup.tar.zst data/。 - 恢复:
tar --zstd -xpf backup.tar.zst -C restore/,-p用来减少 umask 对权限位的影响。 - 复查:同时看
stat、du --apparent-size和普通du,不要只看文件的逻辑大小。
创建阶段:tar 记录空洞,zstd 压缩归档流
tar 和 zstd 解决的是两层问题。tar 保存文件名、权限位、时间以及稀疏区间等归档信息,zstd 只负责压缩这份归档流。因此,权限恢复是否完整不能靠 zstd 判断,稀疏文件是否膨胀也不能只看压缩文件名。

先确认源目录里确实有需要保留的属性:
# 查看工具实现,并记录逻辑大小与实际占用
tar --version
zstd --version
ls -ls data/sparse.img
stat -c '%A %a %b %s %n' data/sparse.img
stat 中的 %s 是逻辑字节数,%b 是实际分配块数;稀疏文件常见的特征就是前者很大、后者相对小。创建归档时使用:
# --sparse 记录空洞,--zstd 选择 zstd 压缩归档流
tar --zstd --sparse -cf backup.tar.zst data/
如果使用的不是 GNU tar,先检查它是否支持 --zstd 和 --sparse;不要因为命令能创建文件,就默认它保留了相同的稀疏布局。
恢复阶段:权限由 -p 决定,空洞由 tar 元数据重建
在一个空的恢复目录中执行:
# -x 解包,-p 按归档权限位恢复,-C 把结果放入隔离目录
mkdir -p restore
tar --zstd -xpf backup.tar.zst -C restore
GNU tar 在普通用户解包时通常会让当前 umask 限制新文件权限;-p 或 --same-permissions 表示按归档记录的模式设置权限。它不等于无条件恢复所有身份属性:文件所有者能否恢复还受执行用户权限和系统策略影响。稀疏布局则由 tar 读取归档中的空洞描述来重建,不需要在解包命令后再补一个“稀疏开关”。

用三组检查确认没有悄悄膨胀
| 检查对象 | 命令 | 看什么 |
|---|---|---|
| 归档目录 | tar --zstd -tvf backup.tar.zst | 成员名、模式和归档内容是否齐全 |
| 权限位 | stat -c '%A %a %n' restore/data/file | 数字权限是否符合源文件 |
| 稀疏占用 | du -h restore/data/sparse.img; du -h --apparent-size restore/data/sparse.img | 实际块占用与逻辑大小是否被混淆 |
复查时要把恢复前后的 %s、%b 和权限模式放在一起比较。逻辑大小相同而实际块数明显增加,通常说明空洞没有按预期保留;模式比源文件少了写权限或执行权限,则优先检查是否漏了 -p,以及目标目录是否确实由本次解包生成。
值班时的回滚边界
生产恢复不要直接覆盖业务目录。先解包到新的临时目录,完成成员列表、权限位和稀疏占用检查,再通过目录切换或受控同步替换目标。若目标环境有意限制权限,去掉 -p,让 umask 参与收紧模式;若要求尽量复原源目录,则保留 -p,但把所有者、ACL 和 SELinux context 作为另外的检查项处理。这样即使归档内容不符合预期,也只需删除隔离目录,不会破坏正在运行的文件。
常见问题
只加 --zstd,不加 --sparse,会怎样?
普通文件仍能归档,但稀疏文件可能按展开后的零数据读取,归档中间层会变大;有稀疏文件的备份应在创建命令中显式加上 --sparse。
解包时必须同时写 --sparse 吗?
不必。GNU tar 的 --sparse 是创建或更新归档时的选项,恢复稀疏布局依靠归档里已经保存的稀疏元数据。
-p 能恢复文件所有者吗?
不能把两者混为一谈。-p主要控制权限模式;所有者恢复还要看执行身份、目标系统策略以及 tar 的其他所有权行为。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
118 收藏
-
384 收藏
-
150 收藏
-
302 收藏
-
468 收藏
-
184 收藏
-
145 收藏
-
299 收藏
-
101 收藏
-
280 收藏
-
383 收藏
-
237 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习