Tutoriel Linux

Comprimir un archivo con xz en Linux sin perder el original

Débutant7 min de lecture

Debes comprimir una imagen de disco, un volcado SQL, una exportación CSV o un respaldo bruto antes de una transferencia. xz a menudo reduce mejor el tamaño que gzip, pero consume más CPU y puede requerir mucha memoria con los niveles altos.

Usa xz para un solo archivo, voluminoso y poco comprimido. Evítalo para una foto JPEG, un video MP4, un archivo .zip, un paquete .deb o un archivo cuyo nombre ya termine en .gz, .xz o .zst.

Los pasos a continuación cubren la creación de un archivo .xz, la conservación del archivo fuente, la prueba de integridad, la elección del nivel de compresión y la verificación de una copia remota.

Archivo Linux comprimido con xz y Tux frente a un servidor
Compresión de un archivo Linux con xz antes de la transferencia o almacenamiento.

Verificar que xz está disponible

La mayoría de las distribuciones instalan xz por defecto a través del paquete xz-utils o xz. Verifica el comando antes de integrarlo en un procedimiento de respaldo.

xz --version

En Debian, Ubuntu y Linux Mint, instala el paquete si el comando está ausente.

sudo apt update
sudo apt install xz-utils

En Fedora, AlmaLinux o Rocky Linux, instala el paquete con dnf.

sudo dnf install xz

Elegir xz, gzip o zip

xz comprime un único archivo con LZMA2. Es adecuado para un volcado SQL, una exportación de texto, una imagen de disco no comprimida, un archivo de registro consolidado o un archivo .tar ya creado.

  • Elige xz cuando la reducción de tamaño cuente más que la velocidad.
  • Elige gzip cuando desees una compresión rápida en un script, un pipeline o una rotación de logs.
  • Elige zip cuando debas agrupar varios archivos en un formato fácil de abrir en Windows.
  • Elige tar antes de xz cuando debas preservar una estructura de Linux con sus directorios, nombres y permisos.

xz por sí solo no agrupa varios archivos. Para comprimir una carpeta, primero crea un archivo tar, luego comprímelo con xz.

tar -cf proyecto.tar proyecto/
xz -k proyecto.tar

El comando tar también puede crear directamente proyecto.tar.xz.

tar -cJf proyecto.tar.xz proyecto/

Controlar el archivo antes de la compresión

Mira el tipo y el tamaño del archivo antes de una compresión larga. Un archivo ya comprimido puede monopolizar el procesador para una ganancia casi nula.

file respaldo.sql
ls -lh respaldo.sql

Si file indica gzip compressed data, XZ compressed data, Zip archive data, JPEG image data o ISO Media, prueba primero en una pequeña muestra.

Comprimir manteniendo el archivo fuente

Sin opción, xz respaldo.sql reemplaza respaldo.sql por respaldo.sql.xz. Añade -k para conservar el original durante los controles.

xz -k respaldo.sql

Agrega -v para mostrar el progreso, la relación y la información útil durante la ejecución.

xz -k -v respaldo.sql

Luego verifica que ambos archivos existan y compara su tamaño.

ls -lh respaldo.sql respaldo.sql.xz

No elimines el original solo porque el archivo .xz existe. Prueba el archivo y valida la restauración antes de cualquier eliminación.

Elegir un nivel de compresión

El nivel por defecto de xz es -6. A menudo proporciona una buena relación, pero no siempre es adecuado para una máquina poco potente o una restauración urgente.

  • Usa -1 a -3 cuando la velocidad cuenta y la ganancia máxima no es prioritaria.
  • Mantén -6 para un uso general en una máquina cómoda.
  • Reserva -7 a -9 para archivos voluminosos que archivaste raramente y que también podrás descomprimir en una máquina adecuadamente equipada.
xz -3 -k export.csv
xz -6 -k respaldo.sql
xz -9 -k archivo.img

Los niveles altos pueden aumentar la memoria necesaria para la compresión y descompresión. Evita -9 para un archivo que deba abrirse en un pequeño VPS, una máquina antigua o un sistema de recuperación mínimo.

Limitar el uso de CPU en un servidor

La opción -T establece el número de hilos. -T0 utiliza todos los núcleos disponibles, lo que puede ralentizar una base de datos, un servidor web o contenedores activos.

