Cómo administrar /etc con control de versiones utilizando etckeeper en Linux

Rsync (Sincronización Remota) es el comando más comúnmente utilizado para copiar y sincronizar archivos y directorios de forma remota, así como localmente en sistemas Linux/Unix.

Con la ayuda del comando rsync, puedes copiar y sincronizar tus datos de forma remota y local entre directorios, discos y redes, realizar copias de seguridad de datos y reflejar entre dos máquinas Linux.

Este artículo explica 16 usos básicos y avanzados del comando rsync para transferir tus archivos de forma remota y local en máquinas basadas en Linux. No necesitas ser un usuario root para ejecutar el comando rsync.

Ventajas del comando Rsync

Ofrece varias ventajas, incluyendo:

  • Transferencia de archivos eficiente – rsync utiliza un algoritmo de transferencia delta, lo que significa que solo transfiere las diferencias entre los archivos de origen y destino, lo que reduce significativamente la cantidad de datos transferidos, haciéndolo eficiente para sincronizar archivos o directorios grandes.
  • Sincronización remota de archivos – rsync soporta transferencias de archivos locales y remotas a través de SSH, lo que permite la sincronización entre sistemas locales y remotos o el espejeo de directorios en múltiples máquinas.
  • Backup incremental – rsync es adecuado para backups incrementales, ya que crea y actualiza backups eficientemente transfiriendo solo archivos nuevos o modificados.
  • Preserva los permisos de archivo – rsync puede preservar varios atributos de archivo, como permisos, propiedad, marcas de tiempo y enlaces simbólicos, lo que asegura que los archivos copiados conserven sus características originales en el destino.
  • Control de ancho de banda – rsync te permite limitar el uso del ancho de banda durante las transferencias de archivos, ya que utiliza métodos de compresión y descompresión al enviar y recibir datos en ambos extremos.
  • Más rápido – rsync puede ser más rápido que scp (Copia Segura) para transferir archivos, especialmente al sincronizar directorios grandes o al tratar con archivos que ya han sido transferidos parcialmente o existen en el destino.

Sintaxis del comando Rsync

El comando rsync sigue la siguiente sintaxis:

# rsync [OPTIONS] SOURCE DESTINATION

Aquí tienes una explicación de los diferentes componentes y opciones utilizados con los comandos de rsync:

  • -v – Salida detallada, mostrando información detallada sobre la transferencia.
  • -r – copia datos recursivamente (pero no preserva marcas de tiempo ni permisos durante la transferencia de datos).
  • -a – modo de archivo, que permite copiar archivos de forma recursiva y también preserva enlaces simbólicos, permisos de archivo, propiedades de usuario y grupo, y marcas de tiempo.
  • -z – Comprimir archivos durante la transferencia para reducir el uso de red.
  • -h – legible por humanos, muestra números en un formato legible por humanos.
  • -P – Mostrar progreso durante la transferencia.
  • SOURCE – Especifica el archivo o directorio de origen que se transferirá, que puede ser una ubicación local o remota.
  • DESTINATION – Especifica la ruta de destino donde se copiarán los archivos o directorios. Similar al origen, puede ser una ruta local o una ubicación remota.

Instalar Rsync en el sistema Linux

Podemos instalar el paquete rsync con la ayuda del siguiente gestor de paquetes según la distribución de Linux que tengas.

$ sudo apt install rsync         [On Debian, Ubuntu and Mint]
$ sudo yum install rsync         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
$ sudo emerge -a sys-apps/rsync  [On Gentoo Linux]
$ sudo apk add rsync            [On Alpine Linux]
$ sudo pacman -S rsync           [On Arch Linux]
$ sudo zypper install rsync      [On OpenSUSE]    

1. Copiar/Sincronizar Archivo Localmente

Para copiar o sincronizar un archivo localmente, puedes usar el siguiente comando que sincronizará un solo archivo en una máquina local desde una ubicación a otra.

Aquí en este ejemplo, un archivo llamado backup.tar necesita ser copiado o sincronizado en la carpeta /tmp/backups/.

[root@tecmint]# rsync -zvh backup.tar.gz /tmp/backups/

created directory /tmp/backups
backup.tar.gz

