Menu Chiudi

Comando rsync. Copia, sincronizza e backup in Linux/Unix

rsync copy, sync e backup

Come utilizzare rsync in modo efficiente per trasferire e sincronizzare file e cartelle, sia su host locale che su host remoti dalla linea di comando.

In questo tutorial affronteremo alcuni degli utilizzi più efficienti del comando rsync per semplificare il trasferimento di file e cartelle in remoto e localmente in macchine basate su Linux.

Non è richiesto un particolare skill per l’utilizzo di rsync da parte dell’utente medio, né è necessario acquisire i privilegi dello user root per eseguire il comando rsync ed eseguire qualsiasi tipo di copia sincronizzazione.

Che cosa è rsync

Di rsync abbiamo già parlato, in questa rubrica quando abbiamo affrontato il tema della installazione e configurazione di un Server rsync. Quindi non ci dilungheremo troppo sullo specifico argomento.

Riassumendo, possiamo però ricordare che:

Rsync è un software per Unix potente e versatile, utilizzato per trasferire e sincronizzare file tra dispositivi locali e remoti. A differenza dei tradizionali comandi di copia, rsync utilizza un algoritmo di trasferimento delta per trasmettere solo le differenze tra i file di origine e di destinazione. Questo approccio riduce drasticamente l’utilizzo della larghezza di banda e velocizza i trasferimenti.

Originariamente nato per semplificare le operazioni di backup di macchine Unix, con il tempo ha acquisito una enorme notorietà, soprattutto in ambiente GNU Linux proprio per lo spostamento efficiente di file e cartelle, contenenti anche milioni di files.

Vantaggi di rsync

Alcuni dei vantaggi e delle caratteristiche di rsync possono essere sintetizzate nei seguenti punti.

  1. File Transfer Efficiente. Copia e sincronizza in modo efficiente i file utilizzando la codifica delta che permette ad rsync di trasferire solo le differenze tra il file di origine ed il file di destinazione.
  2. Sincronizzazione di file remoti. Supporta trasferimenti da e verso sistemi remoti di file, cartelle, collegamenti, dispositivi, proprietari, gruppi ed autorizzazioni.
  3. Sicuro. La sincronizzazione può avvenire su un canale SSH criptato. Permette cioè il trasferimento anche di informazioni sensibili, grazie al supporto del canale criptato end-to-end di sssh
  4. Completo. Permette il mirroring di intere directory attraverso macchine multiple.
  5. Affidabile. Rsync preserva i permessi dei file e delle cartelle, oltre ai vari attributi dei file (solo su sistemi Unix/Linux). Soprattutto mantiene inalterati i link simbolici e gli hard link così da garantire le originali caratteristiche degli oggetti trasferiti sulla destinazione.
  6. Consuma meno banda. Nel caso di grandi trasferimenti attraverso reti geografiche non particolarmente efficienti è in grado di consumare meno banda per via dell’utilizzo di una efficiente compressione.
  7. Backup Full ed incrementali. Rsync è predisposto per i backup di tipo ‘incrementale’ in quanto può aggiornare i backup precedenti trasferendo esclusivamente i file che nel frattempo sono stati modificati.

Come installare rsync Client

Questa installazione di rsync la eseguiremo senza attivare il demone (rsync daemon). In questo modo la potremo utilizzare anche senza che vi sia la presenza di un vero e proprio server nella rete, con la sua porta 873/tcp aperta ed in attesa di connessioni dai client. Niente di tutto questo.

Sfrutteremo la capacità di rsync di utilizzare anche nativamente SSH per connettersi ad un qualsiasi host. Posto, ovviamente, che tutti gli host che andremo a coinvolgere nelle copie e nelle sincronizzazioni che faremo abbiano il servizio ssh/22 acceso ed eventuali firewall che si trovino nel mezzo, lascino passare le connessioni SSH.