xz -6 -T2 -k respaldo.sql

En una máquina de producción, comienza con -T1 o -T2. Controla la carga y luego aumenta solo si el servidor sigue siendo receptivo.

uptime
top

Para una compresión planificada, ejecútala fuera de las horas pico y verifica el espacio libre antes del lanzamiento. La opción -k mantiene dos archivos y requiere más espacio en disco.

df -h .

Probar la integridad del archivo

Siempre prueba el archivo con xz -t antes de eliminar el original o validar un respaldo. El comando lee y descomprime los datos en memoria sin crear un archivo de salida.

xz -t respaldo.sql.xz
echo $?

Un código de retorno 0 indica que la prueba de xz fue exitosa. Otro código señala un error y obliga a conservar el archivo fuente.

Luego muestra los metadatos del archivo para controlar el tamaño no comprimido, el tamaño comprimido, la relación y el tipo de control de integridad.

xz -l respaldo.sql.xz

xz -t verifica que el archivo se puede leer. No prueba que una copia remota sea idéntica al archivo local.

Verificar una transferencia con SHA-256

Calcula una huella SHA-256 antes de la transferencia, copia el archivo, y luego recalcula la huella en el destino. Las dos líneas deben mostrar el mismo valor.

sha256sum respaldo.sql.xz
scp respaldo.sql.xz admin@servidor:/srv/archivos/
ssh admin@servidor 'sha256sum /srv/archivos/respaldo.sql.xz'

Conserva la huella con el archivo si se envía a un disco externo, un almacenamiento de objetos o otro servidor.

sha256sum respaldo.sql.xz > respaldo.sql.xz.sha256

Para verificar más tarde desde la misma carpeta, usa el archivo .sha256.

sha256sum -c respaldo.sql.xz.sha256

Descomprimir sin perder el archivo

unxz respaldo.sql.xz elimina el archivo después de la extracción. Añade -k para mantener el archivo .xz hasta que hayas controlado el contenido restaurado.

unxz -k respaldo.sql.xz
ls -lh respaldo.sql respaldo.sql.xz

El comando equivalente con xz es útil en scripts que ya llaman a este binario.

xz -d -k respaldo.sql.xz

Si el archivo de salida ya existe, xz se niega a sobrescribirlo sin -f. No fuerces la extracción antes de haber comparado la ruta, la fecha, el tamaño y la necesidad real de reemplazo.

ls -lh respaldo.sql respaldo.sql.xz
stat respaldo.sql

Para una restauración cuidadosa, descomprime en una carpeta separada y compara el archivo obtenido antes de reemplazar un archivo de producción.

mkdir -p /tmp/test-xz
cp respaldo.sql.xz /tmp/test-xz/
cd /tmp/test-xz
unxz -k respaldo.sql.xz
ls -lh respaldo.sql

Leer un archivo sin crear un archivo

Para inspeccionar rápidamente un archivo de texto comprimido, envía el contenido descomprimido hacia la salida estándar con xzcat. Este método evita escribir un archivo temporal voluminoso.

xzcat respaldo.sql.xz | head -20

Para buscar una cadena en un archivo de texto comprimido, usa xzgrep en lugar de descomprimir todo el archivo.

xzgrep -n "CREATE TABLE" respaldo.sql.xz

No uses estos comandos en un volcado confidencial si tu terminal registra la salida o si trabajas en una sesión compartida.

Procedimiento recomendado para un respaldo

  • Verifica el tipo del archivo con file y su tamaño con ls -lh.
  • Controla el espacio disponible con df -h . antes de usar -k.
  • Comprime con xz -k -v y un nivel adecuado para la máquina.
  • Límita los hilos con -T1 o -T2 en un servidor activo.
  • Prueba el archivo con xz -t y exige un código de retorno 0.
  • Calcula una huella sha256sum antes y después de cada transferencia.
  • Prueba la extracción en una carpeta separada antes de reemplazar un archivo importante.

xz es útil cuando el espacio en disco o el ancho de banda cuesta más que el tiempo CPU. No sustituye una estrategia de respaldo, una huella conservada con el archivo y una prueba de restauración realizada antes del incidente.

sudo apt update && sudo apt upgrade