En este momento estás viendo rsync «remote sync»

rsync «remote sync»

rsync «remote sync»

Rsync «Remote Sync» (Sincronización Remota) es una herramienta omnipresente en sistemas Linux, rápida y versátil que nos permite la copia y sincronización de nuestros ficheros localmente y de forma remota, pudiendo hacerlo entre diferentes directorios, discos, e incluso entre diferentes equipos en red. Admite ssh, lo que nos permite la transferencia de datos con cualquier servidor remoto. Vamos a ver algunos ejemplos de uso básico y avanzado del comando Rsync. Necesitaremos ser root o tener privilegios de sudo.

Sumario

  • Consideraciones previas
  • Sintaxis y opciones de rsync
  • Sincronizar ficheros y directorios localmente
  • Copiar/sincronizar un fichero o directorio localmente en otro directorio
  • Copiar/sincronizar archivos y directorios en equipo remoto
  • Copias seguras con rsync y ssh
  • Incluir o excluir ficheros o directorios
  • Eliminación de ficheros en el destino
  • Hacer pruebas con el comando sin que aplique los cambios

Consideraciones previas

Rsync sincroniza eficientemente ficheros y directorios. Podríamos utilizar el comando cp o scp, pero rsync es más rápido al hacer copias incrementales de estos y no los ficheros completos. Además podemos aplicar compresión y descompresión de los ficheros en ambos extremos, consumiendo menos ancho de banda.

Sería extraño que tu distribución Linux no tuviera instalada la herramienta, pero si es así, es sencilla de instalar

apt-get update #para actualizar la lista de paquetes de los repositorios
apt-get install rsync #para instalar la herramienta

Sintaxis y opciones de rsync

El modo de uso de rsync es idéntica a los comandos cp o scp, es decir,

rsync [opciones] origen [destino]

Para ver todas las opciones consulta «man rsync» en tu terminal, aquí vemos las más comunes:

  • -v: (verbose) muestra el progreso de la transferencia.
  • -h: (human readable) muestra la salida numérica en un formato comprensible.
  • -r: (recursive) copia los datos de forma recursiva, pero no conserva las fechas ni los permisos de los datos de origen.
  • -a: (archive mode) copia los datos de forma recursiva, y además preserva los enlaces simbólicos, los propietarios, los permisos y las fechas de los datos de origen.
  • -z: (compress) comprime los datos durante la transferencia de los mismos.
  • -o: (Owner) preserva el propietarios.
  • -g: (group) preserva el grupo.
  • -P: (progress) nos muestra el progreso de la trasnferencia de datos
  • -i: (itemize-changes) genera un resumen de cambios para todas las actualizaciones
  • –stats: nos da algunas estadísticas de la transferencia de ficheros

Sincronizar ficheros y directorios localmente

Si queremos hacer una sincronización de un directorio, con otro de nuestro sistema, para hacer una copia incremental, ejecutamos el comando como sigue. La primera copia será completa y las sucesivas solo copiará los ficheros modificados.

mkdir Directorio1 Copia_Directorio1  
touch Directorio1/fichero{1..6}
Creamos directorio con ficheros

Para sincronizar directorios, rsync, necesita, al menos la opción «-r», que indica recursividad. Esta acción copiará el contenido del directorio y de todos los subdirectorios que se encuentren el directorio. No obstante lo normal, como veremos es utilizar las opciones «-vazh» en vez de «-r».

sudo rsync -r Directorio1/ Copia_Directorio1
ls -l Copia_Directorio1/
Copia directorio

