| |
| History of LZMA Utils and XZ Utils |
| ================================== |
| |
| Tukaani distribution |
| |
| In 2005, there was a small group working on the Tukaani distribution, |
| which was a Slackware fork. One of the project's 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, the 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 a wrapper that had a 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 to 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 some 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 the LZMA_Alone executable was simply named lzma like the new |
| command-line tool, but they had a 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 an 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 the build system to use GNU |
| Autotools. This made it 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 the 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 with |
| embedded systems in mind, and thus provided only a minimal set of |
| features. The two biggest problems for non-embedded use were the lack |
| of magic bytes and an 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 a time would be a 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 |
| such a 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 a callback API to a stateful API. Later, Igor Pavlov |
| made a 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 |
| a 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. |
| |