sent 224.54K bytes  received 70 bytes  449.21K bytes/sec
total size is 224.40K  speedup is 1.00

En el ejemplo anterior, puedes ver que si el destino no existe, rsync creará un directorio automáticamente para el destino.

Rsync Local Files

2. Copiar/Sincronizar Directorio Localmente

El siguiente comando transferirá o sincronizará todos los archivos de un directorio a otro directorio en la misma máquina.

Aquí en este ejemplo, /root/rpmpkgs contiene algunos archivos de paquetes rpm y desea que ese directorio se copie dentro de la carpeta /tmp/backups/.

[root@tecmint]# rsync -avzh /root/rpmpkgs /tmp/backups/

sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 3.47M bytes  received 96 bytes  2.32M bytes/sec
total size is 3.74M  speedup is 1.08
Rsync Local Directory

3. Copiar un Directorio de Local a Servidor Remoto

Para copiar un directorio de un servidor local a un servidor remoto, puede usar el siguiente comando, que sincronizará un directorio de una máquina local a una remota.

Por ejemplo, si hay una carpeta en su computadora local ” rpmpkgs ” que contiene algunos paquetes RPM y si desea enviar el contenido de ese directorio local a un servidor remoto, puede usar el siguiente comando.

# rsync -avzh /root/rpmpkgs [email protected]:/root/

The authenticity of host '192.168.0.141 (192.168.0.141)' can't be established.
ED25519 key fingerprint is SHA256:bH2tiWQn4S5o6qmZhmtXcBROV5TU5H4t2C42QDEMx1c.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.141' (ED25519) to the list of known hosts.
[email protected]'s password: 
sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 3.74M bytes  received 96 bytes  439.88K bytes/sec
total size is 3.74M  speedup is 1.00
Rsync Directory Remote System

4. Copiar un Directorio de Servidor Remoto a Local

Este comando le ayudará a sincronizar un directorio remoto a un directorio local. Aquí en este ejemplo, un directorio /root/rpmpkgs que está en un servidor remoto está siendo copiado en su computadora local en /tmp/myrpms.

# rsync -avzh [email protected]:/root/rpmpkgs /tmp/myrpms

[email protected]'s password: 
receiving incremental file list
created directory /tmp/myrpms
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm

sent 104 bytes  received 3.49M bytes  997.68K bytes/sec
total size is 3.74M  speedup is 1.07
Rsync Remote Directory to Local

5. Rsync Sobre SSH

Con rsync, podemos usar SSH (Secure Shell) para la transferencia de datos, utilizando el protocolo SSH mientras transferimos nuestros datos, puede estar seguro de que sus datos se están transfiriendo en una conexión segura con cifrado para que nadie pueda leer sus datos mientras se transfieren por el cable en Internet.

También, cuando usamos rsync, necesitamos proporcionar el usuario/contraseña de root para completar esa tarea en particular, por lo que usar la opción SSH enviará sus inicios de sesión de manera cifrada para que su contraseña esté segura.

Para usar rsync sobre SSH, puede usar la opción -e para especificar el comando de shell remoto, que normalmente es ssh como se muestra.

# rsync [OPTIONS] -e ssh /path/to/source user@remote:/path/to/destination

6. Copiar un archivo de un servidor remoto a un servidor local con SSH

Para sincronizar un archivo desde un servidor remoto a un servidor local, puede especificar un protocolo con rsync utilizando la opción “-e” con el nombre del protocolo que desea utilizar.

Aquí, en este ejemplo, utilizaremos “ssh” con la opción “-e” y realizaremos la transferencia de datos.

# rsync -avzhe ssh [email protected]:/root/anaconda-ks.cfg /tmp

[email protected]'s password: 
receiving incremental file list
anaconda-ks.cfg

sent 43 bytes  received 1.10K bytes  325.43 bytes/sec
total size is 1.90K  speedup is 1.67
Rsync Copy Remote File to Local

7. Copiar un archivo de un servidor local a un servidor remoto con SSH

Para sincronizar un archivo desde un servidor local a un servidor remoto utilizando SSH, puedes aprovechar el siguiente comando como se muestra.

# rsync -avzhe ssh backup.tar.gz [email protected]:/backups/

[email protected]'s password: 
sending incremental file list
created directory /backups
backup.tar.gz

