Entradas en "ssh"
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?
Leer más