Открыть сервис

XZ Utils

XZ Utils — это набор программного обеспечения с открытым исходным кодом для сжатия данных без потерь, использующий алгоритм LZMA2 (Lempel-Ziv-Markov chain algorithm). Основным компонентом набора является утилита командной строки xz, предназначенная для сжатия и распаковки файлов, а также библиотека liblzma, предоставляющая программный интерфейс для работы с данным алгоритмом. XZ Utils широко применяется в операционных системах на базе ядра Linux, в дистрибутивах BSD и в других Unix-подобных системах, а также в формате распространения программного обеспечения (например, в пакетах .tar.xz).

История

Предшественники

Разработка XZ Utils началась как ответвление (форк) от проекта 7-Zip, созданного Игорем Павловым. Алгоритм LZMA, лежащий в основе 7-Zip, был портирован на Unix-подобные системы в рамках проекта LZMA SDK и затем адаптирован для использования в командной строке. В 2005 году Лассе Коллин (Lasse Collin) начал работу над самостоятельной реализацией LZMA2 для Unix, которая впоследствии стала ядром XZ Utils.

Создание и развитие

Проект XZ Utils был официально анонсирован в 2009 году. Основной целью было создание свободной, высокопроизводительной и переносимой альтернативы утилите gzip и архиватору bzip2. В отличие от них, XZ Utils обеспечивает более высокую степень сжатия за счёт более сложного алгоритма, что требует большего объёма оперативной памяти и процессорного времени.

С 2010 года XZ Utils вошёл в состав большинства основных дистрибутивов Linux (Debian, Ubuntu, Fedora, openSUSE, Arch Linux и других) как стандартный инструмент для сжатия. Библиотека liblzma стала частью системных утилит, таких как dpkg (менеджер пакетов Debian) и rpm (Red Hat Package Manager).

Инцидент безопасности (2024)

В марте 2024 года была обнаружена серьёзная уязвимость (CVE-2024-3094), связанная с внедрением вредоносного кода в библиотеку liblzma. Злоумышленник, действовавший под псевдонимом Jia Tan, на протяжении нескольких лет вносил изменения в код, которые в итоге привели к созданию бэкдора, позволяющего удалённо выполнять произвольный код на серверах, использующих OpenSSH с модифицированной библиотекой. Уязвимость затронула в основном дистрибутивы Linux, использующие systemd и OpenSSH. После обнаружения инцидента разработчики проектов, включая Red Hat, Debian и Ubuntu, выпустили экстренные обновления для отката версий XZ Utils. Этот случай стал одним из наиболее резонансных в истории open-source, продемонстрировав уязвимость цепочек поставки ПО.

Архитектура и компоненты

Основные утилиты

Набор XZ Utils включает несколько командных утилит:

  • xz — основная утилита для сжатия и распаковки. По умолчанию сжимает файлы в формат .xz, удаляя исходный файл. Поддерживает опции для выбора уровня сжатия (от 0 до 9), использования многопоточности (-T), а также режима проверки целостности.
  • unxz — синоним для xz --decompress.
  • xzcat — синоним для xz --decompress --stdout, позволяющий выводить распакованные данные в стандартный поток вывода.
  • lzma и unlzma — утилиты для работы с устаревшим форматом .lzma (предшественник .xz).
  • xzdec — минималистичный декомпрессор, предназначенный для встраивания в прошивки или загрузчики, где размер кода критичен.

Библиотека liblzma

liblzma — это программная библиотека на языке C, реализующая алгоритмы сжатия LZMA и LZMA2. Она предоставляет API для интеграции сжатия в другие приложения. Библиотека поддерживает:

  • Потоковое сжатие и распаковку.
  • Многопоточный режим (с версии 5.2.0).
  • Проверку целостности данных (CRC32, CRC64, SHA-256).
  • Фильтры предобработки (например, фильтр для исполняемых файлов, улучшающий сжатие).

Формат файла .xz

Формат .xz является контейнером, который может содержать один или несколько потоков сжатых данных. Каждый поток состоит из:

  1. Заголовка потока — содержит идентификатор формата, версию и флаги.
  2. Блоков данных — каждый блок может быть сжат независимо, что позволяет параллельное сжатие и распаковку.
  3. Индекса — содержит информацию о смещениях и размерах блоков для быстрого доступа.
  4. Контрольной суммы — CRC64 для проверки целостности всего потока.

Формат поддерживает произвольный доступ к данным (с возможностью распаковки отдельных блоков), что отличает его от форматов gzip и bzip2, где данные распаковываются последовательно.

Сравнение с другими алгоритмами сжатия

ПараметрXZ Utils (LZMA2)gzip (DEFLATE)bzip2 (BWT)Zstandard (Zstd)
Степень сжатия (типичная)Высокая (на 20-30% лучше gzip)СредняяВыше среднейВысокая (близка к XZ)
Скорость сжатияНизкаяВысокаяСредняяВысокая
Скорость распаковкиСредняяВысокаяСредняяВысокая
Потребление памяти (сжатие)Высокое (до 1 ГБ для уровня 9)Низкое (до 1 МБ)Среднее (до 200 МБ)Среднее (до 100 МБ)
Потребление памяти (распаковка)Среднее (до 100 МБ)НизкоеНизкоеНизкое

XZ Utils обеспечивает наилучшее сжатие среди традиционных инструментов, но уступает Zstandard по скорости. В современных дистрибутивах Linux XZ Utils часто используется для сжатия пакетов (.deb, .rpm), а Zstandard — для сжатия образов файловых систем (например, в Btrfs и ZFS).

Применение

В операционных системах

  • Linux: XZ Utils является стандартным инструментом для сжатия исходных кодов ядра, документации и пакетов. Многие дистрибутивы используют .tar.xz для распространения установочных образов.
  • BSD: FreeBSD, OpenBSD и NetBSD поддерживают XZ Utils в базовой системе.
  • macOS: Встроенная утилита tar поддерживает распаковку .xz через библиотеку liblzma, установленную в системе.

В программном обеспечении

  • Системы управления пакетами: dpkg (Debian) и rpm (Red Hat) используют liblzma для распаковки архивов.
  • Архиваторы: 7-Zip, PeaZip и другие программы поддерживают формат .xz.
  • Встраиваемые системы: Утилита xzdec используется в загрузчиках (например, в U-Boot) для распаковки образов ядра.

В научных и инженерных расчётах

XZ Utils применяется для сжатия больших наборов данных (логов, результатов моделирования) благодаря высокой степени сжатия, что экономит дисковое пространство.

Интересные факты

  • Алгоритм LZMA2, используемый в XZ Utils, является развитием LZMA, который впервые был реализован в архиваторе 7-Zip для Windows.
  • Формат .xz был разработан как открытый стандарт, не зависящий от конкретной реализации.
  • В 2024 году инцидент с бэкдором в XZ Utils привёл к пересмотру практик безопасности в open-source-сообществе, включая внедрение двухфакторной аутентификации для мейнтейнеров и автоматизированных проверок кода.

Источники

  • Документация проекта XZ Utils (README, man-страницы).
  • Официальный сайт проекта: tukaani.org/xz/.
  • Отчёт о CVE-2024-3094 (Red Hat, Debian Security Advisory).
  • Статья «XZ Utils» в англоязычной Википедии (по состоянию на 2024 год).
  • Исходный код проекта на GitHub (репозиторий tukaani-project/xz).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →