定义
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]。
参见
参考资料
- src/liblzma/api/lzma.h [引用日期2026-10-14]
- /* SPDX-License-Identifier: 0BSD */ [引用日期2026-10-14]
- liblzma (XZ Utils) [引用日期2026-10-14]
- 软件包:liblzma5(5.8.4-1 以及其他的) [引用日期2026-10-14]
- README [引用日期2026-10-14]
- lzma12_8h [引用日期2026-10-14]
- rootprojects.org 上的网页 [引用日期2026-10-14]
- pkg.so 上的网页 [引用日期2026-10-14]
- archivers/xz - The NetBSD Packages Collection [引用日期2026-10-14]
- XZ Utils - Wikipedia, la enciclopedia libre [引用日期2026-10-14]
- packages [引用日期2026-10-14]