2608 lines
58 KiB
Groff
2608 lines
58 KiB
Groff
'\" t
|
|
.\"
|
|
.\" Author: Lasse Collin
|
|
.\"
|
|
.\" This file has been put into the public domain.
|
|
.\" You can do whatever you want with this file.
|
|
.\"
|
|
.TH XZ 1 "2011-04-12" "Tukaani" "XZ Utils"
|
|
.
|
|
.SH NAME
|
|
xz, unxz, xzcat, lzma, unlzma, lzcat \- Compress or decompress .xz and .lzma files
|
|
.
|
|
.SH SYNOPSIS
|
|
.B xz
|
|
.RI [ option ]...
|
|
.RI [ file ]...
|
|
.PP
|
|
.B unxz
|
|
is equivalent to
|
|
.BR "xz \-\-decompress" .
|
|
.br
|
|
.B xzcat
|
|
is equivalent to
|
|
.BR "xz \-\-decompress \-\-stdout" .
|
|
.br
|
|
.B lzma
|
|
is equivalent to
|
|
.BR "xz \-\-format=lzma" .
|
|
.br
|
|
.B unlzma
|
|
is equivalent to
|
|
.BR "xz \-\-format=lzma \-\-decompress" .
|
|
.br
|
|
.B lzcat
|
|
is equivalent to
|
|
.BR "xz \-\-format=lzma \-\-decompress \-\-stdout" .
|
|
.PP
|
|
When writing scripts that need to decompress files,
|
|
it is recommended to always use the name
|
|
.B xz
|
|
with appropriate arguments
|
|
.RB ( "xz \-d"
|
|
or
|
|
.BR "xz \-dc" )
|
|
instead of the names
|
|
.B unxz
|
|
and
|
|
.BR xzcat .
|
|
.
|
|
.SH DESCRIPTION
|
|
.B xz
|
|
is a general-purpose data compression tool with
|
|
command line syntax similar to
|
|
.BR gzip (1)
|
|
and
|
|
.BR bzip2 (1).
|
|
The native file format is the
|
|
.B .xz
|
|
format, but the legacy
|
|
.B .lzma
|
|
format used by LZMA Utils and
|
|
raw compressed streams with no container format headers
|
|
are also supported.
|
|
.PP
|
|
.B xz
|
|
compresses or decompresses each
|
|
.I file
|
|
according to the selected operation mode.
|
|
If no
|
|
.I files
|
|
are given or
|
|
.I file
|
|
is
|
|
.BR \- ,
|
|
.B xz
|
|
reads from standard input and writes the processed data
|
|
to standard output.
|
|
.B xz
|
|
will refuse (display an error and skip the
|
|
.IR file )
|
|
to write compressed data to standard output if it is a terminal.
|
|
Similarly,
|
|
.B xz
|
|
will refuse to read compressed data
|
|
from standard input if it is a terminal.
|
|
.PP
|
|
Unless
|
|
.B \-\-stdout
|
|
is specified,
|
|
.I files
|
|
other than
|
|
.B \-
|
|
are written to a new file whose name is derived from the source
|
|
.I file
|
|
name:
|
|
.IP \(bu 3
|
|
When compressing, the suffix of the target file format
|
|
.RB ( .xz
|
|
or
|
|
.BR .lzma )
|
|
is appended to the source filename to get the target filename.
|
|
.IP \(bu 3
|
|
When decompressing, the
|
|
.B .xz
|
|
or
|
|
.B .lzma
|
|
suffix is removed from the filename to get the target filename.
|
|
.B xz
|
|
also recognizes the suffixes
|
|
.B .txz
|
|
and
|
|
.BR .tlz ,
|
|
and replaces them with the
|
|
.B .tar
|
|
suffix.
|
|
.PP
|
|
If the target file already exists, an error is displayed and the
|
|
.I file
|
|
is skipped.
|
|
.PP
|
|
Unless writing to standard output,
|
|
.B xz
|
|
will display a warning and skip the
|
|
.I file
|
|
if any of the following applies:
|
|
.IP \(bu 3
|
|
.I File
|
|
is not a regular file.
|
|
Symbolic links are not followed,
|
|
and thus they are not considered to be regular files.
|
|
.IP \(bu 3
|
|
.I File
|
|
has more than one hard link.
|
|
.IP \(bu 3
|
|
.I File
|
|
has setuid, setgid, or sticky bit set.
|
|
.IP \(bu 3
|
|
The operation mode is set to compress and the
|
|
.I file
|
|
already has a suffix of the target file format
|
|
.RB ( .xz
|
|
or
|
|
.B .txz
|
|
when compressing to the
|
|
.B .xz
|
|
format, and
|
|
.B .lzma
|
|
or
|
|
.B .tlz
|
|
when compressing to the
|
|
.B .lzma
|
|
format).
|
|
.IP \(bu 3
|
|
The operation mode is set to decompress and the
|
|
.I file
|
|
doesn't have a suffix of any of the supported file formats
|
|
.RB ( .xz ,
|
|
.BR .txz ,
|
|
.BR .lzma ,
|
|
or
|
|
.BR .tlz ).
|
|
.PP
|
|
After successfully compressing or decompressing the
|
|
.IR file ,
|
|
.B xz
|
|
copies the owner, group, permissions, access time,
|
|
and modification time from the source
|
|
.I file
|
|
to the target file.
|
|
If copying the group fails, the permissions are modified
|
|
so that the target file doesn't become accessible to users
|
|
who didn't have permission to access the source
|
|
.IR file .
|
|
.B xz
|
|
doesn't support copying other metadata like access control lists
|
|
or extended attributes yet.
|
|
.PP
|
|
Once the target file has been successfully closed, the source
|
|
.I file
|
|
is removed unless
|
|
.B \-\-keep
|
|
was specified.
|
|
The source
|
|
.I file
|
|
is never removed if the output is written to standard output.
|
|
.PP
|
|
Sending
|
|
.B SIGINFO
|
|
or
|
|
.B SIGUSR1
|
|
to the
|
|
.B xz
|
|
process makes it print progress information to standard error.
|
|
This has only limited use since when standard error
|
|
is a terminal, using
|
|
.B \-\-verbose
|
|
will display an automatically updating progress indicator.
|
|
.
|
|
.SS "Memory usage"
|
|
The memory usage of
|
|
.B xz
|
|
varies from a few hundred kilobytes to several gigabytes
|
|
depending on the compression settings.
|
|
The settings used when compressing a file determine
|
|
the memory requirements of the decompressor.
|
|
Typically the decompressor needs 5\ % to 20\ % of
|
|
the amount of memory that the compressor needed when
|
|
creating the file.
|
|
For example, decompressing a file created with
|
|
.B xz \-9
|
|
currently requires 65\ MiB of memory.
|
|
Still, it is possible to have
|
|
.B .xz
|
|
files that require several gigabytes of memory to decompress.
|
|
.PP
|
|
Especially users of older systems may find
|
|
the possibility of very large memory usage annoying.
|
|
To prevent uncomfortable surprises,
|
|
.B xz
|
|
has a built-in memory usage limiter, which is disabled by default.
|
|
While some operating systems provide ways to limit
|
|
the memory usage of processes, relying on it
|
|
wasn't deemed to be flexible enough (e.g. using
|
|
.BR ulimit (1)
|
|
to limit virtual memory tends to cripple
|
|
.BR mmap (2)).
|
|
.PP
|
|
The memory usage limiter can be enabled with
|
|
the command line option \fB\-\-memlimit=\fIlimit\fR.
|
|
Often it is more convenient to enable the limiter
|
|
by default by setting the environment variable
|
|
.BR XZ_DEFAULTS ,
|
|
e.g.\&
|
|
.BR XZ_DEFAULTS=\-\-memlimit=150MiB .
|
|
It is possible to set the limits separately
|
|
for compression and decompression
|
|
by using \fB\-\-memlimit\-compress=\fIlimit\fR and
|
|
\fB\-\-memlimit\-decompress=\fIlimit\fR.
|
|
Using these two options outside
|
|
.B XZ_DEFAULTS
|
|
is rarely useful because a single run of
|
|
.B xz
|
|
cannot do both compression and decompression and
|
|
.BI \-\-memlimit= limit
|
|
(or \fB\-M\fR \fIlimit\fR)
|
|
is shorter to type on the command line.
|
|
.PP
|
|
If the specified memory usage limit is exceeded when decompressing,
|
|
.B xz
|
|
will display an error and decompressing the file will fail.
|
|
If the limit is exceeded when compressing,
|
|
.B xz
|
|
will try to scale the settings down so that the limit
|
|
is no longer exceeded (except when using \fB\-\-format=raw\fR
|
|
or \fB\-\-no\-adjust\fR).
|
|
This way the operation won't fail unless the limit is very small.
|
|
The scaling of the settings is done in steps that don't
|
|
match the compression level presets, e.g. if the limit is
|
|
only slightly less than the amount required for
|
|
.BR "xz \-9" ,
|
|
the settings will be scaled down only a little,
|
|
not all the way down to
|
|
.BR "xz \-8" .
|
|
.
|
|
.SS "Concatenation and padding with .xz files"
|
|
It is possible to concatenate
|
|
.B .xz
|
|
files as is.
|
|
.B xz
|
|
will decompress such files as if they were a single
|
|
.B .xz
|
|
file.
|
|
.PP
|
|
It is possible to insert padding between the concatenated parts
|
|
or after the last part.
|
|
The padding must consist of null bytes and the size
|
|
of the padding must be a multiple of four bytes.
|
|
This can be useful e.g. if the
|
|
.B .xz
|
|
file is stored on a medium that measures file sizes
|
|
in 512-byte blocks.
|
|
.PP
|
|
Concatenation and padding are not allowed with
|
|
.B .lzma
|
|
files or raw streams.
|
|
.
|
|
.SH OPTIONS
|
|
.
|
|
.SS "Integer suffixes and special values"
|
|
In most places where an integer argument is expected,
|
|
an optional suffix is supported to easily indicate large integers.
|
|
There must be no space between the integer and the suffix.
|
|
.TP
|
|
.B KiB
|
|
Multiply the integer by 1,024 (2^10).
|
|
.BR Ki ,
|
|
.BR k ,
|
|
.BR kB ,
|
|
.BR K ,
|
|
and
|
|
.B KB
|
|
are accepted as synonyms for
|
|
.BR KiB .
|
|
.TP
|
|
.B MiB
|
|
Multiply the integer by 1,048,576 (2^20).
|
|
.BR Mi ,
|
|
.BR m ,
|
|
.BR M ,
|
|
and
|
|
.B MB
|
|
are accepted as synonyms for
|
|
.BR MiB .
|
|
.TP
|
|
.B GiB
|
|
Multiply the integer by 1,073,741,824 (2^30).
|
|
.BR Gi ,
|
|
.BR g ,
|
|
.BR G ,
|
|
and
|
|
.B GB
|
|
are accepted as synonyms for
|
|
.BR GiB .
|
|
.PP
|
|
The special value
|
|
.B max
|
|
can be used to indicate the maximum integer value
|
|
supported by the option.
|
|
.
|
|
.SS "Operation mode"
|
|
If multiple operation mode options are given,
|
|
the last one takes effect.
|
|
.TP
|
|
.BR \-z ", " \-\-compress
|
|
Compress.
|
|
This is the default operation mode when no operation mode option
|
|
is specified and no other operation mode is implied from
|
|
the command name (for example,
|
|
.B unxz
|
|
implies
|
|
.BR \-\-decompress ).
|
|
.TP
|
|
.BR \-d ", " \-\-decompress ", " \-\-uncompress
|
|
Decompress.
|
|
.TP
|
|
.BR \-t ", " \-\-test
|
|
Test the integrity of compressed
|
|
.IR files .
|
|
This option is equivalent to
|
|
.B "\-\-decompress \-\-stdout"
|
|
except that the decompressed data is discarded instead of being
|
|
written to standard output.
|
|
No files are created or removed.
|
|
.TP
|
|
.BR \-l ", " \-\-list
|
|
Print information about compressed
|
|
.IR files .
|
|
No uncompressed output is produced,
|
|
and no files are created or removed.
|
|
In list mode, the program cannot read
|
|
the compressed data from standard
|
|
input or from other unseekable sources.
|
|
.IP ""
|
|
The default listing shows basic information about
|
|
.IR files ,
|
|
one file per line.
|
|
To get more detailed information, use also the
|
|
.B \-\-verbose
|
|
option.
|
|
For even more information, use
|
|
.B \-\-verbose
|
|
twice, but note that this may be slow, because getting all the extra
|
|
information requires many seeks.
|
|
The width of verbose output exceeds
|
|
80 characters, so piping the output to e.g.\&
|
|
.B "less\ \-S"
|
|
may be convenient if the terminal isn't wide enough.
|
|
.IP ""
|
|
The exact output may vary between
|
|
.B xz
|
|
versions and different locales.
|
|
For machine-readable output,
|
|
.B \-\-robot \-\-list
|
|
should be used.
|
|
.
|
|
.SS "Operation modifiers"
|
|
.TP
|
|
.BR \-k ", " \-\-keep
|
|
Don't delete the input files.
|
|
.TP
|
|
.BR \-f ", " \-\-force
|
|
This option has several effects:
|
|
.RS
|
|
.IP \(bu 3
|
|
If the target file already exists,
|
|
delete it before compressing or decompressing.
|
|
.IP \(bu 3
|
|
Compress or decompress even if the input is
|
|
a symbolic link to a regular file,
|
|
has more than one hard link,
|
|
or has the setuid, setgid, or sticky bit set.
|
|
The setuid, setgid, and sticky bits are not copied
|
|
to the target file.
|
|
.IP \(bu 3
|
|
When used with
|
|
.B \-\-decompress
|
|
.BR \-\-stdout
|
|
and
|
|
.B xz
|
|
cannot recognize the type of the source file,
|
|
copy the source file as is to standard output.
|
|
This allows
|
|
.B xzcat
|
|
.B \-\-force
|
|
to be used like
|
|
.BR cat (1)
|
|
for files that have not been compressed with
|
|
.BR xz .
|
|
Note that in future,
|
|
.B xz
|
|
might support new compressed file formats, which may make
|
|
.B xz
|
|
decompress more types of files instead of copying them as is to
|
|
standard output.
|
|
.BI \-\-format= format
|
|
can be used to restrict
|
|
.B xz
|
|
to decompress only a single file format.
|
|
.RE
|
|
.TP
|
|
.BR \-c ", " \-\-stdout ", " \-\-to\-stdout
|
|
Write the compressed or decompressed data to
|
|
standard output instead of a file.
|
|
This implies
|
|
.BR \-\-keep .
|
|
.TP
|
|
.B \-\-single\-stream
|
|
Decompress only the first
|
|
.B .xz
|
|
stream, and
|
|
silently ignore possible remaining input data following the stream.
|
|
Normally such trailing garbage makes
|
|
.B xz
|
|
display an error.
|
|
.IP ""
|
|
.B xz
|
|
never decompresses more than one stream from
|
|
.B .lzma
|
|
files or raw streams, but this option still makes
|
|
.B xz
|
|
ignore the possible trailing data after the
|
|
.B .lzma
|
|
file or raw stream.
|
|
.IP ""
|
|
This option has no effect if the operation mode is not
|
|
.B \-\-decompress
|
|
or
|
|
.BR \-\-test .
|
|
.TP
|
|
.B \-\-no\-sparse
|
|
Disable creation of sparse files.
|
|
By default, if decompressing into a regular file,
|
|
.B xz
|
|
tries to make the file sparse if the decompressed data contains
|
|
long sequences of binary zeros.
|
|
It also works when writing to standard output
|
|
as long as standard output is connected to a regular file
|
|
and certain additional conditions are met to make it safe.
|
|
Creating sparse files may save disk space and speed up
|
|
the decompression by reducing the amount of disk I/O.
|
|
.TP
|
|
\fB\-S\fR \fI.suf\fR, \fB\-\-suffix=\fI.suf
|
|
When compressing, use
|
|
.I .suf
|
|
as the suffix for the target file instead of
|
|
.B .xz
|
|
or
|
|
.BR .lzma .
|
|
If not writing to standard output and
|
|
the source file already has the suffix
|
|
.IR .suf ,
|
|
a warning is displayed and the file is skipped.
|
|
.IP ""
|
|
When decompressing, recognize files with the suffix
|
|
.I .suf
|
|
in addition to files with the
|
|
.BR .xz ,
|
|
.BR .txz ,
|
|
.BR .lzma ,
|
|
or
|
|
.B .tlz
|
|
suffix.
|
|
If the source file has the suffix
|
|
.IR .suf ,
|
|
the suffix is removed to get the target filename.
|
|
.IP ""
|
|
When compressing or decompressing raw streams
|
|
.RB ( \-\-format=raw ),
|
|
the suffix must always be specified unless
|
|
writing to standard output,
|
|
because there is no default suffix for raw streams.
|
|
.TP
|
|
\fB\-\-files\fR[\fB=\fIfile\fR]
|
|
Read the filenames to process from
|
|
.IR file ;
|
|
if
|
|
.I file
|
|
is omitted, filenames are read from standard input.
|
|
Filenames must be terminated with the newline character.
|
|
A dash
|
|
.RB ( \- )
|
|
is taken as a regular filename; it doesn't mean standard input.
|
|
If filenames are given also as command line arguments, they are
|
|
processed before the filenames read from
|
|
.IR file .
|
|
.TP
|
|
\fB\-\-files0\fR[\fB=\fIfile\fR]
|
|
This is identical to \fB\-\-files\fR[\fB=\fIfile\fR] except
|
|
that each filename must be terminated with the null character.
|
|
.
|
|
.SS "Basic file format and compression options"
|
|
.TP
|
|
\fB\-F\fR \fIformat\fR, \fB\-\-format=\fIformat
|
|
Specify the file
|
|
.I format
|
|
to compress or decompress:
|
|
.RS
|
|
.TP
|
|
.B auto
|
|
This is the default.
|
|
When compressing,
|
|
.B auto
|
|
is equivalent to
|
|
.BR xz .
|
|
When decompressing,
|
|
the format of the input file is automatically detected.
|
|
Note that raw streams (created with
|
|
.BR \-\-format=raw )
|
|
cannot be auto-detected.
|
|
.TP
|
|
.B xz
|
|
Compress to the
|
|
.B .xz
|
|
file format, or accept only
|
|
.B .xz
|
|
files when decompressing.
|
|
.TP
|
|
.BR lzma ", " alone
|
|
Compress to the legacy
|
|
.B .lzma
|
|
file format, or accept only
|
|
.B .lzma
|
|
files when decompressing.
|
|
The alternative name
|
|
.B alone
|
|
is provided for backwards compatibility with LZMA Utils.
|
|
.TP
|
|
.B raw
|
|
Compress or uncompress a raw stream (no headers).
|
|
This is meant for advanced users only.
|
|
To decode raw streams, you need use
|
|
.B \-\-format=raw
|
|
and explicitly specify the filter chain,
|
|
which normally would have been stored in the container headers.
|
|
.RE
|
|
.TP
|
|
\fB\-C\fR \fIcheck\fR, \fB\-\-check=\fIcheck
|
|
Specify the type of the integrity check.
|
|
The check is calculated from the uncompressed data and
|
|
stored in the
|
|
.B .xz
|
|
file.
|
|
This option has an effect only when compressing into the
|
|
.B .xz
|
|
format; the
|
|
.B .lzma
|
|
format doesn't support integrity checks.
|
|
The integrity check (if any) is verified when the
|
|
.B .xz
|
|
file is decompressed.
|
|
.IP ""
|
|
Supported
|
|
.I check
|
|
types:
|
|
.RS
|
|
.TP
|
|
.B none
|
|
Don't calculate an integrity check at all.
|
|
This is usually a bad idea.
|
|
This can be useful when integrity of the data is verified
|
|
by other means anyway.
|
|
.TP
|
|
.B crc32
|
|
Calculate CRC32 using the polynomial from IEEE-802.3 (Ethernet).
|
|
.TP
|
|
.B crc64
|
|
Calculate CRC64 using the polynomial from ECMA-182.
|
|
This is the default, since it is slightly better than CRC32
|
|
at detecting damaged files and the speed difference is negligible.
|
|
.TP
|
|
.B sha256
|
|
Calculate SHA-256.
|
|
This is somewhat slower than CRC32 and CRC64.
|
|
.RE
|
|
.IP ""
|
|
Integrity of the
|
|
.B .xz
|
|
headers is always verified with CRC32.
|
|
It is not possible to change or disable it.
|
|
.TP
|
|
.BR \-0 " ... " \-9
|
|
Select a compression preset level.
|
|
The default is
|
|
.BR \-6 .
|
|
If multiple preset levels are specified,
|
|
the last one takes effect.
|
|
If a custom filter chain was already specified, setting
|
|
a compression preset level clears the custom filter chain.
|
|
.IP ""
|
|
The differences between the presets are more significant than with
|
|
.BR gzip (1)
|
|
and
|
|
.BR bzip2 (1).
|
|
The selected compression settings determine
|
|
the memory requirements of the decompressor,
|
|
thus using a too high preset level might make it painful
|
|
to decompress the file on an old system with little RAM.
|
|
Specifically,
|
|
.B "it's not a good idea to blindly use \-9 for everything"
|
|
like it often is with
|
|
.BR gzip (1)
|
|
and
|
|
.BR bzip2 (1).
|
|
.RS
|
|
.TP
|
|
.BR "\-0" " ... " "\-3"
|
|
These are somewhat fast presets.
|
|
.B \-0
|
|
is sometimes faster than
|
|
.B "gzip \-9"
|
|
while compressing much better.
|
|
The higher ones often have speed comparable to
|
|
.BR bzip2 (1)
|
|
with comparable or better compression ratio,
|
|
although the results
|
|
depend a lot on the type of data being compressed.
|
|
.TP
|
|
.BR "\-4" " ... " "\-6"
|
|
Good to very good compression while keeping
|
|
decompressor memory usage reasonable even for old systems.
|
|
.B \-6
|
|
is the default, which is usually a good choice
|
|
e.g. for distributing files that need to be decompressible
|
|
even on systems with only 16\ MiB RAM.
|
|
.RB ( \-5e
|
|
or
|
|
.B \-6e
|
|
may be worth considering too.
|
|
See
|
|
.BR \-\-extreme .)
|
|
.TP
|
|
.B "\-7 ... \-9"
|
|
These are like
|
|
.B \-6
|
|
but with higher compressor and decompressor memory requirements.
|
|
These are useful only when compressing files bigger than
|
|
8\ MiB, 16\ MiB, and 32\ MiB, respectively.
|
|
.RE
|
|
.IP ""
|
|
On the same hardware, the decompression speed is approximately
|
|
a constant number of bytes of compressed data per second.
|
|
In other words, the better the compression,
|
|
the faster the decompression will usually be.
|
|
This also means that the amount of uncompressed output
|
|
produced per second can vary a lot.
|
|
.IP ""
|
|
The following table summarises the features of the presets:
|
|
.RS
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
c c c c c
|
|
n n n n n.
|
|
Preset;DictSize;CompCPU;CompMem;DecMem
|
|
\-0;256 KiB;0;3 MiB;1 MiB
|
|
\-1;1 MiB;1;9 MiB;2 MiB
|
|
\-2;2 MiB;2;17 MiB;3 MiB
|
|
\-3;4 MiB;3;32 MiB;5 MiB
|
|
\-4;4 MiB;4;48 MiB;5 MiB
|
|
\-5;8 MiB;5;94 MiB;9 MiB
|
|
\-6;8 MiB;6;94 MiB;9 MiB
|
|
\-7;16 MiB;6;186 MiB;17 MiB
|
|
\-8;32 MiB;6;370 MiB;33 MiB
|
|
\-9;64 MiB;6;674 MiB;65 MiB
|
|
.TE
|
|
.RE
|
|
.RE
|
|
.IP ""
|
|
Column descriptions:
|
|
.RS
|
|
.IP \(bu 3
|
|
DictSize is the LZMA2 dictionary size.
|
|
It is waste of memory to use a dictionary bigger than
|
|
the size of the uncompressed file.
|
|
This is why it is good to avoid using the presets
|
|
.BR \-7 " ... " \-9
|
|
when there's no real need for them.
|
|
At
|
|
.B \-6
|
|
and lower, the amount of memory wasted is
|
|
usually low enough to not matter.
|
|
.IP \(bu 3
|
|
CompCPU is a simplified representation of the LZMA2 settings
|
|
that affect compression speed.
|
|
The dictionary size affects speed too,
|
|
so while CompCPU is the same for levels
|
|
.BR \-6 " ... " \-9 ,
|
|
higher levels still tend to be a little slower.
|
|
To get even slower and thus possibly better compression, see
|
|
.BR \-\-extreme .
|
|
.IP \(bu 3
|
|
CompMem contains the compressor memory requirements
|
|
in the single-threaded mode.
|
|
It may vary slightly between
|
|
.B xz
|
|
versions.
|
|
Memory requirements of some of the future multithreaded modes may
|
|
be dramatically higher than that of the single-threaded mode.
|
|
.IP \(bu 3
|
|
DecMem contains the decompressor memory requirements.
|
|
That is, the compression settings determine
|
|
the memory requirements of the decompressor.
|
|
The exact decompressor memory usage is slighly more than
|
|
the LZMA2 dictionary size, but the values in the table
|
|
have been rounded up to the next full MiB.
|
|
.RE
|
|
.TP
|
|
.BR \-e ", " \-\-extreme
|
|
Use a slower variant of the selected compression preset level
|
|
.RB ( \-0 " ... " \-9 )
|
|
to hopefully get a little bit better compression ratio,
|
|
but with bad luck this can also make it worse.
|
|
Decompressor memory usage is not affected,
|
|
but compressor memory usage increases a little at preset levels
|
|
.BR \-0 " ... " \-3 .
|
|
.IP ""
|
|
Since there are two presets with dictionary sizes
|
|
4\ MiB and 8\ MiB, the presets
|
|
.B \-3e
|
|
and
|
|
.B \-5e
|
|
use slightly faster settings (lower CompCPU) than
|
|
.B \-4e
|
|
and
|
|
.BR \-6e ,
|
|
respectively.
|
|
That way no two presets are identical.
|
|
.RS
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
c c c c c
|
|
n n n n n.
|
|
Preset;DictSize;CompCPU;CompMem;DecMem
|
|
\-0e;256 KiB;8;4 MiB;1 MiB
|
|
\-1e;1 MiB;8;13 MiB;2 MiB
|
|
\-2e;2 MiB;8;25 MiB;3 MiB
|
|
\-3e;4 MiB;7;48 MiB;5 MiB
|
|
\-4e;4 MiB;8;48 MiB;5 MiB
|
|
\-5e;8 MiB;7;94 MiB;9 MiB
|
|
\-6e;8 MiB;8;94 MiB;9 MiB
|
|
\-7e;16 MiB;8;186 MiB;17 MiB
|
|
\-8e;32 MiB;8;370 MiB;33 MiB
|
|
\-9e;64 MiB;8;674 MiB;65 MiB
|
|
.TE
|
|
.RE
|
|
.RE
|
|
.IP ""
|
|
For example, there are a total of four presets that use
|
|
8\ MiB dictionary, whose order from the fastest to the slowest is
|
|
.BR \-5 ,
|
|
.BR \-6 ,
|
|
.BR \-5e ,
|
|
and
|
|
.BR \-6e .
|
|
.TP
|
|
.B \-\-fast
|
|
.PD 0
|
|
.TP
|
|
.B \-\-best
|
|
.PD
|
|
These are somewhat misleading aliases for
|
|
.B \-0
|
|
and
|
|
.BR \-9 ,
|
|
respectively.
|
|
These are provided only for backwards compatibility
|
|
with LZMA Utils.
|
|
Avoid using these options.
|
|
.TP
|
|
.BI \-\-block\-size= size
|
|
When compressing to the
|
|
.B .xz
|
|
format, split the input data into blocks of
|
|
.I size
|
|
bytes.
|
|
The blocks are compressed independently from each other.
|
|
.\" FIXME: Explain how to his can be used for random access and threading.
|
|
.TP
|
|
.BI \-\-memlimit\-compress= limit
|
|
Set a memory usage limit for compression.
|
|
If this option is specified multiple times,
|
|
the last one takes effect.
|
|
.IP ""
|
|
If the compression settings exceed the
|
|
.IR limit ,
|
|
.B xz
|
|
will adjust the settings downwards so that
|
|
the limit is no longer exceeded and display a notice that
|
|
automatic adjustment was done.
|
|
Such adjustments are not made when compressing with
|
|
.B \-\-format=raw
|
|
or if
|
|
.B \-\-no\-adjust
|
|
has been specified.
|
|
In those cases, an error is displayed and
|
|
.B xz
|
|
will exit with exit status 1.
|
|
.IP ""
|
|
The
|
|
.I limit
|
|
can be specified in multiple ways:
|
|
.RS
|
|
.IP \(bu 3
|
|
The
|
|
.I limit
|
|
can be an absolute value in bytes.
|
|
Using an integer suffix like
|
|
.B MiB
|
|
can be useful.
|
|
Example:
|
|
.B "\-\-memlimit\-compress=80MiB"
|
|
.IP \(bu 3
|
|
The
|
|
.I limit
|
|
can be specified as a percentage of total physical memory (RAM).
|
|
This can be useful especially when setting the
|
|
.B XZ_DEFAULTS
|
|
environment variable in a shell initialization script
|
|
that is shared between different computers.
|
|
That way the limit is automatically bigger
|
|
on systems with more memory.
|
|
Example:
|
|
.B "\-\-memlimit\-compress=70%"
|
|
.IP \(bu 3
|
|
The
|
|
.I limit
|
|
can be reset back to its default value by setting it to
|
|
.BR 0 .
|
|
This is currently equivalent to setting the
|
|
.I limit
|
|
to
|
|
.B max
|
|
(no memory usage limit).
|
|
Once multithreading support has been implemented,
|
|
there may be a difference between
|
|
.B 0
|
|
and
|
|
.B max
|
|
for the multithreaded case, so it is recommended to use
|
|
.B 0
|
|
instead of
|
|
.B max
|
|
until the details have been decided.
|
|
.RE
|
|
.IP ""
|
|
See also the section
|
|
.BR "Memory usage" .
|
|
.TP
|
|
.BI \-\-memlimit\-decompress= limit
|
|
Set a memory usage limit for decompression.
|
|
This also affects the
|
|
.B \-\-list
|
|
mode.
|
|
If the operation is not possible without exceeding the
|
|
.IR limit ,
|
|
.B xz
|
|
will display an error and decompressing the file will fail.
|
|
See
|
|
.BI \-\-memlimit\-compress= limit
|
|
for possible ways to specify the
|
|
.IR limit .
|
|
.TP
|
|
\fB\-M\fR \fIlimit\fR, \fB\-\-memlimit=\fIlimit\fR, \fB\-\-memory=\fIlimit
|
|
This is equivalent to specifying \fB\-\-memlimit\-compress=\fIlimit
|
|
\fB\-\-memlimit\-decompress=\fIlimit\fR.
|
|
.TP
|
|
.B \-\-no\-adjust
|
|
Display an error and exit if the compression settings exceed the
|
|
the memory usage limit.
|
|
The default is to adjust the settings downwards so
|
|
that the memory usage limit is not exceeded.
|
|
Automatic adjusting is always disabled when creating raw streams
|
|
.RB ( \-\-format=raw ).
|
|
.TP
|
|
\fB\-T\fR \fIthreads\fR, \fB\-\-threads=\fIthreads
|
|
Specify the number of worker threads to use.
|
|
Setting
|
|
.I threads
|
|
to a special value
|
|
.B 0
|
|
makes
|
|
.B xz
|
|
use as many threads as there are CPU cores on the system.
|
|
The actual number of threads can be less than
|
|
.I threads
|
|
if the input file is not big enough
|
|
for threading with the given settings or
|
|
if using more threads would exceed the memory usage limit.
|
|
.IP ""
|
|
Currently the only threading method is to split the input into
|
|
blocks and compress them independently from each other.
|
|
The default block size depends on the compression level and
|
|
can be overriden with the
|
|
.BI \-\-block\-size= size
|
|
option.
|
|
.IP ""
|
|
.B "It is possible that the details of this option change before"
|
|
.B "the next stable XZ Utils release."
|
|
.B "This may include the meaning of the special value 0."
|
|
.\" FIXME
|
|
.
|
|
.SS "Custom compressor filter chains"
|
|
A custom filter chain allows specifying
|
|
the compression settings in detail instead of relying on
|
|
the settings associated to the preset levels.
|
|
When a custom filter chain is specified,
|
|
the compression preset level options
|
|
(\fB\-0\fR ... \fB\-9\fR and \fB\-\-extreme\fR) are
|
|
silently ignored.
|
|
.PP
|
|
A filter chain is comparable to piping on the command line.
|
|
When compressing, the uncompressed input goes to the first filter,
|
|
whose output goes to the next filter (if any).
|
|
The output of the last filter gets written to the compressed file.
|
|
The maximum number of filters in the chain is four,
|
|
but typically a filter chain has only one or two filters.
|
|
.PP
|
|
Many filters have limitations on where they can be
|
|
in the filter chain:
|
|
some filters can work only as the last filter in the chain,
|
|
some only as a non-last filter, and some work in any position
|
|
in the chain.
|
|
Depending on the filter, this limitation is either inherent to
|
|
the filter design or exists to prevent security issues.
|
|
.PP
|
|
A custom filter chain is specified by using one or more
|
|
filter options in the order they are wanted in the filter chain.
|
|
That is, the order of filter options is significant!
|
|
When decoding raw streams
|
|
.RB ( \-\-format=raw ),
|
|
the filter chain is specified in the same order as
|
|
it was specified when compressing.
|
|
.PP
|
|
Filters take filter-specific
|
|
.I options
|
|
as a comma-separated list.
|
|
Extra commas in
|
|
.I options
|
|
are ignored.
|
|
Every option has a default value, so you need to
|
|
specify only those you want to change.
|
|
.TP
|
|
\fB\-\-lzma1\fR[\fB=\fIoptions\fR]
|
|
.PD 0
|
|
.TP
|
|
\fB\-\-lzma2\fR[\fB=\fIoptions\fR]
|
|
.PD
|
|
Add LZMA1 or LZMA2 filter to the filter chain.
|
|
These filters can be used only as the last filter in the chain.
|
|
.IP ""
|
|
LZMA1 is a legacy filter,
|
|
which is supported almost solely due to the legacy
|
|
.B .lzma
|
|
file format, which supports only LZMA1.
|
|
LZMA2 is an updated
|
|
version of LZMA1 to fix some practical issues of LZMA1.
|
|
The
|
|
.B .xz
|
|
format uses LZMA2 and doesn't support LZMA1 at all.
|
|
Compression speed and ratios of LZMA1 and LZMA2
|
|
are practically the same.
|
|
.IP ""
|
|
LZMA1 and LZMA2 share the same set of
|
|
.IR options :
|
|
.RS
|
|
.TP
|
|
.BI preset= preset
|
|
Reset all LZMA1 or LZMA2
|
|
.I options
|
|
to
|
|
.IR preset .
|
|
.I Preset
|
|
consist of an integer, which may be followed by single-letter
|
|
preset modifiers.
|
|
The integer can be from
|
|
.B 0
|
|
to
|
|
.BR 9 ,
|
|
matching the command line options \fB\-0\fR ... \fB\-9\fR.
|
|
The only supported modifier is currently
|
|
.BR e ,
|
|
which matches
|
|
.BR \-\-extreme .
|
|
The default
|
|
.I preset
|
|
is
|
|
.BR 6 ,
|
|
from which the default values for the rest of the LZMA1 or LZMA2
|
|
.I options
|
|
are taken.
|
|
.TP
|
|
.BI dict= size
|
|
Dictionary (history buffer)
|
|
.I size
|
|
indicates how many bytes of the recently processed
|
|
uncompressed data is kept in memory.
|
|
The algorithm tries to find repeating byte sequences (matches) in
|
|
the uncompressed data, and replace them with references
|
|
to the data currently in the dictionary.
|
|
The bigger the dictionary, the higher is the chance
|
|
to find a match.
|
|
Thus, increasing dictionary
|
|
.I size
|
|
usually improves compression ratio, but
|
|
a dictionary bigger than the uncompressed file is waste of memory.
|
|
.IP ""
|
|
Typical dictionary
|
|
.I size
|
|
is from 64\ KiB to 64\ MiB.
|
|
The minimum is 4\ KiB.
|
|
The maximum for compression is currently 1.5\ GiB (1536\ MiB).
|
|
The decompressor already supports dictionaries up to
|
|
one byte less than 4\ GiB, which is the maximum for
|
|
the LZMA1 and LZMA2 stream formats.
|
|
.IP ""
|
|
Dictionary
|
|
.I size
|
|
and match finder
|
|
.RI ( mf )
|
|
together determine the memory usage of the LZMA1 or LZMA2 encoder.
|
|
The same (or bigger) dictionary
|
|
.I size
|
|
is required for decompressing that was used when compressing,
|
|
thus the memory usage of the decoder is determined
|
|
by the dictionary size used when compressing.
|
|
The
|
|
.B .xz
|
|
headers store the dictionary
|
|
.I size
|
|
either as
|
|
.RI "2^" n
|
|
or
|
|
.RI "2^" n " + 2^(" n "\-1),"
|
|
so these
|
|
.I sizes
|
|
are somewhat preferred for compression.
|
|
Other
|
|
.I sizes
|
|
will get rounded up when stored in the
|
|
.B .xz
|
|
headers.
|
|
.TP
|
|
.BI lc= lc
|
|
Specify the number of literal context bits.
|
|
The minimum is 0 and the maximum is 4; the default is 3.
|
|
In addition, the sum of
|
|
.I lc
|
|
and
|
|
.I lp
|
|
must not exceed 4.
|
|
.IP ""
|
|
All bytes that cannot be encoded as matches
|
|
are encoded as literals.
|
|
That is, literals are simply 8-bit bytes
|
|
that are encoded one at a time.
|
|
.IP ""
|
|
The literal coding makes an assumption that the highest
|
|
.I lc
|
|
bits of the previous uncompressed byte correlate
|
|
with the next byte.
|
|
E.g. in typical English text, an upper-case letter is
|
|
often followed by a lower-case letter, and a lower-case
|
|
letter is usually followed by another lower-case letter.
|
|
In the US-ASCII character set, the highest three bits are 010
|
|
for upper-case letters and 011 for lower-case letters.
|
|
When
|
|
.I lc
|
|
is at least 3, the literal coding can take advantage of
|
|
this property in the uncompressed data.
|
|
.IP ""
|
|
The default value (3) is usually good.
|
|
If you want maximum compression, test
|
|
.BR lc=4 .
|
|
Sometimes it helps a little, and
|
|
sometimes it makes compression worse.
|
|
If it makes it worse, test e.g.\&
|
|
.B lc=2
|
|
too.
|
|
.TP
|
|
.BI lp= lp
|
|
Specify the number of literal position bits.
|
|
The minimum is 0 and the maximum is 4; the default is 0.
|
|
.IP ""
|
|
.I Lp
|
|
affects what kind of alignment in the uncompressed data is
|
|
assumed when encoding literals.
|
|
See
|
|
.I pb
|
|
below for more information about alignment.
|
|
.TP
|
|
.BI pb= pb
|
|
Specify the number of position bits.
|
|
The minimum is 0 and the maximum is 4; the default is 2.
|
|
.IP ""
|
|
.I Pb
|
|
affects what kind of alignment in the uncompressed data is
|
|
assumed in general.
|
|
The default means four-byte alignment
|
|
.RI (2^ pb =2^2=4),
|
|
which is often a good choice when there's no better guess.
|
|
.IP ""
|
|
When the aligment is known, setting
|
|
.I pb
|
|
accordingly may reduce the file size a little.
|
|
E.g. with text files having one-byte
|
|
alignment (US-ASCII, ISO-8859-*, UTF-8), setting
|
|
.B pb=0
|
|
can improve compression slightly.
|
|
For UTF-16 text,
|
|
.B pb=1
|
|
is a good choice.
|
|
If the alignment is an odd number like 3 bytes,
|
|
.B pb=0
|
|
might be the best choice.
|
|
.IP ""
|
|
Even though the assumed alignment can be adjusted with
|
|
.I pb
|
|
and
|
|
.IR lp ,
|
|
LZMA1 and LZMA2 still slightly favor 16-byte alignment.
|
|
It might be worth taking into account when designing file formats
|
|
that are likely to be often compressed with LZMA1 or LZMA2.
|
|
.TP
|
|
.BI mf= mf
|
|
Match finder has a major effect on encoder speed,
|
|
memory usage, and compression ratio.
|
|
Usually Hash Chain match finders are faster than Binary Tree
|
|
match finders.
|
|
The default depends on the
|
|
.IR preset :
|
|
0 uses
|
|
.BR hc3 ,
|
|
1\-3
|
|
use
|
|
.BR hc4 ,
|
|
and the rest use
|
|
.BR bt4 .
|
|
.IP ""
|
|
The following match finders are supported.
|
|
The memory usage formulas below are rough approximations,
|
|
which are closest to the reality when
|
|
.I dict
|
|
is a power of two.
|
|
.RS
|
|
.TP
|
|
.B hc3
|
|
Hash Chain with 2- and 3-byte hashing
|
|
.br
|
|
Minimum value for
|
|
.IR nice :
|
|
3
|
|
.br
|
|
Memory usage:
|
|
.br
|
|
.I dict
|
|
* 7.5 (if
|
|
.I dict
|
|
<= 16 MiB);
|
|
.br
|
|
.I dict
|
|
* 5.5 + 64 MiB (if
|
|
.I dict
|
|
> 16 MiB)
|
|
.TP
|
|
.B hc4
|
|
Hash Chain with 2-, 3-, and 4-byte hashing
|
|
.br
|
|
Minimum value for
|
|
.IR nice :
|
|
4
|
|
.br
|
|
Memory usage:
|
|
.br
|
|
.I dict
|
|
* 7.5 (if
|
|
.I dict
|
|
<= 32 MiB);
|
|
.br
|
|
.I dict
|
|
* 6.5 (if
|
|
.I dict
|
|
> 32 MiB)
|
|
.TP
|
|
.B bt2
|
|
Binary Tree with 2-byte hashing
|
|
.br
|
|
Minimum value for
|
|
.IR nice :
|
|
2
|
|
.br
|
|
Memory usage:
|
|
.I dict
|
|
* 9.5
|
|
.TP
|
|
.B bt3
|
|
Binary Tree with 2- and 3-byte hashing
|
|
.br
|
|
Minimum value for
|
|
.IR nice :
|
|
3
|
|
.br
|
|
Memory usage:
|
|
.br
|
|
.I dict
|
|
* 11.5 (if
|
|
.I dict
|
|
<= 16 MiB);
|
|
.br
|
|
.I dict
|
|
* 9.5 + 64 MiB (if
|
|
.I dict
|
|
> 16 MiB)
|
|
.TP
|
|
.B bt4
|
|
Binary Tree with 2-, 3-, and 4-byte hashing
|
|
.br
|
|
Minimum value for
|
|
.IR nice :
|
|
4
|
|
.br
|
|
Memory usage:
|
|
.br
|
|
.I dict
|
|
* 11.5 (if
|
|
.I dict
|
|
<= 32 MiB);
|
|
.br
|
|
.I dict
|
|
* 10.5 (if
|
|
.I dict
|
|
> 32 MiB)
|
|
.RE
|
|
.TP
|
|
.BI mode= mode
|
|
Compression
|
|
.I mode
|
|
specifies the method to analyze
|
|
the data produced by the match finder.
|
|
Supported
|
|
.I modes
|
|
are
|
|
.B fast
|
|
and
|
|
.BR normal .
|
|
The default is
|
|
.B fast
|
|
for
|
|
.I presets
|
|
0\-3 and
|
|
.B normal
|
|
for
|
|
.I presets
|
|
4\-9.
|
|
.IP ""
|
|
Usually
|
|
.B fast
|
|
is used with Hash Chain match finders and
|
|
.B normal
|
|
with Binary Tree match finders.
|
|
This is also what the
|
|
.I presets
|
|
do.
|
|
.TP
|
|
.BI nice= nice
|
|
Specify what is considered to be a nice length for a match.
|
|
Once a match of at least
|
|
.I nice
|
|
bytes is found, the algorithm stops
|
|
looking for possibly better matches.
|
|
.IP ""
|
|
.I Nice
|
|
can be 2\-273 bytes.
|
|
Higher values tend to give better compression ratio
|
|
at the expense of speed.
|
|
The default depends on the
|
|
.IR preset .
|
|
.TP
|
|
.BI depth= depth
|
|
Specify the maximum search depth in the match finder.
|
|
The default is the special value of 0,
|
|
which makes the compressor determine a reasonable
|
|
.I depth
|
|
from
|
|
.I mf
|
|
and
|
|
.IR nice .
|
|
.IP ""
|
|
Reasonable
|
|
.I depth
|
|
for Hash Chains is 4\-100 and 16\-1000 for Binary Trees.
|
|
Using very high values for
|
|
.I depth
|
|
can make the encoder extremely slow with some files.
|
|
Avoid setting the
|
|
.I depth
|
|
over 1000 unless you are prepared to interrupt
|
|
the compression in case it is taking far too long.
|
|
.RE
|
|
.IP ""
|
|
When decoding raw streams
|
|
.RB ( \-\-format=raw ),
|
|
LZMA2 needs only the dictionary
|
|
.IR size .
|
|
LZMA1 needs also
|
|
.IR lc ,
|
|
.IR lp ,
|
|
and
|
|
.IR pb .
|
|
.TP
|
|
\fB\-\-x86\fR[\fB=\fIoptions\fR]
|
|
.PD 0
|
|
.TP
|
|
\fB\-\-powerpc\fR[\fB=\fIoptions\fR]
|
|
.TP
|
|
\fB\-\-ia64\fR[\fB=\fIoptions\fR]
|
|
.TP
|
|
\fB\-\-arm\fR[\fB=\fIoptions\fR]
|
|
.TP
|
|
\fB\-\-armthumb\fR[\fB=\fIoptions\fR]
|
|
.TP
|
|
\fB\-\-sparc\fR[\fB=\fIoptions\fR]
|
|
.PD
|
|
Add a branch/call/jump (BCJ) filter to the filter chain.
|
|
These filters can be used only as a non-last filter
|
|
in the filter chain.
|
|
.IP ""
|
|
A BCJ filter converts relative addresses in
|
|
the machine code to their absolute counterparts.
|
|
This doesn't change the size of the data,
|
|
but it increases redundancy,
|
|
which can help LZMA2 to produce 0\-15\ % smaller
|
|
.B .xz
|
|
file.
|
|
The BCJ filters are always reversible,
|
|
so using a BCJ filter for wrong type of data
|
|
doesn't cause any data loss, although it may make
|
|
the compression ratio slightly worse.
|
|
.IP ""
|
|
It is fine to apply a BCJ filter on a whole executable;
|
|
there's no need to apply it only on the executable section.
|
|
Applying a BCJ filter on an archive that contains both executable
|
|
and non-executable files may or may not give good results,
|
|
so it generally isn't good to blindly apply a BCJ filter when
|
|
compressing binary packages for distribution.
|
|
.IP ""
|
|
These BCJ filters are very fast and
|
|
use insignificant amount of memory.
|
|
If a BCJ filter improves compression ratio of a file,
|
|
it can improve decompression speed at the same time.
|
|
This is because, on the same hardware,
|
|
the decompression speed of LZMA2 is roughly
|
|
a fixed number of bytes of compressed data per second.
|
|
.IP ""
|
|
These BCJ filters have known problems related to
|
|
the compression ratio:
|
|
.RS
|
|
.IP \(bu 3
|
|
Some types of files containing executable code
|
|
(e.g. object files, static libraries, and Linux kernel modules)
|
|
have the addresses in the instructions filled with filler values.
|
|
These BCJ filters will still do the address conversion,
|
|
which will make the compression worse with these files.
|
|
.IP \(bu 3
|
|
Applying a BCJ filter on an archive containing multiple similar
|
|
executables can make the compression ratio worse than not using
|
|
a BCJ filter.
|
|
This is because the BCJ filter doesn't detect the boundaries
|
|
of the executable files, and doesn't reset
|
|
the address conversion counter for each executable.
|
|
.RE
|
|
.IP ""
|
|
Both of the above problems will be fixed
|
|
in the future in a new filter.
|
|
The old BCJ filters will still be useful in embedded systems,
|
|
because the decoder of the new filter will be bigger
|
|
and use more memory.
|
|
.IP ""
|
|
Different instruction sets have have different alignment:
|
|
.RS
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
l n l
|
|
l n l.
|
|
Filter;Alignment;Notes
|
|
x86;1;32-bit or 64-bit x86
|
|
PowerPC;4;Big endian only
|
|
ARM;4;Little endian only
|
|
ARM-Thumb;2;Little endian only
|
|
IA-64;16;Big or little endian
|
|
SPARC;4;Big or little endian
|
|
.TE
|
|
.RE
|
|
.RE
|
|
.IP ""
|
|
Since the BCJ-filtered data is usually compressed with LZMA2,
|
|
the compression ratio may be improved slightly if
|
|
the LZMA2 options are set to match the
|
|
alignment of the selected BCJ filter.
|
|
For example, with the IA-64 filter, it's good to set
|
|
.B pb=4
|
|
with LZMA2 (2^4=16).
|
|
The x86 filter is an exception;
|
|
it's usually good to stick to LZMA2's default
|
|
four-byte alignment when compressing x86 executables.
|
|
.IP ""
|
|
All BCJ filters support the same
|
|
.IR options :
|
|
.RS
|
|
.TP
|
|
.BI start= offset
|
|
Specify the start
|
|
.I offset
|
|
that is used when converting between relative
|
|
and absolute addresses.
|
|
The
|
|
.I offset
|
|
must be a multiple of the alignment of the filter
|
|
(see the table above).
|
|
The default is zero.
|
|
In practice, the default is good; specifying a custom
|
|
.I offset
|
|
is almost never useful.
|
|
.RE
|
|
.TP
|
|
\fB\-\-delta\fR[\fB=\fIoptions\fR]
|
|
Add the Delta filter to the filter chain.
|
|
The Delta filter can be only used as a non-last filter
|
|
in the filter chain.
|
|
.IP ""
|
|
Currently only simple byte-wise delta calculation is supported.
|
|
It can be useful when compressing e.g. uncompressed bitmap images
|
|
or uncompressed PCM audio.
|
|
However, special purpose algorithms may give significantly better
|
|
results than Delta + LZMA2.
|
|
This is true especially with audio,
|
|
which compresses faster and better e.g. with
|
|
.BR flac (1).
|
|
.IP ""
|
|
Supported
|
|
.IR options :
|
|
.RS
|
|
.TP
|
|
.BI dist= distance
|
|
Specify the
|
|
.I distance
|
|
of the delta calculation in bytes.
|
|
.I distance
|
|
must be 1\-256.
|
|
The default is 1.
|
|
.IP ""
|
|
For example, with
|
|
.B dist=2
|
|
and eight-byte input A1 B1 A2 B3 A3 B5 A4 B7, the output will be
|
|
A1 B1 01 02 01 02 01 02.
|
|
.RE
|
|
.
|
|
.SS "Other options"
|
|
.TP
|
|
.BR \-q ", " \-\-quiet
|
|
Suppress warnings and notices.
|
|
Specify this twice to suppress errors too.
|
|
This option has no effect on the exit status.
|
|
That is, even if a warning was suppressed,
|
|
the exit status to indicate a warning is still used.
|
|
.TP
|
|
.BR \-v ", " \-\-verbose
|
|
Be verbose.
|
|
If standard error is connected to a terminal,
|
|
.B xz
|
|
will display a progress indicator.
|
|
Specifying
|
|
.B \-\-verbose
|
|
twice will give even more verbose output.
|
|
.IP ""
|
|
The progress indicator shows the following information:
|
|
.RS
|
|
.IP \(bu 3
|
|
Completion percentage is shown
|
|
if the size of the input file is known.
|
|
That is, the percentage cannot be shown in pipes.
|
|
.IP \(bu 3
|
|
Amount of compressed data produced (compressing)
|
|
or consumed (decompressing).
|
|
.IP \(bu 3
|
|
Amount of uncompressed data consumed (compressing)
|
|
or produced (decompressing).
|
|
.IP \(bu 3
|
|
Compression ratio, which is calculated by dividing
|
|
the amount of compressed data processed so far by
|
|
the amount of uncompressed data processed so far.
|
|
.IP \(bu 3
|
|
Compression or decompression speed.
|
|
This is measured as the amount of uncompressed data consumed
|
|
(compression) or produced (decompression) per second.
|
|
It is shown after a few seconds have passed since
|
|
.B xz
|
|
started processing the file.
|
|
.IP \(bu 3
|
|
Elapsed time in the format M:SS or H:MM:SS.
|
|
.IP \(bu 3
|
|
Estimated remaining time is shown
|
|
only when the size of the input file is
|
|
known and a couple of seconds have already passed since
|
|
.B xz
|
|
started processing the file.
|
|
The time is shown in a less precise format which
|
|
never has any colons, e.g. 2 min 30 s.
|
|
.RE
|
|
.IP ""
|
|
When standard error is not a terminal,
|
|
.B \-\-verbose
|
|
will make
|
|
.B xz
|
|
print the filename, compressed size, uncompressed size,
|
|
compression ratio, and possibly also the speed and elapsed time
|
|
on a single line to standard error after compressing or
|
|
decompressing the file.
|
|
The speed and elapsed time are included only when
|
|
the operation took at least a few seconds.
|
|
If the operation didn't finish, e.g. due to user interruption,
|
|
also the completion percentage is printed
|
|
if the size of the input file is known.
|
|
.TP
|
|
.BR \-Q ", " \-\-no\-warn
|
|
Don't set the exit status to 2
|
|
even if a condition worth a warning was detected.
|
|
This option doesn't affect the verbosity level, thus both
|
|
.B \-\-quiet
|
|
and
|
|
.B \-\-no\-warn
|
|
have to be used to not display warnings and
|
|
to not alter the exit status.
|
|
.TP
|
|
.B \-\-robot
|
|
Print messages in a machine-parsable format.
|
|
This is intended to ease writing frontends that want to use
|
|
.B xz
|
|
instead of liblzma, which may be the case with various scripts.
|
|
The output with this option enabled is meant to be stable across
|
|
.B xz
|
|
releases.
|
|
See the section
|
|
.B "ROBOT MODE"
|
|
for details.
|
|
.TP
|
|
.BR \-\-info\-memory
|
|
Display, in human-readable format, how much physical memory (RAM)
|
|
.B xz
|
|
thinks the system has and the memory usage limits for compression
|
|
and decompression, and exit successfully.
|
|
.TP
|
|
.BR \-h ", " \-\-help
|
|
Display a help message describing the most commonly used options,
|
|
and exit successfully.
|
|
.TP
|
|
.BR \-H ", " \-\-long\-help
|
|
Display a help message describing all features of
|
|
.BR xz ,
|
|
and exit successfully
|
|
.TP
|
|
.BR \-V ", " \-\-version
|
|
Display the version number of
|
|
.B xz
|
|
and liblzma in human readable format.
|
|
To get machine-parsable output, specify
|
|
.B \-\-robot
|
|
before
|
|
.BR \-\-version .
|
|
.
|
|
.SH "ROBOT MODE"
|
|
The robot mode is activated with the
|
|
.B \-\-robot
|
|
option.
|
|
It makes the output of
|
|
.B xz
|
|
easier to parse by other programs.
|
|
Currently
|
|
.B \-\-robot
|
|
is supported only together with
|
|
.BR \-\-version ,
|
|
.BR \-\-info\-memory ,
|
|
and
|
|
.BR \-\-list .
|
|
It will be supported for normal compression and
|
|
decompression in the future.
|
|
.
|
|
.SS Version
|
|
.B "xz \-\-robot \-\-version"
|
|
will print the version number of
|
|
.B xz
|
|
and liblzma in the following format:
|
|
.PP
|
|
.BI XZ_VERSION= XYYYZZZS
|
|
.br
|
|
.BI LIBLZMA_VERSION= XYYYZZZS
|
|
.TP
|
|
.I X
|
|
Major version.
|
|
.TP
|
|
.I YYY
|
|
Minor version.
|
|
Even numbers are stable.
|
|
Odd numbers are alpha or beta versions.
|
|
.TP
|
|
.I ZZZ
|
|
Patch level for stable releases or
|
|
just a counter for development releases.
|
|
.TP
|
|
.I S
|
|
Stability.
|
|
0 is alpha, 1 is beta, and 2 is stable.
|
|
.I S
|
|
should be always 2 when
|
|
.I YYY
|
|
is even.
|
|
.PP
|
|
.I XYYYZZZS
|
|
are the same on both lines if
|
|
.B xz
|
|
and liblzma are from the same XZ Utils release.
|
|
.PP
|
|
Examples: 4.999.9beta is
|
|
.B 49990091
|
|
and
|
|
5.0.0 is
|
|
.BR 50000002 .
|
|
.
|
|
.SS "Memory limit information"
|
|
.B "xz \-\-robot \-\-info\-memory"
|
|
prints a single line with three tab-separated columns:
|
|
.IP 1. 4
|
|
Total amount of physical memory (RAM) in bytes
|
|
.IP 2. 4
|
|
Memory usage limit for compression in bytes.
|
|
A special value of zero indicates the default setting,
|
|
which for single-threaded mode is the same as no limit.
|
|
.IP 3. 4
|
|
Memory usage limit for decompression in bytes.
|
|
A special value of zero indicates the default setting,
|
|
which for single-threaded mode is the same as no limit.
|
|
.PP
|
|
In the future, the output of
|
|
.B "xz \-\-robot \-\-info\-memory"
|
|
may have more columns, but never more than a single line.
|
|
.
|
|
.SS "List mode"
|
|
.B "xz \-\-robot \-\-list"
|
|
uses tab-separated output.
|
|
The first column of every line has a string
|
|
that indicates the type of the information found on that line:
|
|
.TP
|
|
.B name
|
|
This is always the first line when starting to list a file.
|
|
The second column on the line is the filename.
|
|
.TP
|
|
.B file
|
|
This line contains overall information about the
|
|
.B .xz
|
|
file.
|
|
This line is always printed after the
|
|
.B name
|
|
line.
|
|
.TP
|
|
.B stream
|
|
This line type is used only when
|
|
.B \-\-verbose
|
|
was specified.
|
|
There are as many
|
|
.B stream
|
|
lines as there are streams in the
|
|
.B .xz
|
|
file.
|
|
.TP
|
|
.B block
|
|
This line type is used only when
|
|
.B \-\-verbose
|
|
was specified.
|
|
There are as many
|
|
.B block
|
|
lines as there are blocks in the
|
|
.B .xz
|
|
file.
|
|
The
|
|
.B block
|
|
lines are shown after all the
|
|
.B stream
|
|
lines; different line types are not interleaved.
|
|
.TP
|
|
.B summary
|
|
This line type is used only when
|
|
.B \-\-verbose
|
|
was specified twice.
|
|
This line is printed after all
|
|
.B block
|
|
lines.
|
|
Like the
|
|
.B file
|
|
line, the
|
|
.B summary
|
|
line contains overall information about the
|
|
.B .xz
|
|
file.
|
|
.TP
|
|
.B totals
|
|
This line is always the very last line of the list output.
|
|
It shows the total counts and sizes.
|
|
.PP
|
|
The columns of the
|
|
.B file
|
|
lines:
|
|
.PD 0
|
|
.RS
|
|
.IP 2. 4
|
|
Number of streams in the file
|
|
.IP 3. 4
|
|
Total number of blocks in the stream(s)
|
|
.IP 4. 4
|
|
Compressed size of the file
|
|
.IP 5. 4
|
|
Uncompressed size of the file
|
|
.IP 6. 4
|
|
Compression ratio, for example
|
|
.BR 0.123.
|
|
If ratio is over 9.999, three dashes
|
|
.RB ( \-\-\- )
|
|
are displayed instead of the ratio.
|
|
.IP 7. 4
|
|
Comma-separated list of integrity check names.
|
|
The following strings are used for the known check types:
|
|
.BR None ,
|
|
.BR CRC32 ,
|
|
.BR CRC64 ,
|
|
and
|
|
.BR SHA\-256 .
|
|
For unknown check types,
|
|
.BI Unknown\- N
|
|
is used, where
|
|
.I N
|
|
is the Check ID as a decimal number (one or two digits).
|
|
.IP 8. 4
|
|
Total size of stream padding in the file
|
|
.RE
|
|
.PD
|
|
.PP
|
|
The columns of the
|
|
.B stream
|
|
lines:
|
|
.PD 0
|
|
.RS
|
|
.IP 2. 4
|
|
Stream number (the first stream is 1)
|
|
.IP 3. 4
|
|
Number of blocks in the stream
|
|
.IP 4. 4
|
|
Compressed start offset
|
|
.IP 5. 4
|
|
Uncompressed start offset
|
|
.IP 6. 4
|
|
Compressed size (does not include stream padding)
|
|
.IP 7. 4
|
|
Uncompressed size
|
|
.IP 8. 4
|
|
Compression ratio
|
|
.IP 9. 4
|
|
Name of the integrity check
|
|
.IP 10. 4
|
|
Size of stream padding
|
|
.RE
|
|
.PD
|
|
.PP
|
|
The columns of the
|
|
.B block
|
|
lines:
|
|
.PD 0
|
|
.RS
|
|
.IP 2. 4
|
|
Number of the stream containing this block
|
|
.IP 3. 4
|
|
Block number relative to the beginning of the stream
|
|
(the first block is 1)
|
|
.IP 4. 4
|
|
Block number relative to the beginning of the file
|
|
.IP 5. 4
|
|
Compressed start offset relative to the beginning of the file
|
|
.IP 6. 4
|
|
Uncompressed start offset relative to the beginning of the file
|
|
.IP 7. 4
|
|
Total compressed size of the block (includes headers)
|
|
.IP 8. 4
|
|
Uncompressed size
|
|
.IP 9. 4
|
|
Compression ratio
|
|
.IP 10. 4
|
|
Name of the integrity check
|
|
.RE
|
|
.PD
|
|
.PP
|
|
If
|
|
.B \-\-verbose
|
|
was specified twice, additional columns are included on the
|
|
.B block
|
|
lines.
|
|
These are not displayed with a single
|
|
.BR \-\-verbose ,
|
|
because getting this information requires many seeks
|
|
and can thus be slow:
|
|
.PD 0
|
|
.RS
|
|
.IP 11. 4
|
|
Value of the integrity check in hexadecimal
|
|
.IP 12. 4
|
|
Block header size
|
|
.IP 13. 4
|
|
Block flags:
|
|
.B c
|
|
indicates that compressed size is present, and
|
|
.B u
|
|
indicates that uncompressed size is present.
|
|
If the flag is not set, a dash
|
|
.RB ( \- )
|
|
is shown instead to keep the string length fixed.
|
|
New flags may be added to the end of the string in the future.
|
|
.IP 14. 4
|
|
Size of the actual compressed data in the block (this excludes
|
|
the block header, block padding, and check fields)
|
|
.IP 15. 4
|
|
Amount of memory (in bytes) required to decompress
|
|
this block with this
|
|
.B xz
|
|
version
|
|
.IP 16. 4
|
|
Filter chain.
|
|
Note that most of the options used at compression time
|
|
cannot be known, because only the options
|
|
that are needed for decompression are stored in the
|
|
.B .xz
|
|
headers.
|
|
.RE
|
|
.PD
|
|
.PP
|
|
The columns of the
|
|
.B totals
|
|
line:
|
|
.PD 0
|
|
.RS
|
|
.IP 2. 4
|
|
Number of streams
|
|
.IP 3. 4
|
|
Number of blocks
|
|
.IP 4. 4
|
|
Compressed size
|
|
.IP 5. 4
|
|
Uncompressed size
|
|
.IP 6. 4
|
|
Average compression ratio
|
|
.IP 7. 4
|
|
Comma-separated list of integrity check names
|
|
that were present in the files
|
|
.IP 8. 4
|
|
Stream padding size
|
|
.IP 9. 4
|
|
Number of files.
|
|
This is here to
|
|
keep the order of the earlier columns the same as on
|
|
.B file
|
|
lines.
|
|
.PD
|
|
.RE
|
|
.PP
|
|
If
|
|
.B \-\-verbose
|
|
was specified twice, additional columns are included on the
|
|
.B totals
|
|
line:
|
|
.PD 0
|
|
.RS
|
|
.IP 10. 4
|
|
Maximum amount of memory (in bytes) required to decompress
|
|
the files with this
|
|
.B xz
|
|
version
|
|
.IP 11. 4
|
|
.B yes
|
|
or
|
|
.B no
|
|
indicating if all block headers have both compressed size and
|
|
uncompressed size stored in them
|
|
.RE
|
|
.PD
|
|
.PP
|
|
Future versions may add new line types and
|
|
new columns can be added to the existing line types,
|
|
but the existing columns won't be changed.
|
|
.
|
|
.SH "EXIT STATUS"
|
|
.TP
|
|
.B 0
|
|
All is good.
|
|
.TP
|
|
.B 1
|
|
An error occurred.
|
|
.TP
|
|
.B 2
|
|
Something worth a warning occurred,
|
|
but no actual errors occurred.
|
|
.PP
|
|
Notices (not warnings or errors) printed on standard error
|
|
don't affect the exit status.
|
|
.
|
|
.SH ENVIRONMENT
|
|
.B xz
|
|
parses space-separated lists of options
|
|
from the environment variables
|
|
.B XZ_DEFAULTS
|
|
and
|
|
.BR XZ_OPT ,
|
|
in this order, before parsing the options from the command line.
|
|
Note that only options are parsed from the environment variables;
|
|
all non-options are silently ignored.
|
|
Parsing is done with
|
|
.BR getopt_long (3)
|
|
which is used also for the command line arguments.
|
|
.TP
|
|
.B XZ_DEFAULTS
|
|
User-specific or system-wide default options.
|
|
Typically this is set in a shell initialization script to enable
|
|
.BR xz 's
|
|
memory usage limiter by default.
|
|
Excluding shell initialization scripts
|
|
and similar special cases, scripts must never set or unset
|
|
.BR XZ_DEFAULTS .
|
|
.TP
|
|
.B XZ_OPT
|
|
This is for passing options to
|
|
.B xz
|
|
when it is not possible to set the options directly on the
|
|
.B xz
|
|
command line.
|
|
This is the case e.g. when
|
|
.B xz
|
|
is run by a script or tool, e.g. GNU
|
|
.BR tar (1):
|
|
.RS
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
XZ_OPT=\-2v tar caf foo.tar.xz foo
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.RE
|
|
.IP ""
|
|
Scripts may use
|
|
.B XZ_OPT
|
|
e.g. to set script-specific default compression options.
|
|
It is still recommended to allow users to override
|
|
.B XZ_OPT
|
|
if that is reasonable, e.g. in
|
|
.BR sh (1)
|
|
scripts one may use something like this:
|
|
.RS
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
XZ_OPT=${XZ_OPT\-"\-7e"}
|
|
export XZ_OPT
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.RE
|
|
.
|
|
.SH "LZMA UTILS COMPATIBILITY"
|
|
The command line syntax of
|
|
.B xz
|
|
is practically a superset of
|
|
.BR lzma ,
|
|
.BR unlzma ,
|
|
and
|
|
.BR lzcat
|
|
as found from LZMA Utils 4.32.x.
|
|
In most cases, it is possible to replace
|
|
LZMA Utils with XZ Utils without breaking existing scripts.
|
|
There are some incompatibilities though,
|
|
which may sometimes cause problems.
|
|
.
|
|
.SS "Compression preset levels"
|
|
The numbering of the compression level presets is not identical in
|
|
.B xz
|
|
and LZMA Utils.
|
|
The most important difference is how dictionary sizes
|
|
are mapped to different presets.
|
|
Dictionary size is roughly equal to the decompressor memory usage.
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
c c c
|
|
c n n.
|
|
Level;xz;LZMA Utils
|
|
\-0;256 KiB;N/A
|
|
\-1;1 MiB;64 KiB
|
|
\-2;2 MiB;1 MiB
|
|
\-3;4 MiB;512 KiB
|
|
\-4;4 MiB;1 MiB
|
|
\-5;8 MiB;2 MiB
|
|
\-6;8 MiB;4 MiB
|
|
\-7;16 MiB;8 MiB
|
|
\-8;32 MiB;16 MiB
|
|
\-9;64 MiB;32 MiB
|
|
.TE
|
|
.RE
|
|
.PP
|
|
The dictionary size differences affect
|
|
the compressor memory usage too,
|
|
but there are some other differences between
|
|
LZMA Utils and XZ Utils, which
|
|
make the difference even bigger:
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
c c c
|
|
c n n.
|
|
Level;xz;LZMA Utils 4.32.x
|
|
\-0;3 MiB;N/A
|
|
\-1;9 MiB;2 MiB
|
|
\-2;17 MiB;12 MiB
|
|
\-3;32 MiB;12 MiB
|
|
\-4;48 MiB;16 MiB
|
|
\-5;94 MiB;26 MiB
|
|
\-6;94 MiB;45 MiB
|
|
\-7;186 MiB;83 MiB
|
|
\-8;370 MiB;159 MiB
|
|
\-9;674 MiB;311 MiB
|
|
.TE
|
|
.RE
|
|
.PP
|
|
The default preset level in LZMA Utils is
|
|
.B \-7
|
|
while in XZ Utils it is
|
|
.BR \-6 ,
|
|
so both use an 8 MiB dictionary by default.
|
|
.
|
|
.SS "Streamed vs. non-streamed .lzma files"
|
|
The uncompressed size of the file can be stored in the
|
|
.B .lzma
|
|
header.
|
|
LZMA Utils does that when compressing regular files.
|
|
The alternative is to mark that uncompressed size is unknown
|
|
and use end-of-payload marker to indicate
|
|
where the decompressor should stop.
|
|
LZMA Utils uses this method when uncompressed size isn't known,
|
|
which is the case for example in pipes.
|
|
.PP
|
|
.B xz
|
|
supports decompressing
|
|
.B .lzma
|
|
files with or without end-of-payload marker, but all
|
|
.B .lzma
|
|
files created by
|
|
.B xz
|
|
will use end-of-payload marker and have uncompressed size
|
|
marked as unknown in the
|
|
.B .lzma
|
|
header.
|
|
This may be a problem in some uncommon situations.
|
|
For example, a
|
|
.B .lzma
|
|
decompressor in an embedded device might work
|
|
only with files that have known uncompressed size.
|
|
If you hit this problem, you need to use LZMA Utils
|
|
or LZMA SDK to create
|
|
.B .lzma
|
|
files with known uncompressed size.
|
|
.
|
|
.SS "Unsupported .lzma files"
|
|
The
|
|
.B .lzma
|
|
format allows
|
|
.I lc
|
|
values up to 8, and
|
|
.I lp
|
|
values up to 4.
|
|
LZMA Utils can decompress files with any
|
|
.I lc
|
|
and
|
|
.IR lp ,
|
|
but always creates files with
|
|
.B lc=3
|
|
and
|
|
.BR lp=0 .
|
|
Creating files with other
|
|
.I lc
|
|
and
|
|
.I lp
|
|
is possible with
|
|
.B xz
|
|
and with LZMA SDK.
|
|
.PP
|
|
The implementation of the LZMA1 filter in liblzma
|
|
requires that the sum of
|
|
.I lc
|
|
and
|
|
.I lp
|
|
must not exceed 4.
|
|
Thus,
|
|
.B .lzma
|
|
files, which exceed this limitation, cannot be decompressed with
|
|
.BR xz .
|
|
.PP
|
|
LZMA Utils creates only
|
|
.B .lzma
|
|
files which have a dictionary size of
|
|
.RI "2^" n
|
|
(a power of 2) but accepts files with any dictionary size.
|
|
liblzma accepts only
|
|
.B .lzma
|
|
files which have a dictionary size of
|
|
.RI "2^" n
|
|
or
|
|
.RI "2^" n " + 2^(" n "\-1)."
|
|
This is to decrease false positives when detecting
|
|
.B .lzma
|
|
files.
|
|
.PP
|
|
These limitations shouldn't be a problem in practice,
|
|
since practically all
|
|
.B .lzma
|
|
files have been compressed with settings that liblzma will accept.
|
|
.
|
|
.SS "Trailing garbage"
|
|
When decompressing,
|
|
LZMA Utils silently ignore everything after the first
|
|
.B .lzma
|
|
stream.
|
|
In most situations, this is a bug.
|
|
This also means that LZMA Utils
|
|
don't support decompressing concatenated
|
|
.B .lzma
|
|
files.
|
|
.PP
|
|
If there is data left after the first
|
|
.B .lzma
|
|
stream,
|
|
.B xz
|
|
considers the file to be corrupt unless
|
|
.B \-\-single\-stream
|
|
was used.
|
|
This may break obscure scripts which have
|
|
assumed that trailing garbage is ignored.
|
|
.
|
|
.SH NOTES
|
|
.
|
|
.SS "Compressed output may vary"
|
|
The exact compressed output produced from
|
|
the same uncompressed input file
|
|
may vary between XZ Utils versions even if
|
|
compression options are identical.
|
|
This is because the encoder can be improved
|
|
(faster or better compression)
|
|
without affecting the file format.
|
|
The output can vary even between different
|
|
builds of the same XZ Utils version,
|
|
if different build options are used.
|
|
.PP
|
|
The above means that implementing
|
|
.B \-\-rsyncable
|
|
to create rsyncable
|
|
.B .xz
|
|
files is not going to happen without
|
|
freezing a part of the encoder
|
|
implementation, which can then be used with
|
|
.BR \-\-rsyncable .
|
|
.
|
|
.SS "Embedded .xz decompressors"
|
|
Embedded
|
|
.B .xz
|
|
decompressor implementations like XZ Embedded don't necessarily
|
|
support files created with integrity
|
|
.I check
|
|
types other than
|
|
.B none
|
|
and
|
|
.BR crc32 .
|
|
Since the default is
|
|
.BR \-\-check=crc64 ,
|
|
you must use
|
|
.B \-\-check=none
|
|
or
|
|
.B \-\-check=crc32
|
|
when creating files for embedded systems.
|
|
.PP
|
|
Outside embedded systems, all
|
|
.B .xz
|
|
format decompressors support all the
|
|
.I check
|
|
types, or at least are able to decompress
|
|
the file without verifying the
|
|
integrity check if the particular
|
|
.I check
|
|
is not supported.
|
|
.PP
|
|
XZ Embedded supports BCJ filters,
|
|
but only with the default start offset.
|
|
.
|
|
.SH EXAMPLES
|
|
.
|
|
.SS Basics
|
|
Compress the file
|
|
.I foo
|
|
into
|
|
.I foo.xz
|
|
using the default compression level
|
|
.RB ( \-6 ),
|
|
and remove
|
|
.I foo
|
|
if compression is successful:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz foo
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Decompress
|
|
.I bar.xz
|
|
into
|
|
.I bar
|
|
and don't remove
|
|
.I bar.xz
|
|
even if decompression is successful:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-dk bar.xz
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Create
|
|
.I baz.tar.xz
|
|
with the preset
|
|
.B \-4e
|
|
.RB ( "\-4 \-\-extreme" ),
|
|
which is slower than e.g. the default
|
|
.BR \-6 ,
|
|
but needs less memory for compression and decompression (48\ MiB
|
|
and 5\ MiB, respectively):
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
tar cf \- baz | xz \-4e > baz.tar.xz
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
A mix of compressed and uncompressed files can be decompressed
|
|
to standard output with a single command:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.
|
|
.SS "Parallel compression of many files"
|
|
On GNU and *BSD,
|
|
.BR find (1)
|
|
and
|
|
.BR xargs (1)
|
|
can be used to parallelize compression of many files:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
find . \-type f \e! \-name '*.xz' \-print0 \e
|
|
| xargs \-0r \-P4 \-n16 xz \-T1
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
The
|
|
.B \-P
|
|
option to
|
|
.BR xargs (1)
|
|
sets the number of parallel
|
|
.B xz
|
|
processes.
|
|
The best value for the
|
|
.B \-n
|
|
option depends on how many files there are to be compressed.
|
|
If there are only a couple of files,
|
|
the value should probably be 1;
|
|
with tens of thousands of files,
|
|
100 or even more may be appropriate to reduce the number of
|
|
.B xz
|
|
processes that
|
|
.BR xargs (1)
|
|
will eventually create.
|
|
.PP
|
|
The option
|
|
.B \-T1
|
|
for
|
|
.B xz
|
|
is there to force it to single-threaded mode, because
|
|
.BR xargs (1)
|
|
is used to control the amount of parallelization.
|
|
.
|
|
.SS "Robot mode"
|
|
Calculate how many bytes have been saved in total
|
|
after compressing multiple files:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-robot \-\-list *.xz | awk '/^totals/{print $5\-$4}'
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
A script may want to know that it is using new enough
|
|
.BR xz .
|
|
The following
|
|
.BR sh (1)
|
|
script checks that the version number of the
|
|
.B xz
|
|
tool is at least 5.0.0.
|
|
This method is compatible with old beta versions,
|
|
which didn't support the
|
|
.B \-\-robot
|
|
option:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
if ! eval "$(xz \-\-robot \-\-version 2> /dev/null)" ||
|
|
[ "$XZ_VERSION" \-lt 50000002 ]; then
|
|
echo "Your xz is too old."
|
|
fi
|
|
unset XZ_VERSION LIBLZMA_VERSION
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Set a memory usage limit for decompression using
|
|
.BR XZ_OPT ,
|
|
but if a limit has already been set, don't increase it:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
NEWLIM=$((123 << 20)) # 123 MiB
|
|
OLDLIM=$(xz \-\-robot \-\-info\-memory | cut \-f3)
|
|
if [ $OLDLIM \-eq 0 \-o $OLDLIM \-gt $NEWLIM ]; then
|
|
XZ_OPT="$XZ_OPT \-\-memlimit\-decompress=$NEWLIM"
|
|
export XZ_OPT
|
|
fi
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.
|
|
.SS "Custom compressor filter chains"
|
|
The simplest use for custom filter chains is
|
|
customizing a LZMA2 preset.
|
|
This can be useful,
|
|
because the presets cover only a subset of the
|
|
potentially useful combinations of compression settings.
|
|
.PP
|
|
The CompCPU columns of the tables
|
|
from the descriptions of the options
|
|
.BR "\-0" " ... " "\-9"
|
|
and
|
|
.B \-\-extreme
|
|
are useful when customizing LZMA2 presets.
|
|
Here are the relevant parts collected from those two tables:
|
|
.RS
|
|
.PP
|
|
.TS
|
|
tab(;);
|
|
c c
|
|
n n.
|
|
Preset;CompCPU
|
|
\-0;0
|
|
\-1;1
|
|
\-2;2
|
|
\-3;3
|
|
\-4;4
|
|
\-5;5
|
|
\-6;6
|
|
\-5e;7
|
|
\-6e;8
|
|
.TE
|
|
.RE
|
|
.PP
|
|
If you know that a file requires
|
|
somewhat big dictionary (e.g. 32 MiB) to compress well,
|
|
but you want to compress it quicker than
|
|
.B "xz \-8"
|
|
would do, a preset with a low CompCPU value (e.g. 1)
|
|
can be modified to use a bigger dictionary:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-lzma2=preset=1,dict=32MiB foo.tar
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
With certain files, the above command may be faster than
|
|
.B "xz \-6"
|
|
while compressing significantly better.
|
|
However, it must be emphasized that only some files benefit from
|
|
a big dictionary while keeping the CompCPU value low.
|
|
The most obvious situation,
|
|
where a big dictionary can help a lot,
|
|
is an archive containing very similar files
|
|
of at least a few megabytes each.
|
|
The dictionary size has to be significantly bigger
|
|
than any individual file to allow LZMA2 to take
|
|
full advantage of the similarities between consecutive files.
|
|
.PP
|
|
If very high compressor and decompressor memory usage is fine,
|
|
and the file being compressed is
|
|
at least several hundred megabytes, it may be useful
|
|
to use an even bigger dictionary than the 64 MiB that
|
|
.B "xz \-9"
|
|
would use:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-vv \-\-lzma2=dict=192MiB big_foo.tar
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Using
|
|
.B \-vv
|
|
.RB ( "\-\-verbose \-\-verbose" )
|
|
like in the above example can be useful
|
|
to see the memory requirements
|
|
of the compressor and decompressor.
|
|
Remember that using a dictionary bigger than
|
|
the size of the uncompressed file is waste of memory,
|
|
so the above command isn't useful for small files.
|
|
.PP
|
|
Sometimes the compression time doesn't matter,
|
|
but the decompressor memory usage has to be kept low
|
|
e.g. to make it possible to decompress the file on
|
|
an embedded system.
|
|
The following command uses
|
|
.B \-6e
|
|
.RB ( "\-6 \-\-extreme" )
|
|
as a base and sets the dictionary to only 64\ KiB.
|
|
The resulting file can be decompressed with XZ Embedded
|
|
(that's why there is
|
|
.BR \-\-check=crc32 )
|
|
using about 100\ KiB of memory.
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-check=crc32 \-\-lzma2=preset=6e,dict=64KiB foo
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
If you want to squeeze out as many bytes as possible,
|
|
adjusting the number of literal context bits
|
|
.RI ( lc )
|
|
and number of position bits
|
|
.RI ( pb )
|
|
can sometimes help.
|
|
Adjusting the number of literal position bits
|
|
.RI ( lp )
|
|
might help too, but usually
|
|
.I lc
|
|
and
|
|
.I pb
|
|
are more important.
|
|
E.g. a source code archive contains mostly US-ASCII text,
|
|
so something like the following might give
|
|
slightly (like 0.1\ %) smaller file than
|
|
.B "xz \-6e"
|
|
(try also without
|
|
.BR lc=4 ):
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-lzma2=preset=6e,pb=0,lc=4 source_code.tar
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Using another filter together with LZMA2 can improve
|
|
compression with certain file types.
|
|
E.g. to compress a x86-32 or x86-64 shared library
|
|
using the x86 BCJ filter:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-x86 \-\-lzma2 libfoo.so
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
Note that the order of the filter options is significant.
|
|
If
|
|
.B \-\-x86
|
|
is specified after
|
|
.BR \-\-lzma2 ,
|
|
.B xz
|
|
will give an error,
|
|
because there cannot be any filter after LZMA2,
|
|
and also because the x86 BCJ filter cannot be used
|
|
as the last filter in the chain.
|
|
.PP
|
|
The Delta filter together with LZMA2
|
|
can give good results with bitmap images.
|
|
It should usually beat PNG,
|
|
which has a few more advanced filters than simple
|
|
delta but uses Deflate for the actual compression.
|
|
.PP
|
|
The image has to be saved in uncompressed format,
|
|
e.g. as uncompressed TIFF.
|
|
The distance parameter of the Delta filter is set
|
|
to match the number of bytes per pixel in the image.
|
|
E.g. 24-bit RGB bitmap needs
|
|
.BR dist=3 ,
|
|
and it is also good to pass
|
|
.B pb=0
|
|
to LZMA2 to accommodate the three-byte alignment:
|
|
.RS
|
|
.PP
|
|
.nf
|
|
.ft CW
|
|
xz \-\-delta=dist=3 \-\-lzma2=pb=0 foo.tiff
|
|
.ft R
|
|
.fi
|
|
.RE
|
|
.PP
|
|
If multiple images have been put into a single archive (e.g.\&
|
|
.BR .tar ),
|
|
the Delta filter will work on that too as long as all images
|
|
have the same number of bytes per pixel.
|
|
.
|
|
.SH "SEE ALSO"
|
|
.BR xzdec (1),
|
|
.BR xzdiff (1),
|
|
.BR xzgrep (1),
|
|
.BR xzless (1),
|
|
.BR xzmore (1),
|
|
.BR gzip (1),
|
|
.BR bzip2 (1),
|
|
.BR 7z (1)
|
|
.PP
|
|
XZ Utils: <http://tukaani.org/xz/>
|
|
.br
|
|
XZ Embedded: <http://tukaani.org/xz/embedded.html>
|
|
.br
|
|
LZMA SDK: <http://7-zip.org/sdk.html>
|