xz: Documentation/staging/xz.rst: Revise thoroughly
Add SPDX license identifier.
Omit xz_dec_test info. That isn't relevant to developers of non-XZ code.
Revise the docs about xzkern and add xzkern_with_size. The latter was
added to scripts/Makefile.lib in the commit 7ce7e984ab
("kbuild: rename
cmd_{bzip2,lzma,lzo,lz4,xzkern,zstd22}").
Omit contact info as MAINTAINERS has it.
Omit other info that is outdated or not relevant in the kernel context.
Include the xz_dec kernel-doc from include/linux/xz.h.
Link: https://lkml.kernel.org/r/20240721133633.47721-8-lasse.collin@tukaani.org
Signed-off-by: Lasse Collin <lasse.collin@tukaani.org>
Reviewed-by: Sam James <sam@gentoo.org>
Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
Tested-by: Randy Dunlap <rdunlap@infradead.org>
Cc: Rui Li <me@lirui.org>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Emil Renner Berthing <emil.renner.berthing@canonical.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Jubin Zhong <zhongjubin@huawei.com>
Cc: Jules Maselbas <jmaselbas@zdiv.net>
Cc: Krzysztof Kozlowski <krzk@kernel.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
0f2c599634
commit
6416724679
@ -1,3 +1,5 @@
|
||||
.. SPDX-License-Identifier: 0BSD
|
||||
|
||||
============================
|
||||
XZ data compression in Linux
|
||||
============================
|
||||
@ -6,62 +8,55 @@ Introduction
|
||||
============
|
||||
|
||||
XZ is a general purpose data compression format with high compression
|
||||
ratio and relatively fast decompression. The primary compression
|
||||
algorithm (filter) is LZMA2. Additional filters can be used to improve
|
||||
compression ratio even further. E.g. Branch/Call/Jump (BCJ) filters
|
||||
improve compression ratio of executable data.
|
||||
ratio. The XZ decompressor in Linux is called XZ Embedded. It supports
|
||||
the LZMA2 filter and optionally also Branch/Call/Jump (BCJ) filters
|
||||
for executable code. CRC32 is supported for integrity checking.
|
||||
|
||||
The XZ decompressor in Linux is called XZ Embedded. It supports
|
||||
the LZMA2 filter and optionally also BCJ filters. CRC32 is supported
|
||||
for integrity checking. The home page of XZ Embedded is at
|
||||
<https://tukaani.org/xz/embedded.html>, where you can find the
|
||||
latest version and also information about using the code outside
|
||||
the Linux kernel.
|
||||
See the `XZ Embedded`_ home page for the latest version which includes
|
||||
a few optional extra features that aren't required in the Linux kernel
|
||||
and information about using the code outside the Linux kernel.
|
||||
|
||||
For userspace, XZ Utils provide a zlib-like compression library
|
||||
and a gzip-like command line tool. XZ Utils can be downloaded from
|
||||
<https://tukaani.org/xz/>.
|
||||
For userspace, `XZ Utils`_ provide a zlib-like compression library
|
||||
and a gzip-like command line tool.
|
||||
|
||||
.. _XZ Embedded: https://tukaani.org/xz/embedded.html
|
||||
.. _XZ Utils: https://tukaani.org/xz/
|
||||
|
||||
XZ related components in the kernel
|
||||
===================================
|
||||
|
||||
The xz_dec module provides XZ decompressor with single-call (buffer
|
||||
to buffer) and multi-call (stateful) APIs. The usage of the xz_dec
|
||||
module is documented in include/linux/xz.h.
|
||||
|
||||
The xz_dec_test module is for testing xz_dec. xz_dec_test is not
|
||||
useful unless you are hacking the XZ decompressor. xz_dec_test
|
||||
allocates a char device major dynamically to which one can write
|
||||
.xz files from userspace. The decompressed output is thrown away.
|
||||
Keep an eye on dmesg to see diagnostics printed by xz_dec_test.
|
||||
See the xz_dec_test source code for the details.
|
||||
to buffer) and multi-call (stateful) APIs in include/linux/xz.h.
|
||||
|
||||
For decompressing the kernel image, initramfs, and initrd, there
|
||||
is a wrapper function in lib/decompress_unxz.c. Its API is the
|
||||
same as in other decompress_*.c files, which is defined in
|
||||
include/linux/decompress/generic.h.
|
||||
|
||||
scripts/xz_wrap.sh is a wrapper for the xz command line tool found
|
||||
from XZ Utils. The wrapper sets compression options to values suitable
|
||||
for compressing the kernel image.
|
||||
For kernel makefiles, three commands are provided for use with
|
||||
``$(call if_changed)``. They require the xz tool from XZ Utils.
|
||||
|
||||
For kernel makefiles, two commands are provided for use with
|
||||
$(call if_needed). The kernel image should be compressed with
|
||||
$(call if_needed,xzkern) which will use a BCJ filter and a big LZMA2
|
||||
dictionary. It will also append a four-byte trailer containing the
|
||||
uncompressed size of the file, which is needed by the boot code.
|
||||
Other things should be compressed with $(call if_needed,xzmisc)
|
||||
which will use no BCJ filter and 1 MiB LZMA2 dictionary.
|
||||
- ``$(call if_changed,xzkern)`` is for compressing the kernel image.
|
||||
It runs the script scripts/xz_wrap.sh which uses arch-optimized
|
||||
options and a big LZMA2 dictionary.
|
||||
|
||||
- ``$(call if_changed,xzkern_with_size)`` is like ``xzkern`` above but
|
||||
this also appends a four-byte trailer containing the uncompressed size
|
||||
of the file. The trailer is needed by the boot code on some archs.
|
||||
|
||||
- Other things can be compressed with ``$(call if_needed,xzmisc)``
|
||||
which will use no BCJ filter and 1 MiB LZMA2 dictionary.
|
||||
|
||||
Notes on compression options
|
||||
============================
|
||||
|
||||
Since the XZ Embedded supports only streams with no integrity check or
|
||||
CRC32, make sure that you don't use some other integrity check type
|
||||
when encoding files that are supposed to be decoded by the kernel. With
|
||||
liblzma, you need to use either LZMA_CHECK_NONE or LZMA_CHECK_CRC32
|
||||
when encoding. With the xz command line tool, use --check=none or
|
||||
--check=crc32.
|
||||
Since the XZ Embedded supports only streams with CRC32 or no integrity
|
||||
check, make sure that you don't use some other integrity check type
|
||||
when encoding files that are supposed to be decoded by the kernel.
|
||||
With liblzma from XZ Utils, you need to use either ``LZMA_CHECK_CRC32``
|
||||
or ``LZMA_CHECK_NONE`` when encoding. With the ``xz`` command line tool,
|
||||
use ``--check=crc32`` or ``--check=none`` to override the default
|
||||
``--check=crc64``.
|
||||
|
||||
Using CRC32 is strongly recommended unless there is some other layer
|
||||
which will verify the integrity of the uncompressed data anyway.
|
||||
@ -71,57 +66,36 @@ by the decoder; you can only change the integrity check type (or
|
||||
disable it) for the actual uncompressed data.
|
||||
|
||||
In userspace, LZMA2 is typically used with dictionary sizes of several
|
||||
megabytes. The decoder needs to have the dictionary in RAM, thus big
|
||||
dictionaries cannot be used for files that are intended to be decoded
|
||||
by the kernel. 1 MiB is probably the maximum reasonable dictionary
|
||||
size for in-kernel use (maybe more is OK for initramfs). The presets
|
||||
in XZ Utils may not be optimal when creating files for the kernel,
|
||||
so don't hesitate to use custom settings. Example::
|
||||
megabytes. The decoder needs to have the dictionary in RAM:
|
||||
|
||||
xz --check=crc32 --lzma2=dict=512KiB inputfile
|
||||
- In multi-call mode the dictionary is allocated as part of the
|
||||
decoder state. The reasonable maximum dictionary size for in-kernel
|
||||
use will depend on the target hardware: a few megabytes is fine for
|
||||
desktop systems while 64 KiB to 1 MiB might be more appropriate on
|
||||
some embedded systems.
|
||||
|
||||
An exception to above dictionary size limitation is when the decoder
|
||||
is used in single-call mode. Decompressing the kernel itself is an
|
||||
example of this situation. In single-call mode, the memory usage
|
||||
doesn't depend on the dictionary size, and it is perfectly fine to
|
||||
use a big dictionary: for maximum compression, the dictionary should
|
||||
be at least as big as the uncompressed data itself.
|
||||
- In single-call mode the output buffer is used as the dictionary
|
||||
buffer. That is, the size of the dictionary doesn't affect the
|
||||
decompressor memory usage at all. Only the base data structures
|
||||
are allocated which take a little less than 30 KiB of memory.
|
||||
For the best compression, the dictionary should be at least
|
||||
as big as the uncompressed data. A notable example of single-call
|
||||
mode is decompressing the kernel itself (except on PowerPC).
|
||||
|
||||
Future plans
|
||||
============
|
||||
The compression presets in XZ Utils may not be optimal when creating
|
||||
files for the kernel, so don't hesitate to use custom settings to,
|
||||
for example, set the dictionary size. Also, xz may produce a smaller
|
||||
file in single-threaded mode so setting that explicitly is recommended.
|
||||
Example::
|
||||
|
||||
Creating a limited XZ encoder may be considered if people think it is
|
||||
useful. LZMA2 is slower to compress than e.g. Deflate or LZO even at
|
||||
the fastest settings, so it isn't clear if LZMA2 encoder is wanted
|
||||
into the kernel.
|
||||
xz --threads=1 --check=crc32 --lzma2=dict=512KiB inputfile
|
||||
|
||||
Support for limited random-access reading is planned for the
|
||||
decompression code. I don't know if it could have any use in the
|
||||
kernel, but I know that it would be useful in some embedded projects
|
||||
outside the Linux kernel.
|
||||
xz_dec API
|
||||
==========
|
||||
|
||||
Conformance to the .xz file format specification
|
||||
================================================
|
||||
This is available with ``#include <linux/xz.h>``.
|
||||
|
||||
There are a couple of corner cases where things have been simplified
|
||||
at expense of detecting errors as early as possible. These should not
|
||||
matter in practice all, since they don't cause security issues. But
|
||||
it is good to know this if testing the code e.g. with the test files
|
||||
from XZ Utils.
|
||||
``XZ_EXTERN`` is a macro used in the preboot code. Ignore it when
|
||||
reading this documentation.
|
||||
|
||||
Reporting bugs
|
||||
==============
|
||||
|
||||
Before reporting a bug, please check that it's not fixed already
|
||||
at upstream. See <https://tukaani.org/xz/embedded.html> to get the
|
||||
latest code.
|
||||
|
||||
Report bugs to <lasse.collin@tukaani.org> or visit #tukaani on
|
||||
Freenode and talk to Larhzu. I don't actively read LKML or other
|
||||
kernel-related mailing lists, so if there's something I should know,
|
||||
you should email to me personally or use IRC.
|
||||
|
||||
Don't bother Igor Pavlov with questions about the XZ implementation
|
||||
in the kernel or about XZ Utils. While these two implementations
|
||||
include essential code that is directly based on Igor Pavlov's code,
|
||||
these implementations aren't maintained nor supported by him.
|
||||
.. kernel-doc:: include/linux/xz.h
|
||||
|
Loading…
Reference in New Issue
Block a user