Entradas en "sysadmin"

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

Recuperar código borrado

Volvemos con los problemas de la semana. Esta vez un poco de sys-admin.

A todos nos ha pasado alguna vez perder ficheros de código por accidente [hacer un rm con argumentos erróneos, usar mal el comando zip (@Erful lo sabe muy bien xD), editar y cerrar un archivo remoto (por FTP, SSH) y que un paquete se pierda por mala conexión y se destruya la copia remota y la original se sincronice vacía, etc).

Ante esto, si lleváis días o semanas trabajando en el código y no tenéis copias de seguridad, llegará el momento del pánico. Pero si mantenemos la calma y usamos todos nuestros conocimientos, hay distintas formas de recuperar el contenido perdido.

Problema: Crear un archivo con al menos unas 50 líneas de código, borrarlo, y después volver a recuperarlo (1)..

(1) Para borrarlo podemos ejecutar rm sobre él o editarlo, borrar todo el contenido y guardar (a vuestra elección).

¡Tiempo! (tic, tac, tic, tac).

Leer más