150 lines
7.2 KiB
Text
150 lines
7.2 KiB
Text
|
|
||
|
History of LZMA Utils and XZ Utils
|
||
|
==================================
|
||
|
|
||
|
Tukaani distribution
|
||
|
|
||
|
In 2005, there was a small group working on Tukaani distribution, which
|
||
|
was a Slackware fork. One of the project goals was to fit the distro on
|
||
|
a single 700 MiB ISO-9660 image. Using LZMA instead of gzip helped a
|
||
|
lot. Roughly speaking, one could fit data that took 1000 MiB in gzipped
|
||
|
form into 700 MiB with LZMA. Naturally compression ratio varied across
|
||
|
packages, but this was what we got on average.
|
||
|
|
||
|
Slackware packages have traditionally had .tgz as the filename suffix,
|
||
|
which is an abbreviation of .tar.gz. A logical naming for LZMA
|
||
|
compressed packages was .tlz, being an abbreviation of .tar.lzma.
|
||
|
|
||
|
At the end of the year 2007, there was no distribution under the
|
||
|
Tukaani project anymore, but development of LZMA Utils was kept going.
|
||
|
Still, there were .tlz packages around, because at least Vector Linux
|
||
|
(a Slackware based distribution) used LZMA for its packages.
|
||
|
|
||
|
First versions of the modified pkgtools used the LZMA_Alone tool from
|
||
|
Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need
|
||
|
to interact with LZMA_Alone directly. But people soon wanted to use
|
||
|
LZMA for other files too, and the interface of LZMA_Alone wasn't
|
||
|
comfortable for those used to gzip and bzip2.
|
||
|
|
||
|
|
||
|
First steps of LZMA Utils
|
||
|
|
||
|
The first version of LZMA Utils (4.22.0) included a shell script called
|
||
|
lzmash. It was wrapper that had gzip-like command line interface. It
|
||
|
used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep,
|
||
|
zdiff, and related scripts from gzip were adapted work with LZMA and
|
||
|
were part of the first LZMA Utils release too.
|
||
|
|
||
|
LZMA Utils 4.22.0 included also lzmadec, which was a small (less than
|
||
|
10 KiB) decoder-only command line tool. It was written on top of the
|
||
|
decoder-only C code found from the LZMA SDK. lzmadec was convenient in
|
||
|
situations where LZMA_Alone (a few hundred KiB) would be too big.
|
||
|
|
||
|
lzmash and lzmadec were written by Lasse Collin.
|
||
|
|
||
|
|
||
|
Second generation
|
||
|
|
||
|
The lzmash script was an ugly and not very secure hack. The last
|
||
|
version of LZMA Utils to use lzmash was 4.27.1.
|
||
|
|
||
|
LZMA Utils 4.32.0beta1 introduced a new lzma command line tool written
|
||
|
by Ville Koskinen. It was written in C++, and used the encoder and
|
||
|
decoder from C++ LZMA SDK with little modifications. This tool replaced
|
||
|
both the lzmash script and the LZMA_Alone command line tool in LZMA
|
||
|
Utils.
|
||
|
|
||
|
Introducing this new tool caused some temporary incompatibilities,
|
||
|
because LZMA_Alone executable was simply named lzma like the new
|
||
|
command line tool, but they had completely different command line
|
||
|
interface. The file format was still the same.
|
||
|
|
||
|
Lasse wrote liblzmadec, which was a small decoder-only library based
|
||
|
on the C code found from LZMA SDK. liblzmadec had API similar to zlib,
|
||
|
although there were some significant differences, which made it
|
||
|
non-trivial to use it in some applications designed for zlib and
|
||
|
libbzip2.
|
||
|
|
||
|
The lzmadec command line tool was converted to use liblzmadec.
|
||
|
|
||
|
Alexandre Sauvé helped converting build system to use GNU Autotools.
|
||
|
This made is easier to test for certain less portable features needed
|
||
|
by the new command line tool.
|
||
|
|
||
|
Since the new command line tool never got completely finished (for
|
||
|
example, it didn't support LZMA_OPT environment variable), the intent
|
||
|
was to not call 4.32.x stable. Similarly, liblzmadec wasn't polished,
|
||
|
but appeared to work well enough, so some people started using it too.
|
||
|
|
||
|
Because the development of the third generation of LZMA Utils was
|
||
|
delayed considerably (3-4 years), the 4.32.x branch had to be kept
|
||
|
maintained. It got some bug fixes now and then, and finally it was
|
||
|
decided to call it stable, although most of the missing features were
|
||
|
never added.
|
||
|
|
||
|
|
||
|
File format problems
|
||
|
|
||
|
The file format used by LZMA_Alone was primitive. It was designed for
|
||
|
embedded systems in mind, and thus provided only minimal set of
|
||
|
features. The two biggest problems for non-embedded use were lack of
|
||
|
magic bytes and integrity check.
|
||
|
|
||
|
Igor and Lasse started developing a new file format with some help
|
||
|
from Ville Koskinen. Also Mark Adler, Mikko Pouru, H. Peter Anvin,
|
||
|
and Lars Wirzenius helped with some minor things at some point of the
|
||
|
development. Designing the new format took quite a long time (actually,
|
||
|
too long time would be more appropriate expression). It was mostly
|
||
|
because Lasse was quite slow at getting things done due to personal
|
||
|
reasons.
|
||
|
|
||
|
Originally the new format was supposed to use the same .lzma suffix
|
||
|
that was already used by the old file format. Switching to the new
|
||
|
format wouldn't have caused much trouble when the old format wasn't
|
||
|
used by many people. But since the development of the new format took
|
||
|
so long time, the old format got quite popular, and it was decided
|
||
|
that the new file format must use a different suffix.
|
||
|
|
||
|
It was decided to use .xz as the suffix of the new file format. The
|
||
|
first stable .xz file format specification was finally released in
|
||
|
December 2008. In addition to fixing the most obvious problems of
|
||
|
the old .lzma format, the .xz format added some new features like
|
||
|
support for multiple filters (compression algorithms), filter chaining
|
||
|
(like piping on the command line), and limited random-access reading.
|
||
|
|
||
|
Currently the primary compression algorithm used in .xz is LZMA2.
|
||
|
It is an extension on top of the original LZMA to fix some practical
|
||
|
problems: LZMA2 adds support for flushing the encoder, uncompressed
|
||
|
chunks, eases stateful decoder implementations, and improves support
|
||
|
for multithreading. Since LZMA2 is better than the original LZMA, the
|
||
|
original LZMA is not supported in .xz.
|
||
|
|
||
|
|
||
|
Transition to XZ Utils
|
||
|
|
||
|
The early versions of XZ Utils were called LZMA Utils. The first
|
||
|
releases were 4.42.0alphas. They dropped the rest of the C++ LZMA SDK.
|
||
|
The code was still directly based on LZMA SDK but ported to C and
|
||
|
converted from callback API to stateful API. Later, Igor Pavlov made
|
||
|
C version of the LZMA encoder too; these ports from C++ to C were
|
||
|
independent in LZMA SDK and LZMA Utils.
|
||
|
|
||
|
The core of the new LZMA Utils was liblzma, a compression library with
|
||
|
zlib-like API. liblzma supported both the old and new file format. The
|
||
|
gzip-like lzma command line tool was rewritten to use liblzma.
|
||
|
|
||
|
The new LZMA Utils code base was renamed to XZ Utils when the name
|
||
|
of the new file format had been decided. The liblzma compression
|
||
|
library retained its name though, because changing it would have
|
||
|
caused unnecessary breakage in applications already using the early
|
||
|
liblzma snapshots.
|
||
|
|
||
|
The xz command line tool can emulate the gzip-like lzma tool by
|
||
|
creating appropriate symlinks (e.g. lzma -> xz). Thus, practically
|
||
|
all scripts using the lzma tool from LZMA Utils will work as is with
|
||
|
XZ Utils (and will keep using the old .lzma format). Still, the .lzma
|
||
|
format is more or less deprecated. XZ Utils will keep supporting it,
|
||
|
but new applications should use the .xz format, and migrating old
|
||
|
applications to .xz is often a good idea too.
|
||
|
|