Per installare rsync Client ed averlo subito disponibile in tutti gli host, non bisogna far altro che eseguire il comando di installazione del pacchetto rsync, utilizzando la sintassi appropriata per la distribuzione Linux in uso.

$ sudo apt-get install rsync # In Debian/Ubuntu & Mint
$ sudo pacman -S rsync       # In Arch Linux
$ sudo emerge sys-apps/rsync # In Gentoo
$ sudo dnf install rsync     # In Fedora/CentOS/RHEL e Rocky Linux/AlmaLinux
$ sudo zypper install rsync  # In openSUSE

Ma anche con FreeBSD (Hey, non esiste mica solo Linux!)

# pkg install rsync

Se tutto è andato come previsto e non ci sono stati errori durante l’installazione, possiamo già utilizzare rsync senza che sia necessario applicare alcuna configurazione. Quindi, direi che possiamo decisamente proseguire.

L’ambiente di test

Per completezza di informazione, e per garantire la riproducibilità dei test, prima di tuffarci nei comandi specifici da utilizzare è opportuno chiarire bene l’ambiente di test che abbiamo preparato per produrre gli esempi illustrati.

Leggi anche:   Come Sincronizzare l'orario di un Server CentOS 7 con ntp
Demo test per Rsync

Gli host rsync di test

Il processo di installazione del pacchetto rsync è stato effettivamente effettuato su ben 3 distinti host di laboratorio, tutti raggiungibili in rete.

  1. Host-1: Un sistema Debian GNU Linux 12 (bookworm). Indirizzo IP: 192.168.29.23/24; hostname: deblue; User: bluesync;
  2. Host-2: Un sistema Rocky Linux 9.4 (Blue Onyx). Indirizzo IP 192.168.29.31/24; hostname: rockystar User trystar;
  3. Host-3: Un sistema FreeBSD 14.1-RELEASE. Indirizzo IP 192.168.134.32/24; hostname: fbsdone User: ubsd1;

Notare che gli host coinvolti sono sistemi UNIX-Like di diversa natura. Questo, in modo da poter verificare e dimostrare la compatibilità tra sistemi *NIX nelle copie e nelle sincronizzazioni di file e cartelle tra sistemi della stessa famiglia ma di diversa tipologia.

Nella cartella home dello user deblue dell’host Host-1 sono stati preventivamente preparati alcuni file di dimensioni diverse utilizzando lo script riportato qui di seguito.

I File da copiare/sincronizzare con rsync

Invece di preparare manualmente i file di test da sincronizzare con rsync, ho preferito utilizzare uno script che faccia questo per me. In questo modo, tutti i test saranno perfettamente riproducibili a partire da file che avranno sempre le medesime caratteristiche.

Di seguito lo script utilizzato per la creazione dei files utilizzati nei test.

#!/bin/sh
[ -e ~/TestRsync ] || mkdir ~/TestRsync
cd ~/TestRsync
rm -f testfile-*.txt
echo 'the quick brown fox jumps over the lazy dog 0123456789876543210' > testfile-64.txt
for n in `seq 1 16`; do cat testfile-64.txt >> testfile-1024.txt; done
for n in `seq 1 32`; do cat testfile-64.txt >> testfile-2048.txt; done
for n in `seq 1 64`; do cat testfile-64.txt >> testfile-4096.txt; done
dd if=/dev/random bs=1G count=1 of=testfile-1G.txt
wc -c testfile-*txt
# end-of-file

Che produce i file mostrati dall’output del comando ls -l ~/TestRsync.

bluesync@deblue:~$ ls -lrS ~/TestRsync
total 1048596
-rw-r--r-- 1 bluesync bluesync 64 Aug 28 16:20 testfile-64.txt
-rw-r--r-- 1 bluesync bluesync 1024 Aug 28 16:20 testfile-1024.txt
-rw-r--r-- 1 bluesync bluesync 2048 Aug 28 16:20 testfile-2048.txt
-rw-r--r-- 1 bluesync bluesync 4096 Aug 28 16:20 testfile-4096.txt
-rw-r--r-- 1 bluesync bluesync 1073741824 Aug 28 16:20 testfile-1G.txt