sent 224.59K bytes  received 66 bytes  64.19K bytes/sec
total size is 224.40K  speedup is 1.00
Rsync Copy Local File to Remote

8. Mostrar progreso mientras se transfieren datos con Rsync

Para mostrar el progreso mientras se transfieren los datos de una máquina a otra, podemos usar la opción ‘--progress', que muestra los archivos y el tiempo restante para completar la transferencia.

# rsync -avzhe ssh --progress /root/rpmpkgs [email protected]:/root/rpmpkgs

[email protected]'s password: 
sending incremental file list
rpmpkgs/
rpmpkgs/httpd-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
          1.47M 100%   31.80MB/s    0:00:00 (xfr#1, to-chk=3/5)
rpmpkgs/mod_ssl-2.4.37-40.module_el8.5.0+852+0aafc63b.x86_64.rpm
        138.01K 100%    2.69MB/s    0:00:00 (xfr#2, to-chk=2/5)
rpmpkgs/nagios-4.4.6-4.el8.x86_64.rpm
          2.01M 100%   18.45MB/s    0:00:00 (xfr#3, to-chk=1/5)
rpmpkgs/nagios-plugins-2.3.3-5.el8.x86_64.rpm
        120.48K 100%    1.04MB/s    0:00:00 (xfr#4, to-chk=0/5)

sent 3.74M bytes  received 96 bytes  1.50M bytes/sec
total size is 3.74M  speedup is 1.00
Rsync Progress While Copying Files

9. Incluir archivos con una extensión particular con Rsync

Para incluir archivos específicos o patrones durante una operación de rsync, puedes usar la opción --include con una extensión que coincida con todos los archivos.

# rsync -avz --include='*.txt' /path/to/source/ user@remote:/path/to/destination/

En el ejemplo proporcionado, rsync incluirá solo archivos con la extensión .txt desde el directorio /ruta/a/origen/ durante la transferencia.

10. Excluir archivos con una extensión particular con Rsync

De manera similar, para excluir una extensión específica durante una operación de rsync, puedes usar la opción --exclude con un patrón de comodín.

# rsync -avz --exclude='*.ext' /path/to/source/ user@remote:/path/to/destination/

En el ejemplo proporcionado, rsync excluirá los archivos con la extensión especificada (*.ext) durante la transferencia, mientras incluye todos los demás archivos y directorios.

11. Incluir y Excluir Archivos con Rsync

Para incluir y excluir archivos o patrones específicos durante una operación de rsync, puedes utilizar tanto las opciones –include como –exclude con patrones de comodines adecuados.

Estas dos opciones nos permiten incluir y excluir archivos al especificar parámetros; estas opciones nos ayudan a especificar aquellos archivos o directorios que deseas incluir en tu sincronización y excluir archivos y carpetas que no deseas transferir.

Aquí, en este ejemplo, el comando rsync incluirá solo aquellos archivos y directorios que comiencen con ‘R’ y excluirá todos los demás archivos y directorios.

# rsync -avze ssh --include 'R*' --exclude '*' [email protected]:/var/lib/rpm/ /root/rpm
Rsync Include and Exclude Files

12. Uso de la opción –delete con Rsync

Si un archivo o directorio no existe en la fuente, pero ya existe en el destino, es posible que desees eliminar ese archivo/directorio existente en el destino mientras sincronizas.

Podemos usar la opción ‘–delete’ para eliminar archivos que no están en el directorio de origen.

La fuente y el destino están sincronizados. Ahora crea un nuevo archivo test.txt en el destino.

[root@tecmint:~]# cd /root/rpm/
[root@tecmint:~/rpm]# touch test.txt
[root@tecmint:~/rpm]# rsync -avz --delete [email protected]:/var/lib/rpm/ /root/rpm/

[email protected]'s password: 
receiving incremental file list
deleting test.txt
./
.dbenv.lock
.rpm.lock
Basenames
Conflictname
Dirnames
Enhancename
Filetriggername
Group
Installtid
Name
Obsoletename
Packages
Providename
Sha1header
Sigmd5
Suggestname
Supplementname
Transfiletriggername
Triggername
__db.001
__db.002
__db.003

sent 445 bytes  received 18,543,954 bytes  2,472,586.53 bytes/sec
total size is 71,151,616  speedup is 3.84

El destino tiene el nuevo archivo llamado test.txt cuando se sincroniza con la fuente con la opción ‘--delete‘, elimina el archivo test.txt.

Rsync Delete Option

13. Establecer límite de transferencia de archivos con Rsync

Puede especificar el tamaño máximo del archivo a transferir o sincronizar. Puede hacerlo con la opción “--max-size”. Aquí en este ejemplo, el tamaño máximo del archivo es 200k, por lo que este comando transferirá solo aquellos archivos que sean iguales o más pequeños que 200k.

# rsync -avzhe ssh --max-size='200k' /var/lib/rpm/ [email protected]:/root/tmprpm

[email protected]'s password: 
sending incremental file list
created directory /root/tmprpm
./
.dbenv.lock
.rpm.lock
Conflictname
Enhancename
Filetriggername
Group
Installtid
Name
Obsoletename
Recommendname
Requirename
Sha1header
Sigmd5
Suggestname
Supplementname
Transfiletriggername
Triggername
__db.002

sent 129.52K bytes  received 396 bytes  28.87K bytes/sec
total size is 71.15M  speedup is 547.66
Rsync Set Max File Transfer Size

14. Eliminar automáticamente los archivos de origen después de la transferencia

Ahora, suponga que tiene el servidor web principal y un servidor de copia de seguridad de datos, creó una copia de seguridad diaria y la sincronizó con su servidor de copia de seguridad, pero ahora no desea mantener esa copia local de la copia de seguridad en su servidor web.

Entonces, ¿esperará a que la transferencia se complete y luego eliminará ese archivo de copia de seguridad local manualmente? Por supuesto NO. Esta eliminación automática se puede hacer usando la opción ‘--remove-source-files‘.

# rsync --remove-source-files -zvh backup.tar.gz [email protected]:/tmp/backups/

[email protected]'s password: 
backup.tar.gz

sent 795 bytes  received 2.33K bytes  894.29 bytes/sec
total size is 267.30K  speedup is 85.40

[root@tecmint:~]# ls -l backup.tar.gz

ls: cannot access 'backup.tar.gz': No such file or directory
Rsync Delete Source File After Transfer

15. Realizar una simulación de ejecución con Rsync

Si eres un principiante usando rsync y no sabes exactamente lo que va a hacer tu comando. Rsync realmente podría estropear las cosas en tu carpeta de destino y luego deshacerlo puede ser un trabajo tedioso.

El uso de esta opción no realizará ningún cambio en los archivos y mostrará la salida del comando. Si la salida muestra exactamente lo que deseas hacer, entonces puedes eliminar la opción ‘–dry-run’ de tu comando y ejecutarlo en la terminal.

# rsync --dry-run --remove-source-files -zvh backup.tar.gz [email protected]:/tmp/backups/

[email protected]'s password: 
backup.tar.gz

sent 50 bytes  received 19 bytes  19.71 bytes/sec
total size is 267.30K  speedup is 3,873.97 (DRY RUN)
Rsync Dry Run

16. Establecer límite de ancho de banda y transferir archivos con Rsync

Puedes establecer el límite de ancho de banda mientras transfieres datos de una máquina a otra con la ayuda de la opción ‘–bwlimit’. Esta opción nos ayuda a limitar el ancho de banda de E/S.

# rsync --bwlimit=100 -avzhe ssh  /var/lib/rpm/  [email protected]:/root/tmprpm/
[email protected]'s password:
sending incremental file list
sent 324 bytes  received 12 bytes  61.09 bytes/sec
total size is 38.08M  speedup is 113347.05

Además, por defecto rsync sincroniza bloques y bytes cambiados únicamente, si deseas sincronizar todo el archivo explícitamente, entonces usa la opción ‘-W’ con él.

# rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar
sent 14.71M bytes  received 31 bytes  3.27M bytes/sec
total size is 16.18M  speedup is 1.10
Conclusión

Eso concluye nuestra visión general de rsync y sus capacidades. Para explorar más a fondo sus extensas opciones y funcionalidades, te animo a que consultes las completas páginas de manual (man pages) disponibles.

Source:
https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/