Transmite archivos tar entre servidores sin almacenamiento local
Transferir archivos entre servidores puede ser complicado, sobre todo cuando el almacenamiento local es limitado. Por suerte, puedes evitar por completo el almacenamiento local transmitiendo archivos tar directamente entre servidores mediante túneles SSH. Este método resulta especialmente útil para migraciones de servidores, copias de seguridad y la gestión de grandes conjuntos de datos.
Fundamentos de la transmisión de tar
El comando tar es versátil y puede transmitir datos directamente mediante pipes. Al crear un
archivo tar que se extraerá en otro lugar, es crucial cambiar primero el directorio a la ruta de
origen o usar la opción -C de tar cf. De lo contrario, el archivo tar contendrá la ruta completa desde
la raíz del servidor de origen, algo que normalmente no se desea en el servidor de destino. La
sintaxis básica para crear y extraer archivos tar correctamente con pipes es:
tar cf - -C /path/to/source . | tar xf - -C /path/to/destination
Aquí, tar cf - -C /path/to/source . crea un archivo tar con el contenido de /path/to/source (con
rutas relativas a este directorio gracias a .) y lo transmite a stdout. Luego,
tar xf - -C /path/to/destination lee desde stdin y extrae el archivo tar en
/path/to/destination. Así se garantiza que los archivos se extraigan en la estructura de
directorios prevista.
Transferencias directas entre servidores con ssh
Para transferir archivos directamente entre dos servidores remotos, combina tar con SSH:
ssh user@source-server "tar cf - -C /path/to/source ." | ssh user@destination-server "tar xf - -C /path/to/destination"
Este comando transmite el archivo tar directamente del servidor de origen al servidor de destino, sin almacenamiento intermedio.
Técnicas avanzadas: ssh proxyjump
Si tus servidores están detrás de un host bastión, usa la función ProxyJump de SSH:
ssh -J user@bastion-host user@source-server "tar cf - -C /path/to/source ." | ssh -J user@bastion-host user@destination-server "tar xf - -C /path/to/destination"
Así, tu flujo tar viaja de forma segura por un túnel a través del host bastión.
Supervisar el progreso con pipe viewer (pv)
En las transferencias grandes, es útil supervisar el progreso. Usa pv para visualizar la transferencia:
ssh user@source-server "tar cf - -C /path/to/source ." | pv | ssh user@destination-server "tar xf - -C /path/to/destination"
pv ofrece información en tiempo real sobre la velocidad y el progreso de la transferencia.
Cifrar flujos sobre la marcha
Para proteger tus datos durante la transferencia, cifra el flujo. En entornos de producción, usar
archivos de clave o solicitar una contraseña (omitiendo -pass) suele ser mejor que codificar
las contraseñas en el propio comando. Cuando uses openssl enc para el cifrado simétrico, considera
emplear una función de derivación de claves como PBKDF2, que se habilita con la opción -pbkdf2
(disponible en las versiones modernas de OpenSSL), para una mayor seguridad:
# Consider prompting for password or using key files for better security
ssh user@source-server "tar cf - -C /path/to/source . | openssl enc -aes-256-cbc -pbkdf2 -salt -pass pass:yourpassword" | ssh user@destination-server "openssl enc -d -aes-256-cbc -pbkdf2 -pass pass:yourpassword | tar xf - -C /path/to/destination"
Como alternativa, usa gpg para el cifrado. Puedes usar cualquier identificador de clave GPG
válido (como un ID de clave, una huella digital o un email asociado a la clave) para el
--recipient. El destinatario debe tener la clave privada correspondiente para descifrar el flujo.
ssh user@source-server "tar cf - -C /path/to/source . | gpg --encrypt --recipient your-key-identifier" | ssh user@destination-server "gpg --decrypt | tar xf - -C /path/to/destination"
Ejemplo real: migrar una aplicación web
Imagina que migras una aplicación web entre proveedores de nube. Puedes transmitir directamente todo el directorio de la aplicación:
ssh user@old-server "tar cf - -C /var/www/html ." | pv | ssh user@new-server "tar xf - -C /var/www/html"
Este enfoque minimiza el tiempo de inactividad y garantiza una transición fluida.
Consideraciones de rendimiento y consejos de optimización
- Compresión: Usa las opciones de compresión de
tarpara reducir el uso de ancho de banda. Por ejemplo,zpara gzip,jpara bzip2 oJpara xz. El comando siguiente usa gzip (z):
ssh user@source-server "tar czf - -C /path/to/source ." | ssh user@destination-server "tar xzf - -C /path/to/destination"
Para usar bzip2, usarías cjf en el origen y xjf en el destino. Para xz, usa cJf y
xJf, respectivamente. Elige el algoritmo según el equilibrio deseado entre la tasa de compresión
y el uso de CPU (gzip es rápido, xz ofrece mayor compresión).
- Velocidad de red: Asegúrate de que tu conexión de red sea estable y lo bastante rápida para gestionar transferencias grandes.
- Gestión de recursos: Supervisa el uso de CPU y memoria durante las transferencias para no sobrecargar tus servidores.
Solución de problemas comunes
- Errores de permisos: Asegúrate de que el usuario tenga los permisos de lectura adecuados en todos los archivos y directorios de origen, y permisos de escritura en el directorio de destino.
- Interrupciones de red: Usa herramientas como
screenotmuxpara mantener las sesiones durante las interrupciones de red. Esto permite que el comando siga ejecutándose en segundo plano y te deja volver a conectarte a la sesión aunque se caiga tu conexión local. - Archivos tar dañados: Verifica la integridad comprobando los tamaños de los archivos. Para
comprobaciones más sólidas, compara las sumas de verificación (por ejemplo, con
md5sumosha256sum) de algunos archivos clave tanto en el origen como en el destino después de la transferencia.
Conclusión
Transmitir archivos tar directamente entre servidores es una técnica potente para transferir
archivos de forma eficiente, sobre todo cuando el almacenamiento local es limitado. En Transloadit,
nuestro Robot 🤖 /file/compress ofrece un empaquetado robusto de
archivos en el lado del servidor, en formatos como tar (opcionalmente comprimido con gzip) y
zip, que puede formar parte de un flujo de trabajo más amplio para gestionar y transferir
archivos de forma eficiente.
