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 является контейнером, который может содержать один или несколько потоков сжатых данных. Каждый поток состоит из:
- Заголовка потока — содержит идентификатор формата, версию и флаги.
- Блоков данных — каждый блок может быть сжат независимо, что позволяет параллельное сжатие и распаковку.
- Индекса — содержит информацию о смещениях и размерах блоков для быстрого доступа.
- Контрольной суммы — 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 →