Compresión más rápida con tar y pigz
Envía un archivo tar sin comprimir a pigz mediante un pipeline para comprimir un proyecto usando
varios núcleos de CPU. Obtendrás un archivo .tar.gz convencional que los
destinatarios podrán extraer con gzip y tar sin instalar pigz.
El siguiente tutorial crea ese archivo, excluye los logs y compara el archivo restaurado con
el original.
Comprueba las herramientas
Usa Bash y GNU tar en Linux. Los ejemplos se probaron con GNU tar 1.34, pigz 2.6 y Bash 5.1 en Ubuntu 22.04, y con GNU tar 1.35, pigz 2.8 y Bash 5.3 en Ubuntu 26.04. En Ubuntu o Debian, instala pigz con:
sudo apt-get update && sudo apt-get install pigz
Comprueba las versiones instaladas antes de continuar:
bash --version && tar --version && pigz --version && gzip --version
Los siguientes comandos están dirigidos a esos entornos GNU/Linux. macOS incluye una implementación distinta de tar, y la disponibilidad de paquetes varía en otras distribuciones de Linux; la configuración de esos entornos queda fuera del alcance de este tutorial.
Crea un proyecto pequeño
Ejecuta los siguientes bloques en la misma sesión de Bash. Empieza en un directorio donde puedas
crear un directorio nuevo llamado pigz-demo:
mkdir pigz-demo &&
cd pigz-demo &&
mkdir project &&
printf 'Keep this project file.\n' > project/README.txt &&
printf 'Omit this debug log.\n' > project/debug.log
La cadena && se detiene si falla la preparación.
Si pigz-demo ya existe, elige otra ubicación; este bloque rechaza su reutilización
deliberadamente. Ahora deberías estar dentro de pigz-demo, con dos archivos
en project/.
Comprime el proyecto
Ejecuta este bloque completo, incluidos los paréntesis:
(
set -e
set -o pipefail
set -o noclobber
tar --exclude='*.log' -cf - project | pigz -p 4 -6 > project.tar.gz
printf 'Created project.tar.gz\n'
)
Aquí, tar -c recopila el contenido del directorio,
y -f - escribe el archivo tar en la salida estándar. Pigz comprime ese
flujo con hasta cuatro hilos de compresión en el nivel seis, su nivel predeterminado. Mantén
project.tar.gz fuera de project/ para que el archivo tar no pueda
incluir su propia salida. No añadas aquí la opción -z de tar:
eso comprimiría el flujo antes de que llegue a pigz.
La política de salida consiste en rechazar un archivo comprimido existente.
La opción noclobber de Bash impide que la redirección reemplace un archivo
regular existente, incluso al volver a ejecutar el bloque de forma no interactiva.
Elige un nombre de salida nuevo para conservar otro archivo comprimido. Los paréntesis limitan
estas opciones del shell a esta operación.
Con pipefail, un fallo en tar o en pigz hace que falle el pipeline;
set -e detiene entonces el bloque antes de su mensaje de éxito.
De lo contrario, pigz podría comprimir correctamente un flujo incompleto de un comando tar que
haya fallado. Una ejecución fallida puede dejar un project.tar.gz parcial;
no lo uses, aunque supere una comprobación de integridad de gzip. Investiga el error y elige
un nombre de salida nuevo antes de volver a intentarlo. Consulta la
documentación de Bash sobre pipelines y opciones del shell.
Elige qué excluir
El patrón entre comillas --exclude='*.log' excluye los logs dentro del directorio del
proyecto, incluido project/debug.log. Las comillas permiten que tar interprete el
comodín en lugar del shell. Elimina esa opción si los logs deben formar parte del archivo tar.
Para excluir más elementos, GNU tar acepta opciones --exclude repetidas
o --exclude-from con un patrón por línea en un archivo. Son patrones de estilo
shell, no expresiones regulares; consulta la
documentación de GNU tar sobre exclusiones.
Verifica y restaura el archivo comprimido
Tras crearlo correctamente, comprueba el flujo gzip y enumera los elementos del archivo tar:
gzip -t project.tar.gz && tar -tzf project.tar.gz
Si gzip -t se ejecuta correctamente, no muestra ninguna salida.
Para el proyecto de ejemplo, tar muestra a continuación:
project/
project/README.txt
Estas comprobaciones responden a preguntas distintas: gzip comprueba la integridad de los datos comprimidos, mientras que el listado te permite comprobar qué rutas se archivaron. Ninguna demuestra que se hayan incluido todos los archivos de origen previstos. El manual de gzip documenta su prueba de integridad.
Extrae el contenido en un directorio nuevo y compara el archivo restaurado con el original:
mkdir restored &&
tar -xzf project.tar.gz -C restored &&
cmp project/README.txt restored/project/README.txt &&
printf 'Restored README.txt matches the original.\n'
El mensaje final aparece solo si la extracción y la comparación byte a byte se completan
correctamente. El comando inicial mkdir rechaza un directorio
restored existente, por lo que volver a ejecutar este bloque no puede
sobrescribir una restauración anterior. Si la extracción falla, revisa el error y usa un destino
nuevo para el siguiente intento. Para un proyecto real, compara los archivos que necesitas
recuperar, no solo el README de ejemplo.
Elige el número de hilos y el nivel de compresión
Empieza con -6. Prueba -1 cuando el tiempo de
compresión importe más que el tamaño, o -9 cuando puedas dedicar más
tiempo de CPU a intentar reducir la salida. Aumentar el nivel no significa comprimir más rápido.
Sin -p, pigz usa de forma predeterminada el número de procesadores
activos; un límite explícito resulta útil en una máquina que realiza otras tareas.
Estas opciones se describen en el manual de pigz.
El pequeño ejemplo anterior comprueba el funcionamiento correcto, no la velocidad. Cuando tengas un proyecto representativo que no cambie, compara uno y cuatro hilos de compresión al mismo nivel:
(
set -e
set -o pipefail
for threads in 1 4; do
printf 'Compression threads: %s\n' "$threads"
time tar --exclude='*.log' -cf - project | pigz -p "$threads" -6 > /dev/null
done
)
El comando time de Bash mide todo el pipeline; compara los tiempos
transcurridos de real. Esto descarta la salida comprimida, por lo que mide
la lectura y la compresión sin escribir un archivo comprimido en disco. Repite la prueba con tus
propios datos: la caché del sistema de archivos, las CPU disponibles, el rendimiento del
almacenamiento y los archivos ya comprimidos pueden cambiar el resultado. No hay un aumento de
velocidad fijo que puedas esperar.
Pigz paraleliza la compresión, pero la descompresión convencional de gzip sigue usando un solo hilo de descompresión, con hilos auxiliares para la lectura, la escritura y las sumas de comprobación. No esperes la misma escalabilidad al extraer. El manual de pigz explica esta distinción.
Usa el archivo comprimido en una tarea de copia de seguridad
Antes de archivar un proyecto real, detén los procesos que modifican sus archivos o archiva una instantánea del sistema de archivos. Tar no convierte un directorio activo en una copia de seguridad coherente de un momento concreto. Para una tarea programada, usa rutas absolutas, asigna un nombre de salida nuevo a cada ejecución y conserva las comprobaciones de fallos antes de transferir o dividir el resultado.
Este flujo de trabajo crea un único archivo tar local completo. Las cadenas de copias de seguridad incrementales, las transferencias por SSH y los archivos tar divididos necesitan sus propios mecanismos de gestión de fallos y procedimientos de restauración. Conserva la última copia de seguridad que hayas verificado hasta que hayas comprobado el nuevo archivo tar y los archivos que necesitas recuperar.
