liblzma

关注
义项:压缩算法库
liblzma

liblzma是一个通用的数据压缩库,提供与zlib相似的应用程序接口,其原生文件格式为.xz,并兼容旧的.lzma格式与不含文件头的原始数据流[1]。它由XZ Utils项目开发和维护,主要作者为Lasse Collin,多数代码基于Igor Pavlov的LZMA SDK,并以公有领域或0BSD许可发布[2]。该库是许多操作系统中压缩与解压缩功能的基础组件。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

liblzma是一个通用的数据压缩库,其接口设计与zlib类似,原生容器格式为.xz,同时支持较旧的.lzma格式以及不带文件头的原始数据流[1]。它支持多种压缩算法,在XZ Utils的语境中这些算法被称为「过滤器」,目前主要使用的过滤器是LZMA2[3]。

该库属于XZ Utils项目的一部分,与名为xz的命令行工具一同发布,其开发与维护由Lasse Collin负责,主要部分基于Igor Pavlov的LZMA SDK[3]。liblzma以公有领域形式发布,较新的版本采用BSD零条款许可(0BSD)[2]。

原理

liblzma的核心是LZMA2过滤器,它以Lempel-Ziv-Markov链式算法为基础,通过字典匹配与区间编码实现压缩[4]。压缩时可以利用过滤器链,把LZMA2与最多4个其他过滤器组合,通常只用1个或2个;例如在LZMA2之前加一个BCJ(分支/调用/跳转)过滤器,可以提升可执行文件的压缩率[5]。

与LZMA1相比,LZMA2增加了对同步刷新、未压缩数据块的支持,可在编码过程中改变lc、lp、pb参数,并包含若干内部改进[6]。解压速度方面,LZMA2稍慢于gzip,但明显快于bzip2,因此适合同一文件会被多次解压的场景[7]。

内存占用与压缩级别密切相关。在追求最高压缩率时,LZMA2编码器会消耗大量CPU时间,并可能占用上百兆字节内存;而在快速模式下,它在速度、内存与压缩率上与bzip2处于同一量级[7]。liblzma的压缩级别预设从0到9,0最快、9最慢,与xz命令行工具的-0至-9开关相对应[6]。

发展历程

liblzma源自Tukaani项目的LZMA Utils一脉,该项目把Igor Pavlov提出的LZMA系列压缩思路整合为.xz格式与liblzma接口,供类Unix系统使用[8]。据XZ Utils的说明,其目标是让LZMA压缩在自由操作系统上易于使用,为此提供了与同类工具用法相近的命令行工具和库[9]。

2010年10月23日发布的5.0.0版本是一个重要节点,其更新说明将liblzma的API与ABI标记为稳定,并把共享库的soname提升为5.0.0,此后该库成为各发行版中可依赖的系统库[8]。2014年12月21日发布的5.2.0版本延续了稳定分支[8]。

2024年2月至3月间发布的5.6.0与5.6.1版本后来被确认被植入了后门代码,相关编号为CVE-2024-3094,该问题在2024年3月29日公开[8][10]。此后项目恢复了正常发布,2025年3月25日的5.8.0版本延续了事件之后的稳定发布线[8]。

应用

liblzma被广泛用于类Unix操作系统的软件包与系统组件中。以Debian为例,liblzma5是XZ格式压缩库的软件包,其依赖包括GNU C语言运行库等基础组件[4]。

在文件分发场景中,由于LZMA2解压较快,.xz格式适合同一文件被反复解压的用途,例如软件包的发布与安装[7]。该库的接口还被其他语言与应用以绑定或封装的形式调用,例如面向.NET的本地库封装、纯C#实现的XZ/LZMA2编解码实现等[11]。

liblzma的API头文件以Doxygen注释形式给出各函数与数据类型的简要说明,可作为快速参考;源码包中还提供了若干示例程序,帮助开发者入门[5]。

局限

liblzma在追求高压缩率时资源代价明显,LZMA2编码器可能耗费大量CPU时间与上百兆字节内存,因此不适合对压缩速度或内存有严格限制的场景[7]。

多线程支持存在不对称。较新的XZ Utils支持多线程压缩,但尚不支持多线程解压,相关设计已在.xz文件格式规划中预留[5]。此外,liblzma的库函数不会抛出异常,调用方需要通过返回值判断错误[1]。

LZMA2的多种参数会影响压缩率与内存占用,部分匹配查找器在特定构建配置下可能不可用,若编译时禁用了hc3、hc4或bt4等匹配查找器,某些预设级别的选项可能无法用于编码[6]。

参见

  • XZ Utils —— liblzma所属的压缩软件项目,同时提供xz命令行工具。

  • LZMA —— liblzma所支持压缩算法的基础,来自Igor Pavlov的LZMA SDK。

  • LZMA2 —— liblzma当前主要使用的压缩过滤器。

  • zlib —— 接口设计上与liblzma相似的通用压缩库。

  • gzip —— 另一种常见的压缩格式与工具,xz的命令行语法与其相近。

  • CVE-2024-3094 —— 涉及liblzma的供应链安全漏洞编号。

参考资料

  1. src/liblzma/api/lzma.h [引用日期2026-10-14]
  2. /* SPDX-License-Identifier: 0BSD */ [引用日期2026-10-14]
  3. liblzma (XZ Utils) [引用日期2026-10-14]
  4. 软件包:liblzma5(5.8.4-1 以及其他的) [引用日期2026-10-14]
  5. README [引用日期2026-10-14]
  6. lzma12_8h [引用日期2026-10-14]
  7. rootprojects.org 上的网页 [引用日期2026-10-14]
  8. pkg.so 上的网页 [引用日期2026-10-14]
  9. archivers/xz - The NetBSD Packages Collection [引用日期2026-10-14]
  10. XZ Utils - Wikipedia, la enciclopedia libre [引用日期2026-10-14]
  11. packages [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:55:53Z

历史版本

本条目引用的词条
XZ Utils LZMA LZMA2 zlib gzip CVE-2024-3094