Hay que tener muy presente la barra «/» o «slash» al final del directorio de origen, para copiar el contenido del directorio y no el mismo diretorio. Si lo hiciésemos así, el resultado sería que nos copiaría Directorio1 en Copia_Directorio1 y no su contenido, quedando: Copia_Directorio1/Directorio1/*.

Añadimos un fichero a Directorio1 y sincronizamos los directorios.

echo "Estamos añadiendo un fichero para probar la sincronización" > Directorio1/Nuevofich
sudo rsync -vazhi --stats Directorio1/ Copia_Directorio1
Prueba sincronización

Lo verificamos

ls -l Copia_Directorio1/     
Verificamos

Estamos trabajando dentro de un directorio. Si lo que queremos es guardar la copia en otro directorio lo hacemos haciendo uso de las rutas absolutas o relativas. Veamos el ejemplo anterior.

Copiar/sincronizar un archivo o directorio localmente en otro directorio

Para copiar el fichero localmente en otro directorio tenemos que hacer uso de las rutas absolutas o relativas, según nos convenga. Con el siguiente comando, copiaremos el fichero «Nuevofich» localmente de un directorio a otro distinto, en este caso «~/Descargas/CopiaFichero». Si el directorio de destino no existe, Rsync lo creará automáticamente. Lo ejecutamos desde el directorio actual.

sudo rsync -zvh Directorio1/Nuevofich ~/Descargas/CopiaFichero
Sincronización con más opciones

Si lo hiciésemos desde el directorio destino sería

cd Descargas
sudo rsync -zvh ~/RutaDirOrigen ./Nuevofich
 

Para copiar un directorio, lo que tenemos que hacer es modificar las opciones añadiendo la opción «-a», así conseguiremos copiar los datos de forma recursiva, y además preservar los enlaces simbólicos, los propietarios, los permisos y las fechas de los datos de origen.Si ejecutamos el siguiente comando, copiará el /home/Directorio1 en /home/CopiaSeg/.

sudo rsync -avzh Directorio1 /home/CopiaSeg/
Sincronización con todos los atributos

Copiar/sincronizar archivos y directorios en equipo remoto

Si queremos guardar la copia a realizar en un equipo remoto, función principal del comando rsync «remote sync», la sintaxis del comando es la siguiente, se indica el hostname o dirección IP del servidor remoto seguido de «:» y el directorio destino (host:dir). Lo vemos con un ejemplo. Tenemos un servidor Ubuntu en la IP 192.168.1.8, que sera el destino remoto de la copia.

sudo rsync -avz ruta_fichero_o_directorio/ usuario@IP:/ruta_destino/

En este caso

sudo rsync -avz /home/javier/Rsync/Directorio1/ javier@192.168.1.8:/home/javier/CopiaSeguridad/ 
Sincronización remota

Y vemos, en el servidor Ubuntu, que tenemos «CopiaSeguridad»

Sincronizado en el Servidor

Pero también lo podemos hacer a la inversa. Podemos sincronizar un directorio del servidor en el equipo cliente. Te recomiendo utilizar la opción «-P» –progress, ya que es muy útil en transferencias de múltiples ficheros para visualizar el progreso de la transferencia.

sudo rsync -avzhP usuario@IP:ruta_dir_servidor ruta_equipo_cliente

En este caso

sudo rsync -avzhP javier@192.168.1.15:/home/javier/Rsync/Directorio1/ /home/javier/CopiaSeguridad
Sincronización con la opción «P»

Con esta última opción, podemos restaurar la copia del servidor en el cliente.

Copias seguras con rsync y ssh

Si queremos realizar una copia segura, podemos utilizar ssh. Este protocolo nos permite encriptar los datos a transferir con la opción «-e». Puedes ver como se instala y configura ssh en este enlace. La sintaxis es la siguiente

sudo rsync -avzheP ssh ruta_directorio_origen/ usuariot@IP:ruta_directorio_destino/

En este caso sería

sudo rsync -avzheP ssh /home/Directorio1/ usuario@IP:/home/CopiaSeguridad/

SSH utiliza, por defecto el puerto 22, pero si nos tenemos que conectar a un puerto distinto, por configuración en el servidor, lo podemos especificar en el comando con la opción «-p» tras el comando ssh. Sería

sudo rsync -avzh -e 'ssh -p <numerodepuerto>' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/

Incluir o excluir ficheros o directorios

Con las opciones «–include» y «–exclude» indicamos qué ficheros o directorios deseamos incluir o excluir en la transferencia de datos. Por ejemplo, le decimos a rsync que incluya sólo los archivos y directorios cuyo nombre comience por «F», y que excluya el resto de archivos y directorios. Del servidor al cliente

sudo rsync -avze ssh --include 'F*' --exclude '*' usuario@IP:ruta_directorio_origen/ ruta_directorio_destino/

Y del cliente al servidor

sudo rsync -avze ssh --include 'F*' --exclude '*' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/

Si queremos copiar solo los ficheros con un peso concreto, usamos la opción «–max-size». Por ejemplo, solo copiamos los ficheros que tengan un tamaño de hasta 500k.

sudo rsync -avzhe ssh --max-size='500k' ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/

Todas estas opciones están disponibles para su uso en local sin ssh.

Eliminación de ficheros en el destino

Si lo que queremos es tener dos directorios completamente iguales con los mismos ficheros, es decir, que el directorio destino sea idéntico al directorio origen, y tenemos uno o mas ficheros, que existen en el destino, pero que ya no están en el origen, tenemos que utilizar la opción de rsync «–delete». Se eliminarán los ficheros que estén en el destino que ya no existan en el origen. Vemos el contenido de los dos directorios. Primero creamos otro nuevo en Directorio1

touch Directorio1/ejemplo.txt
Contenido de los directorios
rsync -avhP --delete Directorio1/ CopiaSeguridad/CopiaSeguridad
Sincronización con la opción –delete

Borramos en Directorio1 el fichero ejemplo.txt y podemos ver que al copiar todo de Directorio1 a CopiaSeguridad, en CopiaSeguridad se elimina ejemplo.txt al no existir en Directorio1. Con la opción «-P» muestra el progreso de la transferencia fichero por fichero.

Comprobación de sincronización con delete

Eliminación de ficheros en el origen

Si después de haber completado una transferencia o copia de datos, no necesitamos guardar esos datos en el origen, para liberar espacio, utilizamos la opción «–remove-source-files», que eliminará los ficheros en el origen. ¡¡¡CUIDADO: ESTA OPCIÓN ES MUY PELIGROSA!!!

touch Directorio1/prueba1.txt Directorio1/prueba2.txt

sudo rsync --remove-source-files -azvhe  Directorio1/prueba* Directorio2/
Borrando datos en origen

Y en remoto

sudo rsync --remove-source-files -azvhe ssh ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/

Hacer pruebas con el comando sin que aplique los cambios

Al realizar transferencias críticas, donde sobreescribimos o borramos datos, podemos provocar la pérdida de estos. Por ello, si no estamos muy familiarizados con el uso del comando, podemos utilizar la opción «-dry-run», y rsync no realizará ninguna acción de transferencia, copiado o eliminado de ficheros, pero sí nos mostrará la salida como si lo hubiera hecho. Una vez asegurado que las acciones a realizar son las que buscamos, solo tendremos que borrar la opción «-dry-run» y volver a ejecutar el comando.

sudo rsync -azvh --dry-run --remove-source-files  Dir1/prueba* Dir2/

Y en remoto

sudo rsync --dry-run --remove-source-files -azvhe ssh ruta_directorio_origen/ usuario@IP:ruta_directorio_destino/

Si lo vas a hacer en un servidor remoto, hazlo con ssh para securizar la transferencia. Si lo estas probando, con un servidor en local, puedes prescindir de ssh.

Forzar una transferencia completa en vez de sólo los cambios

Por defecto, rsync sólo realiza una copia completa de los archivos la primera vez, luego simplemente copia incrementalmente los bloques y bytes que han cambiado desde la sincronización completa. Si necesitamos forzar que se realice una sincronización completa, tenemos que usar la opicón «–W»

En el servidor Ubuntu tenemos

Contenido del dirctorio CopiaSeguridad en el servidor

Y en el cliente Debian

Contenido del directorio en el cliente

Hacemos la sincronización completa del servidor al cliente

sudo rsync -zvhWe usuario@IP:ruta_directorio_origen/ ruta_directorio_destino/

En este caso será

sudo rsync -zvhWe javier@192.168.1.8:/home/javier/CopiaSeguridad/ /home/javier/Rsync/Directorio1/
Sincronización completa

Y del cliente al servidor lo hacemos como sigue

sudo rsync -zvhWe ruta_directorio_origen/* usuario@IP:ruta_directorio_destino/ 

En nuestro caso

sudo rsync -zvhWe /home/javier/Rsync/Directorio1/* javier@192.168.1.8:/home/javier/CopiaSeguridad/
Sincronización del cliente al servidor

Vemos que en el servidor ha añadido el fichero prueba1.txt

Comprobación en el servidor

El comando tiene muchas más opciones que puedes consultar ejecutando «man rsync». Y con esto ya podemos copiar, borrar y mover ficheros y directorios de una forma segura y rápida.

Si tienes algún comentario que hacer, al pie del post tienes un formulario para hacerlo.

Y si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, o te quieres suscribir para recibir un correo-e una vez al mes con las nuevas publicaciones, en la página de contacto , tienes otro formulario.

Esta entrada tiene 2 comentarios

  1. Barto

    Buen trabajo Javier. Es muy de agradecer tu esfuerzo

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.