- Blog
- Comando rsync: qué es y cómo usarlo en Linux
Comando rsync: qué es y cómo usarlo en Linux
Siempre nos gusta dedicar un poco de nuestro tiempo para enseñaros los comandos más importantes en el día a día de la administración de servidores Linux. Hoy vamos a abordar el comando rsync, de modo que puedas aprovechar todas sus posibilidades, con ejemplos claros y útiles en diversos contextos.
¿Qué es el comando rsync?
El comando rsync es una herramienta disponible para Linux y otros sistemas Unix like que permite sincronizar y transferir archivos y directorios de manera sencilla, rápida y segura.
Lo puedes usar en muchos contextos como por ejemplo en las copias de seguridad, migración de datos y sincronización de contenido entre ordenadores o servidores, tanto en local como a través de redes. Para ello usa protocolos seguros como SSH.
La ventaja más importante es que solamente transfiere las diferencias entre los archivos de origen y destino, por lo que ahorra tiempo y, sobre todo, ancho de banda.
Sintaxis básica del comando rsync
Vamos a ir directos al grano para explicar la sintaxis básica del comando rsync.
Estructura general del comando
Comenzamos por definir la estructura general del comando, que la puedes apreciar en el siguiente esquema de funcionamiento:
rsync [parámetros] origen destino
Explicación de los parámetros más comunes
Este comando contiene numerosos flag o parámetros que nos permiten personalizar el modo de trabajo de una manera extremadamente detallada. Las variantes que no debes dejar de conocer son las siguientes:
- -a es para el modo archivo, lo que preserva permisos, propietarios, enlaces simbólicos y marcas de tiempo.
- -v sirve para hacer un modo verboso que permite ver el progreso de la transferencia.
- -z hace que los datos viajen por la red comprimidos, lo que ahorra mucho tiempo y ancho de banda.
- –delete sirve para eliminar los archivos en destino, que no están en origen.
- –exclude, que permite excluir ciertos archivos o directorios de la transferencia.
- -e ssh que sirve para definir que la conexión remota debe realizarse por SSH.
Luego veremos ejemplos de todos estos flag y otros también importantes.
Principales características de rsync
Vamos a explicarte por qué este comando es tan útil, a través del análisis de sus principales características.
Sincronización incremental de archivos
La sincronización incremental de archivos implica que rsync detectará qué partes de los archivos han cambiado, haciendo que solo se tenga que transferir esos fragmentos, en lugar de necesitar copiar todo el archivo de nuevo.
Transferencia eficiente a través de red local o SSH
Puedes utilizar el comando rsync para copiar y sincronizar archivos dentro del mismo ordenador, entre ordenadores o entre servidores (que podrían estar en redes locales o en redes públicas, como por ejemplo Internet). Al usar protocolos SSH puedes estar seguro de que las transferencias se mantendrán privadas.
Compresión, exclusión y preservación de permisos
Una de las ventajas es que permite comprimir datos durante la transferencia, pero también tiene algunas características interesantes como excluir rutas específicas y mantener intactos los permisos y propiedades de los archivos que va a mover de un lado a otro.
Verificación y seguridad de datos
Utiliza la verificación de los archivos transferidos mediante los típicos checksum, lo que permite asegurar la integridad de los archivos.
Además, cuando se hacen sincronizaciones en remoto, si se usa con SSH, lo que generalmente es una recomendación, la conexión está cifrada y no se podrán capturar los datos en las transferencias.
¿Cómo usar rsync?
Vamos a analizar con más detalle ahora cómo poder usar rsync con ejemplos típicos para diversos contextos habituales de uso.
Sincronizar directorios locales
Si queremos sincronizar directorios locales podemos utilizar un comando como este.
rsync -av /home/usuario/proyecto/ /home/usuario/backup/
Este comando copiará todo el contenido de «/home/usuario/proyecto/» en la carpeta «backup». Mantendrá además permisos y fechas.
Sincronizar archivos entre servidores vía SSH
Algo muy típico es sincronizar archivos entre distintos servidores utilizando el protocolo SSH.
rsync -avz -e ssh usuario@servidor:/ruta/origen/ /ruta/local/destino/
El comando anterior transfiere datos desde un servidor remoto usando una conexión cifrada.
Programar rsync con cron para automatizar tareas
Algo muy típico cuando estamos administrando servidores es realizar sincronizaciones periódicas, por ejemplo cuando queremos hacer copias de seguridad. Para ello podemos añadir un comando rsync al crontab.
0 3 * * * rsync -avz /origen/ usuario@servidor:/destino/
Este ejemplo ejecuta la sincronización rsync, haciendo ese trabajo cada día a las 03:00.
Casos de uso prácticos con rsync
Vamos a ver ahora otra serie de casos prácticos donde el comando rsync nos resultará especialmente útil, con nuevos ejemplos de comando que podrías prácticamente copiar y pegar para realizar tareas diversas.
Copiar archivos entre directorios locales
Si quieres conseguir que diversas carpetas de tu disco, o de distintos discos se sincronicen puedes usar un comando como este:
rsync -av /media/fotos/ /backup/fotos/
Sincronizar archivos entre servidores mediante SSH
En este otro comando tienes una configuración un poco más detallada de sincronización de archivos entre dos carpetas de dos servidores, algo muy típico cuando tienes que hacer una migración.
rsync -avz -e ssh usuario@servidor1:/var/www/ usuario@servidor2:/var/www/
Incluso si agregas ese comando en el cron podrías mantener sincronizado el contenido web de dos servidores, por ejemplo para tener un backup listo para funcionar en caso que el servidor principal se caiga.
Crear copias de seguridad automatizadas
Otro caso muy típico sería la creación de copias de seguridad automatizadas, que pueden realizarse de manera muy rápida utilizando el comando rsync, a la vez que ahorramos transferencia y espacio en disco, ya que no tenemos que hacer el copiado completo de todos los archivos cada vez que se realiza la sincronización.
rsync -av --delete /home/usuario/ /mnt/disco_backup/
Este comando estaría pensado para enviar los archivos a un disco independiente. Con la opción –delete nos asegura que el respaldo sea una réplica exacta del origen, eliminando lo que ya no exista.
No obstante, lo recomendable sería enviar los archivos a otro lugar, como otro servidor, o incluso si se puede a otro centro de datos, de modo que aumentemos las protecciones ante contingencias mayores.
rsync -avz --delete /home/usuario/ usuario@servidor-remoto:/ruta/backup/
Este comando crea una copia exacta del directorio /home/usuario/ en un servidor remoto, usando compresión para optimizar la transferencia y eliminando en destino lo que ya no existe en el origen.
Si quieres automatizarlo con usando una tarea programada con el cron, podrías añadirlo a crontab así:
0 2 * * * rsync -avz --delete /home/usuario/ usuario@servidor-remoto:/ruta/backup/
Esto realizará la copia cada día a las 02:00.
Excluir archivos o carpetas específicas
Hay veces que no es necesario hacer la sincronización de algunas carpetas en particular, como por ejemplo la carpeta de archivos temporales.
rsync -av --exclude='*.tmp' /proyecto/ /backup/proyecto/
Sincronización programada con cron y rsync
Ya hemos visto que utilizar cron te puede ahorrar estar pendiente de que tus sincronizaciones de archivos se ejecuten de manera periódica.
Como ya hemos visto algunos ejemplos sobre el uso de Cron no tendrás ningún problema en reproducir tus comandos de sincronización. Simplemente tienes que usar crontab como ya hemos mencionado.
Consejos y buenas prácticas al usar rsync
También existen algunas prácticas adicionales que queremos señalar para completar este post.
Usar la opción `–dry-run` antes de ejecutar
A veces puedes simplemente simular que es lo que pasaría al ejecutar el comando rsync. Para ello puedes usar el flag –dry-run y el comando te mostrará un resumen de las acciones que realizaría. Esto te puede ahorrar problemas o incluso evitar que se transfieran archivos grandes que quizás no necesitas enviar a través de Internet.
rsync -av --dry-run origen/ destino/
Comprobar permisos y usuarios al sincronizar
Para que funcione rsync necesitas que tus carpetas de origen y destino tengan permisos de lectura y escritura.
Puedes usar los comandos típicos de Linux para poder verificar los permisos como chown. También puedes mantener permisos y propiedad con la opción -a.
Además puedes usar sudo para obtener permisos de superusuario. Aunque en el servidor remoto sería necesario disponer de permisos en el usuario con el que te conectes.
sudo rsync -av /datos/ usuario_con_permisos@servidor:/backup/
Registrar salidas en archivos log
Si necesitas saber qué se ha realizado en cada uno de los comandos rsync que se ejecutan puedes activar los log de salida. Esto puede venir bien para auditoría o diagnóstico, sobre todo útil cuando has metido la sincronización en el cron.
El archivo de log lo tienes que indicar con –log-file y luego la ruta del fichero.
rsync -av /origen/ /destino/ --log-file=/var/log/rsync.log
Comprimir datos en transferencias remotas
Esta configuración ya la hemos explicado antes. Se hace con el flag -z:
rsync -avz -e ssh /origen/ usuario@servidor:/destino/
Evitar sobreescritura con opciones avanzadas
Puede haber casos en los que no desees que se sobreescriban en destino los archivos, si es que son más recientes los que ya existen allí. Entonces puedes hacer flags como –ignore-existing o –update. Estos dos flag tienen sutiles diferencias.
- –ignore-existing no actualiza archivos que ya existen en el destino nunca, aunque el archivo de origen sea más nuevo.
- –update solo copia archivos si en el destino no existen o si el archivo de origen es más reciente que el del destino.
Errores comunes al usar rsync y cómo solucionarlos
Vamos a ver los errores más comunes que puedes encontrarte cuando estás usando el comando rsync.
Permisos denegados
Esto ya lo hemos visto en un punto anterior. Si tienes errores de permiso denegado tendrás que verificar que los usuarios que estás utilizando tengan privilegios de lectura o escritura.
Si estás en local puedes solucionarlo fácilmente con el mismo comando, añadiendo sudo delante. Si quieres hacer copiado de archivos en remoto lo que tendrías que verificar es que el usuario que estás utilizando para SSH tiene permisos suficientes.
Problemas con rutas relativas y absolutas
Ten especial atención a las rutas relativas y absolutas. Las rutas relativas comienzan por el nombre de la carpeta tal cual, «carpeta1/» y las rutas absolutas comienzan con una barra al inicio.
Si tienes problemas, te recomendamos que uses rutas absolutas para ayudar a evitar ambigüedades.
Conflictos al usar `–delete` sin precaución
Ten cuidado con la opción –delete, ya que elimina archivos en el destino que no están en el origen. Solo la debes usar si sabes a ciencia cierta que no te interesan los archivos en destino que no estén en origen.
Si tienes alguna duda recuerda siempre que puedes usar el flag –dry-run para verificar qué es lo que realizaría el comando en destino una vez ejecutado.
Alternativas a rsync en Linux
Ya para acabar queremos recomendar otras soluciones, si por cualquier motivo no quieres utilizar rsync. En Linux existen comandos similares que puedes utilizar también, aunque no siempre tengan las mismas prestaciones.
scp
El comando clásico para hacer transferencias de archivos por SSH es scp. Es más simple pero te permitirá igualmente copiar archivos o carpetas enteras entre sistemas usando SSH.
rclone
Este comando es similar en características pero está especializado en sincronizar con servicios en la nube, tales como Google Drive, Dropbox, S3, etc.
Es también muy avanzado y tiene opciones similares a rsync, aunque en este caso están adaptadas a almacenamiento remoto.
Unison
Este es un comando que va un poco más allá, ya que permite sincronización bidireccional. Este comando lo deberías usar cuando los cambios pueden producirse en ambos lados y quieres mantener siempre una sincronización consistente.