La sintassi generale del comando rsync

Anche in questo caso (come per altro per moltissimi altri) il faro che illumina la via e sul quale fare sempre affidamento sono le man pages (le pagine di manuale), alle quali si può sempre attingere con il comando man:

$ man rsync

La sintassi generale del comando rsync ricalca per grandi linee la sintassi di un qualsiasi comando di copia di file e cartelle: tipicamente: comando [opzioni] sorgente destinazione. Come il template di comando rsync che segue:

rsync [options] source destination

Tuttavia; il comando rsync può assumere diverse sintassi, in funzione di “come” si intende copiare:

  • Copia locale
  • Copia tramite shell remota (remote shell)
  • Copia tramite il demone rsync remoto (remote daemon)

Comando rsync per la copia locale

Nel caso di copia locale la sintassi è molto semplice:

rsync [OPTION...] SRC... [DEST]

Di fatto assomiglia moltissimo al classico comando di copia (cp) di Unix/Linux

Notare inoltre che, così come molti altri comandi di copia in ambiente *NIX, si possono esprimere più sorgenti (file e cartelle) ed un’unica destinazione (cosa che per altro si evince dalle man pages).

Comando rsync per la copia tramite shell remota (remote shell)

Nel caso di copia da e verso host remoti, non essendo presente alcuna istanza di alcun demone rsync (rsync server), il software rsync userà di default un canale SSH con l’host remoto, che sia quest’ultimo sorgente o destinazione.

Prendendo ad esempio il template mostrato nelle man-pages:

rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync [OPTION...] SRC... [USER@]HOST:DEST

Anche se superfluo, vale sempre la pena di chiarire con esattezza il significato delle righe riportate qui sopra.

La prima riga è il template di sintassi per una copia/sincronizzazione da un host remoto al host locale. La seconda riga, al contrario, è il template di sintassi per una copia ad un host locale al host remoto.

Pur rispondendo comunque alla sintassi generale “rsync [opzioni] sorgente destinazione” voglio dirigere la vostra attenzione alla parte della sintassi dove si specifica l’host remoto. La notazione usata è del tipo [USER@]HOST:. Non trovate qualcosa di familiare con la notazione ssh?

Infatti, è proprio così. in questo tipo di copia viene utilizzato proprio un canale ssh per la connessione all’host remoto.

Nota Importante. Questa tipologia di copia con rsync è quella ormai universalmente adottata dalla maggioranza dei Sysadmin per i suoi indubbi vantaggi. Oltre a sfruttare tutta la potenza di rsync, utilizza la crittografia di ssh per il trasporto dei dati, che rende il trasferimento intrinsecamente sicuro.

Comando di copia tramite il demone rsync (rsync server)

Nel caso di copia da e verso host remoti nei quali è in esecuzione il servizio rsync (rsync server), in ascolto sulla porta 873/tcp, la sintassi da utilizzare cambia leggermente.

Leggi anche:   Backup e ripristino di MySQL o MariaDB

Prendendo ad esempio il template mostrato nelle man-pages:

Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

Anche qui è evidenziala la differenza tra “copia-da” (Pull) a copia-verso” (Push)., La parte “Pull” è riferito ai template di sintassi per una copia/sincronizzazione da un host remoto al host locale. La parte “Push” è riferito ai template di sintassi per una copia/sincronizzazione da un host locale ad un host remoto.

Nota Importante. Questa tipologia di copia con rsync è quella sta andando in disuso a vantaggio di copie con rsync tramite shell remota (vedi sopra). Il punto cruciale è che le copie rsync tramite il demone rsync, oltre ad avere una sintassi più complessa e macchinosa, non utilizzano nessun meccanismo di default di cifratura dei dati. Pur potendo utilizzare l’opzione --rsh (remote shell), la sintassi rimane comunque complessa ed esposta ad errori involontari.

