XZ Utils (anteriormente LZMA Utils ) es un conjunto de compresores de datos sin pérdida de línea de comandos de software libre , que incluye los programas lzma y xz, para sistemas operativos tipo Unix y, a partir de la versión 5.0, Microsoft Windows . Para la compresión/descompresión se utiliza el algoritmo de cadena Lempel–Ziv–Markov (LZMA). XZ Utils comenzó como un puerto Unix del LZMA- SDK de Igor Pavlov que se ha adaptado para encajar perfectamente en entornos Unix y su estructura y comportamiento habituales.
XZ Utils puede comprimir y descomprimir los formatos de archivo xz y lzma . Dado que el formato LZMA se considera obsoleto , [2] XZ Utils comprime a xz de forma predeterminada.
En la mayoría de los casos, xz logra tasas de compresión más altas que alternativas como zip , [3] gzip y bzip2 . La velocidad de descompresión es mayor que bzip2, pero menor que gzip. La compresión puede ser mucho más lenta que gzip, y es más lenta que bzip2 para niveles altos de compresión, y es más útil cuando un archivo comprimido se usará muchas veces. [4] [5]
XZ Utils consta de dos componentes principales:
xz
, el compresor y descompresor de línea de comandos (análogo a gzip )Existen varios atajos de comandos, como lzma
(para xz --format=lzma
), unxz
(para xz --decompress
; análogo a gunzip
) y xzcat
(para unxz --stdout
; análogo a zcat
).
Tanto el comportamiento del software como las propiedades del formato de archivo han sido diseñados para funcionar de forma similar a las de las populares herramientas de compresión de Unix gzip y bzip2 .
Al igual que gzip y bzip, xz y lzma solo pueden comprimir archivos individuales (o flujos de datos) como entrada. No pueden agrupar varios archivos en un solo archivo ; para ello, primero se utiliza un programa de compresión, como tar .
Comprimir un archivo:
xz my_archive.tar # resultados en my_archive.tar.xz
lzma my_archive.tar # resultados en my_archive.tar.lzma
Descomprimiendo el archivo:
unxz my_archive.tar.xz # resultados en my_archive.tar
unlzma my_archive.tar.lzma # resultados en my_archive.tar
La versión 1.22 o mayor de la implementación GNU de tar tiene soporte transparente para archivos tar comprimidos con lzma y xz, usando los modificadores --xz
o -J
para compresión xz, y --lzma
para compresión LZMA.
Creando un archivo y comprimiéndolo:
tar -c --xz -f mi_archivo.tar.xz /algun_directorio # resultados en mi_archivo.tar.xz
tar -c --lzma -f mi_archivo.tar.lzma /algun_directorio # resultados en mi_archivo.tar.lzma
Descomprimiendo el archivo y extrayendo su contenido:
tar -x --xz -f mi_archivo.tar.xz # resultados en /algun_directorio
tar -x --lzma -f mi_archivo.tar.lzma # resultados en /algun_directorio
Ejemplo de tar de una sola letra para archivar con compresión y descompresión con extracción usando sufijo corto :
tar cJf keep.txz keep # archiva y luego comprime el directorio ./keep/ en el archivo ./keep.txz
tar xJf keep.txz # descomprime y luego extrae el archivo ./keep.txz creando el directorio ./keep/
xz ha admitido la compresión multiproceso (con la -T
bandera) [6] desde 2014, versión 5.2.0; [7] desde la versión 5.4.0 se ha implementado la descompresión por subprocesos. La descompresión por subprocesos requiere múltiples bloques comprimidos dentro de una secuencia que son creados por la interfaz de compresión por subprocesos. La cantidad de subprocesos puede ser menor que la definida si el archivo no es lo suficientemente grande para la compresión por subprocesos con la configuración dada o si el uso de más subprocesos excedería el límite de uso de memoria. [6]
El formato xz mejora el lzma al permitir filtros de preprocesamiento. Los filtros exactos utilizados son similares a los utilizados en 7z , ya que los filtros de 7z están disponibles en el dominio público a través del SDK de LZMA.
El desarrollo de XZ Utils se llevó a cabo dentro del Proyecto Tukaani, un pequeño grupo de desarrolladores que en su día mantuvieron una distribución Linux basada en Slackware . El nombre elegido "XZ" no es una abreviatura, sino que parece ser un nombre aleatorio para los compresores de datos, ya que no hay ninguna mención en ninguna parte de la especificación oficial sobre el significado de "XZ". [8] La versión 1.0.0 de la especificación del formato de archivo .xz se publicó oficialmente en enero de 2009. [9]
Todo el código fuente de xz y liblzma ha sido liberado al dominio público . La distribución del código fuente de XZ Utils incluye además algunos scripts opcionales y un programa de ejemplo que están sujetos a varias versiones de la Licencia Pública General de GNU (GPL). [1] Los binarios del software xz y liblzma resultantes son de dominio público, a menos que se incorpore la implementación opcional de getopt de la LGPL . [10]
Los binarios están disponibles para FreeBSD , NetBSD , sistemas Linux , Microsoft Windows y FreeDOS . Varias distribuciones Linux , incluidas Fedora , Slackware , Ubuntu y Debian , utilizan xz para comprimir sus paquetes de software. Arch Linux anteriormente usaba xz para comprimir paquetes, [11] pero a partir del 27 de diciembre de 2019, los paquetes se comprimen con compresión Zstandard . [12] Fedora Linux también cambió a la compresión de sus paquetes RPM con Zstandard con Fedora Linux 31. [13] El archivo FTP de GNU también usa xz.
El 29 de marzo de 2024, Andres Freund, un desarrollador de PostgreSQL que trabaja en Microsoft , anunció que había encontrado una puerta trasera en XZ Utils, que afectaba a las versiones 5.6.0 y 5.6.1. Se habían añadido archivos de prueba comprimidos al código para configurar la puerta trasera mediante adiciones al script de configuración en los archivos tar . Comenzó su investigación porque "después de observar algunos síntomas extraños en torno a liblzma (parte del paquete xz)", ya que descubrió que los inicios de sesión ssh que usaban sshd
"estaban consumiendo mucha CPU , errores de valgrind ". [14] La vulnerabilidad recibió una puntuación de 10 (la más alta) en el Common Vulnerability Scoring System (CVSS). [15]
Por ejemplo, comprimí un directorio que tenía un tamaño de 37M usando tanto xz como zip. El tamaño del archivo zip era de 31M, mientras que el archivo xz era de 16M después de la compresión.