Rsync è un comando lanciato da shell per la sincronizzazione dei file e delle directory tra diversi sistemi. In pratica, rsync copia i dati da una posizione all’altra, ma fa questo in modo molto efficiente e sicuro, utilizzando un algoritmo che minimizza la quantità di dati da trasferire.
Per utilizzare rsync, è necessario prima installarlo sul proprio sistema. rsync è disponibile per la maggior parte dei sistemi Unix-like, come Linux, macOS e FreeBSD. Una volta installato, è possibile utilizzare il comando rsync da una shell.
Un caratteristica che rende perfetto per eseguire copie di backup in remoto è l’integrazione con il protocollo SSH (Secure SHell) che consente la creazione di una sessione remota cifrata sostituendo l’insicuro protocollo Telnet.
Installare rsync
Prima di procedere all’installazione di rsync, è consigliato aggiornare il nostro sistema operativo, digitando il seguente comando:
$ sudo apt update $ sudo apt dist-upgrade
Nota: Il dist-upgrade è un superset di upgrade. Oltre alla funzione di aggiornamento, può anche gestire in modo intelligente le modifiche nelle dipendenze del pacchetto. Ciò include la rimozione dei pacchetti di dipendenze che non sono più necessari o la risoluzione dei conflitti tra pacchetti sorti a causa di modifiche nelle dipendenze. Può anche installare nuovi pacchetti, se necessario.
Al termine dell’aggiornamento, procediamo con l’installazione di rsync utilizzando il comando:
$ sudo apt install rsync
Per installare rsync su Red Hat, CentOS e derivate si utilizzeranno i comandi:
$ yum update -y
$ yum install rsync -y
Sintassi e opzioni
Ecco un esempio di come utilizzare rsync per copiare una directory da una posizione all’altra:
$ rsync -avz /percorso/origine/ /percorso/destinazione/
In questo esempio, “-avz” sono opzioni che indicano ad rsync di copiare i file in modo verboso (verbose), conservando i permessi e le proprietà dei file (archive), comprimendo i dati durante il trasferimento (compress) e verificando i file già esistenti (checksum). “/percorso/origine/” è la directory da copiare, mentre “/percorso/destinazione/” è la destinazione dove la directory verrà copiata.
Altri esempi:
Copiare una directory locale in una directory remota su un server:
$ rsync -avz /percorso/dir_locale utente@indirizzo_server:/percorso/dir_remota
In questo esempio, “-avz” indica ad rsync di copiare in modo verboso, conservando i permessi e le proprietà dei file, e comprimendo i dati durante il trasferimento. “/percorso/directory_locale” è la directory locale che si desidera copiare, “utente” è il nome dell’utente con cui si accede al server, “indirizzo_server” è l’indirizzo IP o il nome DNS del server remoto, e “/percorso/directory_remota” è la directory remota in cui si desidera copiare la directory.
Sincronizzare due directory locali in modo bidirezionale:
$ rsync -avz --delete /percorso/directory1/ /percorso/directory2/
In questo esempio, l’opzione “–delete” indica ad rsync di eliminare i file nella directory di destinazione che non esistono nella directory di origine. Questo comando sincronizza i file e le directory in entrambe le direzioni, in modo che entrambe le directory siano identiche alla fine del processo.
Copiare solo i file modificati da una directory locale a una directory remota:
$ rsync -avz --update --progress /percorso/dir_locale/ utente@indirizzo_server:/percorso/dir_remota/
In questo esempio, l’opzione “–update” indica ad rsync di copiare solo i file modificati o nuovi. L’opzione “–progress” mostra la progressione del trasferimento. Questo comando è utile quando si desidera mantenere due directory sincronizzate, ma si desidera limitare il trasferimento solo ai file che sono stati modificati.
Ci sono molte altre opzioni disponibili con rsync, che consentono di personalizzare ulteriormente il comportamento del comando. Per maggiori informazioni, consulta il manuale di rsync digitando “man rsync” da una shell oppure lanciamo da prompt il comando con l’opzione -h:
$ rsync -h
Le opzioni le opzioni più utilizzate sono:
- -r copia ricorsiva (non include gli attributi dei file)
- -a crea un archivio dei file, compresi gli attributi dei file
- -v mostra a schermo il dettaglio delle operazioni
- -h rende i valori mostrati in output più facili da leggere per l’utente
- -P mostra lo stato di avanzamento della fase di copia e indica a rsync di mantenere i file trasferiti parzialmente (di default vengono invece cancellati)
- -q modalità silente
- -z attiva la compressione dei file
Come effettuare un backup in una cartella remota
Rsync consente la sincronizzazione di dati tra macchine diverse attraverso il protocollo SSH (Secure Shell). La sintassi del comando è la seguente:
$ rsync [opzioni] SORGENTE Utente_SSH@IP_Host:DESTINAZIONE
Su entrambe le macchine dovrà essere installato OpenSSH e rsync.
Andremo quindi a copiare la cartella “origine” su un host con indirizzo IP 192.168.2.10, utilizzando l’utenza maintenance. I file verranno archiviati nella directory ~/backup.
In questo caso, alle opzioni -av –delete viste nell’esempio precedente, aggiungeremo anche:
- -P per ottenere maggiori informazioni sulla copia;
- -h per rendere i valori mostrati facilmente fruibili dall’utente;
- -z per comprimere i file trasferiti e alleggerire così il carico di lavoro della rete.
N.B. Prima di avviare la procedura di backup, assicurarsi che lo spazio di archiviazione del dispositivo di destinazione sia abbastanza capiente da contenere i file trasferiti.
Il comando da lanciare sarà, quindi:
$ rsync -avPzh –delete origine maintenance@192.168.2.10:~/backup
I file saranno così copiati all’interno della sottocartella backup presente nella cartella home dell’host.
Andremo ora ad effettuare il procedimento inverso, prelevando i dati dal computer che usiamo da server. In questo caso inseriremo come sorgente la cartella dell’host remoto e come destinazione la directory home.
$ rsync -avPzh –delete maintenance@192.168.2.10:~/backup ~
N.B. Il simbolo ~ (Tilde) equivale a scrivere /home/NOME_UTENTE.
Ogni volta che tentiamo di avviare una procedura di backup da remoto, ci verrà richiesta la password dell’utente SSH utilizzato. Nonostante questa sia una corretta politica di sicurezza, non consente di creare una procedura di backup pianificata. Per eludere questa problematica sarà quindi necessario creare una chiave di autentificazione pubblica sul computer client e aggiungerla al file “authorized_keys” dell’host remoto.
Per generare la coppia di chiavi SSH lanciamo il comando:
$ ssh-keygen -t rsa -b 4096
Manteniamo le configurazioni di default (premendo il tasto “invio”) e non impostiamo alcuna password.
Le chiavi saranno archiviate nella directory nascosta ~/.ssh/.
Dovremo ora inviare la chiave pubblica appena creata (id_rsa.pub) all’host remoto. Utilizzeremo il comando ssh-copy-id, indicando l’utente ssh e l’indirizzo del server:
$ ssh-copy-id maintenance@192.168.2.10
Dopo aver inserito la password di accesso, la chiave pubblica sarà aggiunta al file authorized_keys dell’utente remoto.
Facciamo un test di collegamento, via SSH, al computer remoto: se la procedura è stata impostata correttamente, non verrà richiesta nessuna password.
La procedura di backup ora non necessiterà l’immissione di password.
Pianificare una procedura di backup con rsync
Per pianificare l’esecuzione delle nostre procedure utilizzeremo cron, creando nel crontab un job in cui indicheremo il comando da eseguire e la sua schedulazione.
Apriamo il file crontab lanciando il comando:
$ crontab -e
Al primo avvio di crontab verrà chiesto di indicare quale editor di testo utilizzare (in questo esempio, nano).
Se non si dispone di nano:
$ sudo apt update $ sudo apt install nano
Editiamo il file di configurazione scorrendolo fino alla fine, in modo da poter inserire la pianificazione della nostra procedura di backup e il comando.
Ogni riga del crontab conterrà una schedulazione.
Vediamo nel dettaglio tutti i possibili valori di questi campi, in ordine di inserimento
Campo | Valore |
Minuti | 0 – 59 |
Ore | 0 – 23 |
Giorno del mese | 1 – 31 |
Mese | 1 – 12 |
Giorno della settimana | 0 – 7* |
Comando | path dello script da eseguire |
* 0 rappresenta la domenica, 1 lunedì…. 7 sabato.
Potremo utilizzare gli operatori:
- , per indicare una lista di valori
- – per indicare un intervallo di valori
- * per indicare tutti i valori disponibili per il camp
- / per saltare dei valori.
Dopo aver indicato la schedulazione, potremo inserire il comando (o il file) da eseguire.
Essendo l’operazione è programmata, non ci sarà necessità di visualizzare informazioni sulla fase di copia. Utilizzeremo quindi l’opzione -q (modalità silente).
Se vogliamo lanciare il nostro comando di backup ogni lunedì alle ore 15, aggiungeremo il job:
* 15 * * 1 rsync -aqz –delete origine maintenance@192.168.2.10:~/backup
Usciamo dal file salvandolo. Un messaggio confermerà la corretta configurazione del nuovo job.
Vediamo alcuni esempi pratici di schedulazione con CronTab
*/30 * * * * /root/mybackup.sh
Lo script viene eseguito ogni 30 minuti
0 21 * * * /root/mybackup.sh
Lo script viene eseguito alle ore 21.00 tutti i giorni
0 8,22 * * * /root/mybackup.sh
Lo script viene eseguito alle ore 08.00 e alle ore 22.00 tutti i giorni
0 4 * * 0 /root/mybackup.sh
Lo script viene eseguito alle ore 04.00 della domenica
0 4 * 4 6 /root/mybackup.sh
Lo script viene eseguito alle ore 04.00 ogni sabato del mese di aprile
30 6 * 5 5 /root/mybackup.sh
Lo script viene eseguito alle ore 06.30, ogni benerdi di maggio
* * * * * /root/mybackup.sh
Lo script viene eseguito ogni minuto
*/10 * * * * /root/mybackup.sh
Lo script viene eseguito ogni 10 minuti
0 12 * * 1,5 /root/mybackup.sh
Lo script viene eseguito alle ore 12.00 di lunedì e venerdi
0 */4 * * * /root/mybackup.sh
Lo script viene eseguito ogni 4 ore (06.00, 10.00, ...)
* * * * * sleep 45; /root/mybackup.sh
Lo script viene eseguito ogni 45 secondi