Ne abbiamo anche parlato diffusamente in questa rubrica, in un post di qualche tempo fa su come installare e configurare un rsync server. Proprio per l’utilizzo di un rsync server classico, che utilizzi la porta 873/tcp da impiegarsi in un ambiente aziendale e protetto.

Le opzioni del comando rsync

Coloro che nel frattempo si sono avventurati nella lettura delle man page, saranno rimasti certamente sorpresi dalla enorme quantità di opzioni (“OPTIONS”) disponibili.

Sarebbe certamente oltremodo tedioso dare una descrizione di tutte le opzioni in questa sede; tuttavia, alcune di esse meritano un minimo di attenzione, perché possono essere di grande utilità in alcune circostanze:

  • -v Verbose output. Traducibile in “Prolisso”. Mostra molte informazioni dettagliate sul trasferimento in corso.
  • -r Copia i dati in modo ricorsivo (ma non conserva timestamp e autorizzazioni durante il trasferimento dei dati).
  • -l Links. Copia i link simbolici come link simbolici.
  • -H Preserva i Link Fisici (Hard-Links)
  • -p Preserva i permessi dei file di origine nella destinazione.
  • -t Preserva il gruppo data-ora dei file di origine nella destinazione.
  • -g Preserva il gruppo (gid) dei file di origine nella destinazione.
  • -o Preserva il proprietario (uid) dei file di origine nella destinazione.
  • -a Modalità archivio. Consente di copiare i file in modo ricorsivo e conserva anche collegamenti simbolici, autorizzazioni di file, proprietà di utenti e gruppi e timestamp. Include automaticamente le OPTIONS -rlptgoD.
  • -z Comprime i dati del file.
  • -h Numeri in output sono in formato “Human Readable” comprensivi delle unità di misura (K=Kilobytes, M=Megabytes, ecc.
  • -e Remote Shell. Specifica la shell remota da utilizzare. Utilizza nativamente ssh a meno di server remoto rsync in ascolto sulla porta 873/tcp.
  • --delete Rimuove dalla directory di destinazione i file non presenti nella directory di origine

Note sul comando rsync

Ci sono tuttavia alcune importanti limitazioni del comando rsync che vale la pena di sottolineare.

Sorgente e destinazione non possono riferirsi entrambi a host remoti. Questo significa che spostare file tra 2 host remoti (che tra loro non si “vedono” in rete) non è possibile farlo con un unico passaggio. Con grande svantaggio per l’utilizzo di banda e non solo.

Esempi di copia/sincronizzazione con rsync

1 – Copia file in cartelle nel computer locale

Il comando seguente copia un singolo file del computer locale, da una cartella ad un’altra.

In questo esempio, voglio copiare con rsync il file ~/TestRsync/testfile-1024.txt, dalla directory locale alla directory /tmp/backups.

bluesync@deblue:~$ rsync -vh ~/TestRsync/testfile-1024.txt /tmp/backups/
created directory /tmp/backups
testfile-1024.txt

sent 1.12K bytes received 70 bytes 2.39K bytes/sec
total size is 1.02K speedup is 0.86

Si noti che la cartella di destinazione /tmp/backups è stata creata automaticamente, in quanto inizialmente mancante, come per altro evidenziato nell’output del comando.

2 – Copia un’intera directory nel computer locale

L’esempio che segue mostra come posso copiare un’intera directory e tutti i file in essa contenuti in un’altra directory dello stesso computer locale.

In questo esempio voglio copiare l’intera directory ~/TestRsync contenente tutti i nostri file di test, all’interno della directory di destinazione /tmp/Backups/ del computer locale.

Eseguo la copia con il seguente comando:

$ rsync -avh ~/TestRsync /tmp/Backups

Di seguito l’output completo del comando qui sopra:

bluesync@deblue:~$ rsync -avh ~/TestRsync /tmp/Backups
sending incremental file list
created directory /tmp/Backups
TestRsync/
TestRsync/testfile-1024.txt
TestRsync/testfile-1G.txt
TestRsync/testfile-2048.txt
TestRsync/testfile-4096.txt
TestRsync/testfile-64.txt

sent 1.07G bytes  received 150 bytes  238.67M bytes/sec
total size is 1.07G  speedup is 1.00

Si noti che anche in questo caso che la cartella di destinazione /tmp/Backups (con l’iniziale maiuscola) è stata creata automaticamente, in quanto inizialmente mancante, come per altro evidenziato nell’output del comando.

Si noti anche le opzioni utilizzate (nel caso specifico: -avh)

3 – Copia una directory dal computer locale al server remoto

Per copiare una intera directory dal computer locale ad un server remoto utilizzeremo la sintassi della shell remota.

Leggi anche:   WireGuard Client: Tunnel criptati con Windows

Nell’esempio che segue si vuole copiare l’intero contenuto della directory ~/TestRsync del host locale deblue (Debian) nella cartella home dello user ubsd1 del host fbsdone (FreeBSD) con indirizzo IP 192.168.134.32.

bluesync@deblue:~$ rsync -avzh ~/TestRsync ubsd1@192.168.134.32:
(ubsd1@192.168.134.32) Password for ubsd1@fbsdone:
sending incremental file list
TestRsync/
TestRsync/testfile-1024.txt
TestRsync/testfile-1G.txt
TestRsync/testfile-2048.txt
TestRsync/testfile-4096.txt
TestRsync/testfile-64.txt

sent 1.07G bytes received 115 bytes 49.95M bytes/sec
total size is 1.07G speedup is 1.00
bluesync@deblue:~$

Notare che ci viene chiesta la password di autenticazione dello user sul host remoto, in perfetto stile ssh. Se si vuole evitare la richiesta di password è sempre possibile installare le chiavi ssh sul host remoto.

4 – Copia una directory dal server remoto al computer locale

Anche in questo caso, per copiare una intera directory dal computer locale ad un server remoto utilizzeremo la sintassi della shell remota.

Nell’esempio che segue si vuole copiare l’intero contenuto della directory ~/TestRsync dello user ubsd1 del host remoto fbsdone (FreeBSD) con indirizzo IP 192.168.134.32, nella cartella locale ~/NewCopy del host locale deblue (Debian) dello user bluesync.

$ rsync -avzh ubsd1@192.168.134.32:TestRsync ~/NewCopy

L’output completo del precedente comando è interamente riportato qui di seguito

bluesync@deblue:~$ rsync -avzh ubsd1@192.168.134.32:TestRsync ~/NewCopy
(ubsd1@192.168.134.32) Password for ubsd1@fbsdone:
receiving incremental file list
created directory /home/bluesync/NewCopy
TestRsync/
TestRsync/testfile-1024.txt
TestRsync/testfile-1G.txt
TestRsync/testfile-2048.txt
TestRsync/testfile-4096.txt
TestRsync/testfile-64.txt

sent 123 bytes received 1.07G bytes 37.68M bytes/sec
total size is 1.07G speedup is 1.00

Notare che la cartella di destinazione ~/NewCopy (/home/bluesync/NewCopy) è stata creata automaticamente da rsync  in quanto inizialmente mancante, come per altro evidenziato nel output del comando.

5 – Backup di una directory locale in un server remoto

L’obbiettivo di questo esempio consiste nel creare una copia di Backup di una directory locale in una directory specifica di un server remoto. Successivamente, potremo fare in modo che l’intera procedura sia schedulata automaticamente ogni giorno dal cron di sistema.

Ricordiamo che l’operazione di backup di una cartella non è una semplice copia, come descritto nei precedenti esempi. Una operazione di backup deve infatti rispettare i seguenti requisiti minimi:

  1. Copiare file e directory dal server locale al server remoto, preservando tutti gli attributi di tutti i file e cartelle;
  2. Preservare i symbolic-links (link simbolici ) e gli hard-links (link fisici);
  3. Rimuovere dal server di destinazione i file dei backup precedenti che non si trovano più nel server di origine.

Con le premesse appena citate, riportiamo qui di seguito una semplice funzione di backup.

In questo esempio, si vuole eseguire il backup dell’intera directory ~/TestRsync dello user bluesync computer locale deblue (Debian) all’interno della directory ~/MyBackupFolder dello user ubsd1 del host remoto fbsdone (FreeBSD) con indirizzo IP 192.168.134.32.

Ma prima di lanciare il comando, per rendere la cosa un po’ più interessante, aggiungiamo, all’interno della directory dell’host locale un link simbolico (Symbolic-Link) ed un link fisico (Hard-Link) con i seguenti comandi:

$ cd TestRsync/                                           # Move into dir TestRsync
$ ln -s ./testfile-2048.txt ./testfile-2048-symlink.txt   # Create a symbolic link
$ ln testfile-2048.txt testfile-2048-hardlink.txt         # Create a hard link

Ora possiamo lanciare il comando rsync completo:

$ rsync -avzhH -e ssh ./TestRsync ubsd1@192.168.134.32:MyBackupFolder

Questo è l’output completo del comando rsync precedente:

$ rsync -avzh -H --delete -e ssh ./TestRsync ubsd1@192.168.134.32:MyBackupFolder
(ubsd1@192.168.134.32) Password for ubsd1@freebsdone:
sending incremental file list
created directory MyBackupFolder
TestRsync/
TestRsync/testfile-1024.txt
TestRsync/testfile-1G.txt
TestRsync/testfile-2048-symlink.txt -> ./testfile-2048.txt
TestRsync/testfile-2048.txt
TestRsync/testfile-4096.txt
TestRsync/testfile-64.txt
TestRsync/testfile-2048-hardlink.txt => TestRsync/testfile-2048.txt

sent 1.07G bytes received 190 bytes 40.53M bytes/sec
total size is 1.07G speedup is 1.00
$

Notare l’uso delle opzioni -H e --delete per soddisfare i requisiti delle funzionalità minimali del Backup. Notare anche l’utilizzo dell’opzione -e ssh qui utilizzata per garantire il trasferimento dei dati in modo cifrato, sfruttando il protocollo ssh.

Anche in questo caso la cartella di destinazione viene creata, se non esistente, come già visto negli esempi precedenti.

L’aspetto interessante da osservare, riguarda i link fisici (Hard-Link) ed i link simbolici (Sym-Link) che sono evidenziati nell’output e che possono essere facilmente verificati nel’host di destinazione (comando: ls -li).

Conclusioni

In questo tutorial denso di informazioni, abbiamo esplorato non solo la sintassi del comando rsync, ma abbiamo anche rivisto l’installazione del pacchetto nelle varie distribuzioni Linux e FreeBSD.

Abbiamo successivamente trattato alcune delle OPTIONS più importanti ed utilizzate per esplorare le più comuni opzioni del comando rsync. Ci siamo infine addentrati negli esempi più comuni del comando rsync, per la copia di file ed intere directory da destinazioni locali e remote, mostrando gli output del terminale.

Abbiamo, in ultima analisi avuto modo di toccare con mano potenza di questo software che non smette mai di sorprendere per la flessibilità, l’efficienza, l’affidabilità e la facilità d’uso.

Se ritieni questo tutorial ti sia stato utile, lascia un tuo commento, oppure condividi questo post con chi vuoi; sarà la più preziosa ricompensa per il nostro lavoro.

Condividi

Disclaimer

Questa pagina potrebbe contenere link di affiliazione. Gli acquisti o gli ordini che effettuerai tramite tali link possono generare commissioni che ci aiutano a sostenere questo sito web.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Moderazione dei commenti attiva. Il tuo commento non apparirà immediatamente.