xz 压缩与解压
1. 简介
XZ Utils 是提供高压缩率数据压缩的工具集,核心命令为 xz。它采用 LZMA2 算法,压缩率通常优于 gzip 和 bzip2,特别适合软件分发、长期归档及带宽敏感场景。
- 默认后缀:
.xz(自动识别.txz并还原为.tar) - 核心优势: 极高压缩率、原生多线程支持 (
-T)、完整性校验 (CRC32/64, SHA-256)。 - 注意: 解压速度通常快于压缩,但高压缩级别(如
-9)会显著增加内存占用。
2. 核心场景操作指南
2.1 将文件夹压缩为 .tar.xz (最常用)
xz 本身只能压缩单个文件流。要压缩文件夹,需先通过 tar 打包成流,再管道传递给 xz。
# 语法:tar [打包参数] 文件夹 | xz [压缩参数] > 输出文件.tar.xz
# ✅ 推荐:使用所有 CPU 核心加速压缩,保留原文件夹
tar -cf - my_folder | xz -T0 -k > my_folder.tar.xz
# 🚀 极速模式 (适合临时传输,压缩率低但速度快)
tar -cf - my_folder | xz -T0 -3 > my_folder.tar.xz
# 📦 极致压缩 (适合长期归档,速度慢,内存占用高)
tar -cf - my_folder | xz -T0 -9e > my_folder.tar.xz-c: create (创建 tar 包)-f -: 输出到标准输出 (stdout)-T0: 自动使用所有可用 CPU 核心-k: keep (保留原始输入文件,不加则压缩后删除原文件)-9e: 级别 9 + extreme 模式 (更慢但可能更小)
2.2 解压 .tar.xz 文件
现代 tar 命令能自动识别 .xz 格式,无需指定 -J。
# ✅ 推荐:直接解压到当前目录
tar -xf file.tar.xz
# 📂 解压到指定目录
tar -xf file.tar.xz -C /path/to/target
# 👀 仅查看内容 (不解压)
tar -tf file.tar.xz
# 🔍 详细查看内容 (包含权限、时间等)
tar -tvf file.tar.xz-x: extract (解压)-f: file (指定文件)-C: directory (指定目标路径)-t: list (列表)-v: verbose (详细)
2.3 Docker 镜像流式导入 (节省磁盘空间)
场景: 你有 image.tar.xz,想导入 Docker,但不想在磁盘上生成巨大的中间 image.tar 文件。
# ✅ 最佳实践:边解压边导入,不占用额外磁盘空间
xz -dc image.tar.xz | docker load
# 如果提示权限不足
sudo xz -dc image.tar.xz | sudo docker load-d: decompress (解压)-c: stdout (输出到标准输出,供管道传递)
3. 基础文件操作速查表
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 压缩单文件 | xz file.txt | 生成 file.txt.xz,删除原文件 |
| 压缩并保留原文件 | xz -k file.txt | -k (keep) 保留 file.txt |
| 解压单文件 | unxz file.txt.xz | 或 xz -d,生成 file.txt,删除 .xz |
| 解压并保留压缩包 | xz -dk file.txt.xz | 同时保留 .xz 和解压后的文件 |
| 强制覆盖输出 | xz -f file.txt | 如果目标文件已存在,强制覆盖 |
| 测试完整性 | xz -t file.tar.xz | 检查文件是否损坏,无输出表示正常 |
| 查看压缩信息 | xz -l file.tar.xz | 显示压缩比、未压缩大小等元数据 |
4. 进阶功能:性能与资源控制
4.1 多线程压缩 (关键性能选项)
默认 xz 是单线程的。对于大文件,开启多线程可显著提升压缩速度。
- 注意: 多线程主要加速压缩过程;
xz的解压通常是单线程的。
# 使用所有可用核心
xz -T0 large_file.tar
# 指定使用 4 个核心
xz -T4 large_file.tar
# 限制内存使用 (防止 OOM),例如限制为 500MB
xz -T0 --memlimit-compress=500MiB large_file.tar4.2 压缩级别与内存权衡
选择合适的级别以平衡速度、压缩率和内存。
| 级别 | 参数 | 特点 | 适用场景 | 预估内存 (压缩/解压) |
|---|---|---|---|---|
| 快速 | -0 ~ -3 | 速度极快,压缩率一般 | 临时传输、日志轮转 | 3~32 MiB / 1~5 MiB |
| 默认 | -6 | 速度与压缩率的平衡点 | 日常通用、软件发布 | 94 MiB / 9 MiB |
| 极致 | -9 | 最慢,内存极大,压缩率最高 | 冷数据归档、带宽极度受限 | 674 MiB / 65 MiB |
| 极限增强 | -9e | 在 -9 基础上进一步牺牲速度换空间 | 极端归档需求 | > 674 MiB |
提示: 不要盲目使用
-9。如果解压端是内存受限的设备(如嵌入式系统),请使用-6或更低级别,或者显式减小字典大小:xz --lzma2=dict=4MiB file.tar(生成的文件仅需约 5MiB 内存即可解压)
4.3 完整性校验
.xz 格式支持多种校验码,默认为 CRC64。
# 压缩时使用 SHA-256 (更安全但稍慢)
xz --check=sha256 important_data.tar
# 压缩时不使用校验 (最快,但不推荐,除非外部已有校验)
xz --check=none data.tar
# 解压时忽略校验错误 (用于尝试恢复损坏文件)
xz -d --ignore-check damaged_file.xz5. 高级技巧:自定义过滤链 (Filter Chains)
xz 允许在压缩前对数据进行预处理(过滤),以进一步提高特定类型文件的压缩率。
5.1 BCJ 过滤器 (针对可执行文件)
如果压缩包内包含大量二进制可执行文件 (ELF, DLL, EXE),使用架构对应的 BCJ 过滤器可将相对地址转换为绝对地址,增加冗余度,提升压缩率 0-15%。
# 针对 x86/x86_64 二进制文件
xz --x86 --lzma2 program_binaries.tar
# 针对 ARM64 文件
xz --arm64 --lzma2 arm_binaries.tar
# 针对 PowerPC (大端序)
xz --powerpc --lzma2 ppc_binaries.tar注意: 过滤器顺序很重要,BCJ 必须在 LZMA2 之前。
5.2 Delta 过滤器 (针对图像/音频)
针对未压缩的位图或 PCM 音频,Delta 过滤器计算字节差值,能显著提升压缩率。
# 针对 24位 RGB 图片 (每像素3字节),设置距离为3
xz --delta=dist=3 --lzma2=pb=0 image_raw.tiff6. 常见问题与故障排除
Q1: 报错 "Memory allocation failed"
原因: 使用了过高的压缩级别(如 -9)处理大文件,导致内存需求超过系统限制。 解决:
- 降低压缩级别:改用
-6或-5。 - 限制内存:
xz --memlimit-compress=500MiB file.tar。 - 减小字典大小:
xz --lzma2=dict=16MiB file.tar。
Q2: 如何在脚本中安全地使用 xz?
建议: 始终检查退出状态,并使用 -k 防止意外删除源文件,直到确认压缩成功。
if xz -T0 -k source.tar; then
echo "压缩成功"
# rm source.tar # 手动确认后再删除
else
echo "压缩失败,源文件已保留"
exit 1
fiQ3: .xz 与 .lzma 的区别?
.xz: 新格式,支持多线程、完整性校验、多流合并。推荐使用。.lzma: 旧格式 (LZMA Utils),单线程,无校验。仅在兼容极老系统时使用 (xz --format=lzma)。
7. 环境变量配置
可以通过环境变量设置默认行为,无需每次输入参数。
XZ_DEFAULTS: 设置系统级或用户级默认参数(如内存限制、线程数)。# 在 .bashrc 中添加:默认限制内存为 1GB,自动使用多线程 export XZ_DEFAULTS="--memlimit-compress=1GiB -T0"XZ_OPT: 当xz被其他程序(如tar)调用时传递参数。# 让 tar 调用 xz 时使用 -7 级别压缩 XZ_OPT=-7 tar -caf archive.tar.xz folder/
参考文档: XZ Utils Man Page (xz.1) | 版本: 5.x+