XZ Utils (anteriormente LZMA Utils ) es un conjunto de compresores de datos sin pérdida de software libre para línea de comandos , que incluye los programas lzma y xz, para sistemas operativos tipo Unix y, a partir de la versión 5.0, para Microsoft Windows . Para la compresión/ descompresión se utiliza el algoritmo de cadena de Markov Lempel-Ziv (LZMA). XZ Utils comenzó como una adaptación para Unix del SDK LZMA de Igor Pavlov , que se ha modificado para integrarse perfectamente en entornos Unix y su estructura y comportamiento habituales.
Características
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 por defecto a xz. Además, la descompresión del formato .lz utilizado por lzip es compatible desde la versión 5.3.4. [ 3 ]
En la mayoría de los casos, xz logra tasas de compresión más altas que alternativas como zip , [ 4 ] gzip y bzip2 . La velocidad de descompresión es mayor que la de bzip2, pero menor que la de gzip. La compresión puede ser mucho más lenta que la de gzip, y es más lenta que la de bzip2 para altos niveles de compresión, y es más útil cuando un archivo comprimido se utilizará muchas veces. [ 5 ] [ 6 ]
XZ Utils consta de dos componentes principales:
xz, el compresor y descompresor de línea de comandos (análogo a gzip )- liblzma , una biblioteca de software con una API similar a zlib.
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).
Uso
Tanto el comportamiento del software como las propiedades del formato de archivo se han diseñado 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 comprimido ; para ello, primero se utiliza un programa de archivado, como tar .
Comprimir un archivo:
xz my_archive.tar # da como resultado my_archive.tar.xz lzma my_archive.tar # da como resultado my_archive.tar.lzmaDescomprimiendo el archivo:
unxz my_archive.tar.xz # da como resultado my_archive.tar unlzma my_archive.tar.lzma # da como resultado my_archive.tarLa versión 1.22 o superior de la implementación de tar de GNU tiene soporte transparente para archivos tar comprimidos con lzma y xz, utilizando los interruptores--xz o -Jpara la compresión xz, y --lzmapara la compresión LZMA.
Creación de un archivo y su compresión:
tar -c --xz -f my_archive.tar.xz /some_directory # genera my_archive.tar.xz tar -c --lzma -f my_archive.tar.lzma /some_directory # genera my_archive.tar.lzmaDescomprimir el archivo y extraer su contenido:
tar -x --xz -f my_archive.tar.xz # da como resultado /some_directory tar -x --lzma -f my_archive.tar.lzma # da como resultado /some_directoryEjemplo de tar de una sola letra para archivo con compresión y descompresión con extracción usando un 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 admite compresión multihilo (con el -Tindicador) [ 7 ] desde 2014, versión 5.2.0; [ 3 ] desde la versión 5.4.0 se implementó la descompresión multihilo. La descompresión multihilo requiere múltiples bloques comprimidos dentro de un flujo que son creados por la interfaz de compresión multihilo. El número de hilos puede ser menor que el definido si el archivo no es lo suficientemente grande para el procesamiento multihilo con la configuración dada o si usar más hilos excedería el límite de uso de memoria. [ 7 ]
Formato de archivo
Un archivo xz es una secuencia de uno o más flujos . Puede haber bytes nulos (relleno) después de cada flujo.
El formato xz mejora lzma al permitir filtros de preprocesamiento ( BCJ y delta ). Los filtros exactos utilizados son similares a los de 7z , ya que los filtros de 7z están disponibles públicamente a través del SDK de LZMA. El filtro BCJ RISC-V de xz es una característica propia.
Un metaanálisis de 2016 muestra que xz tiene la mayor relación de compresión entre lz4 , zstd y zlib , y la compresión/descompresión más lenta. [ 8 ]
El autor de lzip afirma que el formato xz es inadecuado para uso general debido a su complejidad y extensibilidad, y dice que aumenta el riesgo de corrupción no detectada de los datos comprimidos con xz . [ 9 ]
El orden de bytes es little-endian . [ 10 ]
Estructura del arroyo
Estructura de bloques
Estructura del índice
Entero de longitud variable
Los valores de 0 a 127 se almacenan tal cual, en un byte. Los valores mayores de 127 (y hasta 2^63) se almacenan en dos o más bytes (hasta 9). Todos los bytes, excepto el último, tienen el bit más significativo activado. [ 11 ]
El siguiente código Python implementa funciones para codificar y decodificar un número entero de longitud variable.
def encode ( num ): if num >= 2 ** 63 : raise ValueError ( "num no debe tener más de 63 bits" )buf = b ""mientras num >= 0x80 : buf += ( 0x80 | ( num & 0x7f )) . to_bytes ( longitud = 1 ) num >>= 7buf += num . to_bytes ( length = 1 )búfer de retornodef decodificar ( buf ): if len ( buf ) == 0 : raise ValueError ( "buf no debe estar vacío" )num = 0for i , byte in enumerate ( buf ): if i > 8 : raise ValueError ( "num no debe tener más de 63 bits" ) num |= ( byte & 0x7f ) << ( i * 7 ) if byte & 0x80 == 0 : return numDesarrollo y adopción
El desarrollo de XZ Utils tuvo lugar dentro del Proyecto Tukaani, un pequeño grupo de desarrolladores que en su momento mantuvieron una distribución de Linux basada en Slackware . El nombre elegido, "XZ", no es una abreviatura, sino que parece ser un nombre asignado al azar a los compresores de datos, ya que no se menciona en ninguna parte de la especificación oficial el significado de "XZ". [ 12 ] La especificación del formato de archivo .xz, versión 1.0.0, se publicó oficialmente en enero de 2009. [ 13 ]
Todo el código fuente de xz y liblzma se ha publicado en el 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 diversas versiones de la Licencia Pública General de GNU (GPL). [ 1 ] Los binarios de software resultantes xz y liblzma son de dominio público, a menos que se incorpore la implementación opcional de getopt bajo la LGPL . [ 14 ]
Hay binarios disponibles para FreeBSD , NetBSD , sistemas Linux , Microsoft Windows y FreeDOS . Varias distribuciones de Linux , incluidas Fedora , Slackware , Ubuntu y Debian, utilizan xz para comprimir sus paquetes de software. Arch Linux anteriormente utilizaba xz para comprimir paquetes, [ 15 ] pero desde el 27 de diciembre de 2019, los paquetes se comprimen con la compresión Zstandard . [ 16 ] Fedora Linux también cambió a comprimir sus paquetes RPM con Zstandard con Fedora Linux 31. [ 17 ] El archivo FTP de GNU también utiliza xz.
Incidente por la puerta trasera
El 29 de marzo de 2024, Andres Freund, desarrollador de PostgreSQL en Microsoft , anunció el descubrimiento de una puerta trasera en XZ Utils, que afectaba a las versiones 5.6.0 y 5.6.1. El código malicioso para configurar la puerta trasera se había ocultado en archivos de prueba comprimidos, y el script de configuración en los archivos tar se modificó para activar dicho código. Freund inició su investigación «tras observar algunos síntomas extraños en torno a liblzma (parte del paquete xz)»; concretamente, que los inicios de sesión SSH que utilizaban sshdestaban «consumiendo mucha CPU » y generando errores de Valgrind . [ 18 ] La vulnerabilidad recibió una puntuación de 10 en el Sistema Común de Puntuación de Vulnerabilidades (CVSS) (la más alta). [ 19 ]
Referencias
- 1 2 Licencias en tukaani.org "Las partes más interesantes de XZ Utils (por ejemplo, liblzma) son de dominio público. Puedes hacer lo que quieras con las partes de dominio público. Algunas partes de XZ Utils (por ejemplo, el sistema de compilación y algunas utilidades) están bajo diferentes licencias de software libre como GNU LGPLv2.1, GNU GPLv2 o GNU GPLv3."
- ↑ LZMA Util , consultado el 25 de enero de 2011
- 1 2 "Notas de la versión de XZ Utils" . git.tukaani.org .
- ↑ Vivek, Gite. "Cómo comprimir un directorio completo usando xz y tar en Linux" .
Por ejemplo, comprimí un directorio de 37 MB usando xz y zip. El archivo zip tenía un tamaño de 31 MB, mientras que el archivo xz tenía un tamaño de 16 MB después de la compresión.
- ↑ Henry-Stocker, Sandra (12 de diciembre de 2017). "Cómo sacar el máximo provecho de la compresión de archivos en Linux" . Network World . Archivado del original el 29 de febrero de 2020. Consultado el 9 de febrero de 2020 .
- ↑ "Comparativa de rendimiento entre Gzip, Bzip2 y XZ" . RootUsers . 16 de septiembre de 2015. Archivado del original el 17 de febrero de 2020. Consultado el 9 de febrero de 2020 .
- 1 2 "xz, unxz, xzcat, lzma, unlzma, lzcat – Comprime o descomprime archivos .xz y .lzma" . Linux Manpages Online . Archivado del original el 4 de noviembre de 2019. Consultado el 4 de noviembre de 2019 .
- ↑ "Compresión de datos más pequeña y rápida con Zstandard" . Ingeniería en Meta . 31 de agosto de 2016. Consultado el 22 de julio de 2025 .
- ↑ Díaz Díaz, Antonio (11 de junio de 2016). "El formato Xz es inadecuado para uso general" . Archivado del original el 24 de febrero de 2026. Recuperado el 22 de marzo de 2026 .
- ↑ "El formato de archivo .xz" . 1.2. Enteros multibyte. Archivado del original el 10 de mayo de 2023. Recuperado el 8 de mayo de 2023 .
- ↑ "El formato de archivo .xz" . 1.2. Enteros multibyte. Archivado del original el 10 de mayo de 2023. Recuperado el 8 de mayo de 2023 .
- ↑ "Especificación oficial XZ" . tukaani.org . Lasse Collin. Archivado del original el 8 de octubre de 2024. Consultado el 8 de octubre de 2024 .
- ↑ Lasse Collin (28 de enero de 2009). "Noticias: La especificación del formato de archivo .xz versión 1.0.0 ya está oficialmente publicada" .
- ↑ "¿En qué casos la salida de un programa GPL también está cubierta por la GPL?" . GNU.org . Archivado del original el 18 de marzo de 2022 . Consultado el 21 de agosto de 2019 .
- ↑ Pierre Schmitz (23 de marzo de 2010). "Noticias: Cambio a la compresión xz para nuevos paquetes" . Archivado del original el 6 de julio de 2010. Recuperado el 10 de febrero de 2018 .
- ↑ "Arch Linux – Noticias: Ahora se utiliza Zstandard en lugar de xz para la compresión de paquetes" . www.archlinux.org . Archivado del original el 18 de marzo de 2022. Consultado el 7 de enero de 2020 .
- ↑ Mach, Daniel. "Cambios/Cambio de RPM a compresión zstd" . Wiki del proyecto Fedora . Archivado del original el 2 de junio de 2019. Recuperado el 30 de marzo de 2024 .
- ↑ "oss-security – puerta trasera en xz/liblzma upstream que compromete el servidor ssh" . www.openwall.com . Archivado del original el 1 de abril de 2024. Consultado el 8 de abril de 2024 .
- ↑ "Una puerta trasera en xz" . LWN.net . Consultado el 30 de marzo de 2024 .
Enlaces externos
- Utilidades XZ en SourceForge
- Software gratuito de compresión de datos
- Software libre programado en C
- Software de dominio público con código fuente
- Archivadores Unix y utilidades relacionadas con la compresión
- Software que utiliza la Licencia Pública General de GNU.