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

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 对权限位的影响。
  • 复查:同时看 statdu --apparent-size 和普通 du,不要只看文件的逻辑大小。

创建阶段:tar 记录空洞,zstd 压缩归档流

tar 和 zstd 解决的是两层问题。tar 保存文件名、权限位、时间以及稀疏区间等归档信息,zstd 只负责压缩这份归档流。因此,权限恢复是否完整不能靠 zstd 判断,稀疏文件是否膨胀也不能只看压缩文件名。

Linux tar 与 zstd 创建归档时,权限字段和稀疏区间进入 tar,再由 zstd 形成 backup.tar.zst 的静态关系图
图1:创建阶段把文件属性和稀疏区间交给 tar 记录,再把归档流交给 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 读取归档中的空洞描述来重建,不需要在解包命令后再补一个“稀疏开关”。

Linux tar 与 zstd 恢复归档时,-p、umask、权限字段和稀疏区间共同影响恢复文件的静态关系图
图2:恢复阶段由 tar 读取权限和稀疏元数据;-p 决定权限位是否绕过 umask 的限制。

用三组检查确认没有悄悄膨胀

检查对象命令看什么
归档目录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 的其他所有权行为。

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