Acelerar ‘scp’ un 800% con tar

El comando ‘scp’ es sin duda la opción más cómoda y útil a la hora de copiar archivos entre distintas máquinas. Es seguro (funciona a través de ssh) y versátil; elegimos origen y destino (máquina, usuario y ruta para cada extremo (por omisión los ídem locales)). Y a esperar.

A esperar; sobre todo porque por cada archivo que copiemos se abrirá y se cerrará una nueva conexión, algo en lo que ssh es especialmente lento (al estilo de FTP). Si copiamos archivos muy grandes no tenemos problema, pero cuando copiamos directorios con cientos, miles, o decenas o centenas de miles de archivos podemos llegar a tardar varios días en realizar una copia de unos pocos GiBs (la inmensa mayor parte del tiempo perdido en abrir y cerrar conexiones). El caso del típico directorio con infinitos pequeños archivos de texto (emails, información de sesiones, carpetas como /etc, etc…).

La solución más común es hacer un tar (o un zip; aunque este último no conservará usuarios, grupos y permisos) y copiar el archivo empaquetado, pero esto se vuelve poco práctico porque nos obliga como mínimo a entrar en la máquina de destino a descomprimir el archivo copiado si el origen es local; o entrar en la máquina de origen para empaquetar si el origen es remoto.

¿La solución? Empaquetar y desempaquetar al vuelo los archivos que queremos copiar, de la siguiente forma:

Copiar de local a remoto

tar cfz - /origen | ssh usuario@host tar zxvf - -C /destino

Copiar de remoto a local

ssh usuario@host "tar cfz - /origen" | tar zxvf - -C /destino

 

Donde:

c: Crea un nuevo “archivo” (paquete en realidad) al que añadir elementos del sistema de ficheros.
f: El siguiente argumento indica la ruta y nombre del “archivo”.
z: Comprime usando gzip (opcional). Vale la pena gastar un extra CPU, los archivos de texto (lo habitual) se comprimen mucho y muy rápido.
x: Extrae los archivos de un “archivo” tar.
-C: Cambia al directorio indicado a continuación (debe existir).
: El guión indica que el “archivo” de destino es la salida o la entrada estándar (dependiendo de si empaquetamos o desempaquetamos). Dado que en sistemas tipo unix todo es un “archivo”, no hay nada de extraño en hacer esto.

La mejora de velocidad que he medido en mis pruebas ha sido de hasta el 800% (que se dice pronto). Pero seguro que vosotros podéis conseguir aún más (más cuantos más archivos y más pequeños estéis copiando).

¿Alguien se atreve a montar la versión que copia entre máquinas remotas directamente?


Si te gusta esta entrada... compártela! 😉
Tweet about this on TwitterShare on Facebook0Share on Google+0Share on Tumblr0Pin on Pinterest0Share on LinkedIn0Share on Reddit0

Responder

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Límite de tiempo se agote. Por favor, recargar el CAPTCHA por favor.