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 una copia de seguridad en 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, grande 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 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 copia de seguridad.

xz --version

En Debian, Ubuntu y Linux Mint, instala el paquete si falta el comando.

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 solo archivo con LZMA2. Es adecuado para un volcado SQL, una exportación de texto, una imagen de disco sin comprimir, un archivo de log consolidado o un archivo .tar ya creado.

  • Elige xz cuando la reducción de tamaño sea más importante que la velocidad.
  • Elige gzip cuando desees una compresión rápida en un script, una canalización 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 Linux con sus directorios, nombres y permisos.

xz por sí solo no agrupa varios archivos. Para comprimir una carpeta, primero crea un archivo tar y 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 comprimir

Mira el tipo y el tamaño del archivo antes de una compresión larga. Un archivo que ya está comprimido puede acaparar la CPU 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 con una pequeña muestra.

Comprimir manteniendo el archivo fuente

Sin opción, xz respaldo.sql reemplaza respaldo.sql por respaldo.sql.xz. Agrega -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 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 ofrece una buena relación, pero no siempre es adecuado para una máquina poco potente o para una restauración urgente.

  • Usa -1 a -3 cuando la velocidad importa y la ganancia máxima no es prioridad.
  • Mantén -6 para un uso general en una máquina cómoda.
  • Reserva -7 a -9 para archivos grandes que archivas raramente y que también podrás descomprimir en una máquina suficientemente 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 deberá abrirse en un pequeño VPS, una máquina antigua o un sistema de respaldo 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. Monitorea 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 de iniciar. 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 una copia de seguridad. 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 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 pueda ser leído. 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, luego recalculate la huella en el destino. Ambas líneas deben mostrar el mismo valor.

sha256sum respaldo.sql.xz
scp respaldo.sql.xz admin@servidor:/srv/archives/
ssh admin@servidor 'sha256sum /srv/archives/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, utiliza 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. Agrega -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 comparar 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 uno

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

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 una copia de seguridad

  • Verifica el tipo de 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.
  • Limita 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 son más costosos que el tiempo de CPU. No reemplaza una estrategia de copia de seguridad, una huella conservada con el archivo y una prueba de restauración realizada antes de un incidente.

sudo apt update && sudo apt upgrade