# Rsync

In informatica rsync è un software per Unix che sincronizza file e cartelle da una posizione all'altra minimizzando il trasferimento di dati utilizzando quando possibile la codifica delta.
Un'importante caratteristica di rsync che non trova riscontri in programmi/protocolli simili è che il mirroring avviene attraverso una sola trasmissione di dati per ogni direzione di comunicazione.
rsync può copiare o visualizzare il contenuto delle directory e copiare i file, utilizzando opzionalmente la compressione dei dati e la ricorsione. Per default, rsync effettua la copia attraverso una connessione TCP sulla porta 873.

## Descrizione
### Algoritmo

L'algoritmo usato da rsync per la trasmissione efficiente di dati (tipicamente, i contenuti di un file) a un altro computer che dispone di una versione precedente degli stessi dati è stato inventato dal programmatore australiano Andrew Tridgell, ed è descritto brevemente nel seguito.
Il ricevente spezza la sua copia del file in blocchi contigui di dimensione fissata $S$, e per ciascuno dei blocchi calcola due checksum: la funzione di hash MD5 e l'adler-32 (un checksum ciclico). Entrambi i valori vengono inviati al mittente.
Il mittente calcola invece il checksum per tutti i possibili blocchi di lunghezza $S$ della sua versione del file, anche sovrapposti. Il calcolo può essere svolto efficientemente grazie a una proprietà del checksum ciclico: sia $c(n)$ il checksum ciclico del blocco che va dal byte $n$ al byte $n+S-1$, allora $c(n+1)$ dipende solo da $c(n)$ e dal valore dei byte alle posizioni $n$ e $n+S$, senza che sia necessario riesaminare i byte da $n+1$ a $n+S-1$. Per $S$ grandi, il risparmio è notevole.
A questo punto il mittente compara i suoi checksum ciclici con quelli inviati dal ricevente, per verificare se ci sono delle corrispondenze. Se ci sono, viene calcolato e controllato anche il corrispondente hash MD5 (più costoso) per verificare se i blocchi sono effettivamente identici. A questo punto, il mittente invia al ricevente solo le parti del file per cui non sono stati trovati blocchi corrispondenti, insieme a istruzioni su come ricomporre i blocchi già presenti e le parti nuove in modo da ottenere una copia esatta del file originale. Se le due versioni del file hanno molte sezioni in comune, com'è spesso il caso quando si tratta di versioni diverse dello stesso file, rsync può effettuare la sincronizzazione trasmettendo molti meno dati rispetto alla dimensione dell'intero file.
Operando su un archivio compresso, modifiche in un file in esso contenuto possono equivalere a molti e diffusi cambiamenti nell'archivio compresso che lo contiene, rendendo necessaria la trasmissione di più dati del necessario. Per ovviare a questo problema, alcuni programmi di compressione offrono un'opzione (--rsyncable nel caso di gzip) che conserva la località delle variazioni anche nel'archivio compresso, migliorando l'efficienza di rsync su tali archivi.

### Altre caratteristiche

L'algoritmo descritto sopra costituisce la base del funzionamento di rsync, ma l'applicazione fornisce varie altre funzioni utili per ottimizzare il trasferimento e semplificare la creazione di copie di backup. Fra le altre possiamo citare l'uso di algoritmi di compressione per ridurre ulteriormente la dimensione dei dati trasferiti e il supporto al protocollo ssh per realizzare trasferimenti crittografati, quindi sicuri. In combinazione con utility UNIX standard quali cron, rsync può essere usato per implementare facilmente backup centralizzati dei dati degli utenti su un server centrale, oppure un sistema di mirroring di grandi quantità di dati.

## Varianti
### rdiff e rdiff-backup

Esiste un programma di utilità chiamato rdiff che usa l'algoritmo di rsync per generare un file delta contenente la differenza fra due file A e B, nel formato usato da rsync. Il file delta può poi essere applicato in un secondo tempo al file A, trasformandolo nel file B. L'operazione svolta è analoga a quella dei comandi UNIX diff e patch, ma utilizzando un formato più efficiente per memorizzare le differenze.
A differenza di diff, la creazione del file delta richiede due fasi: dapprima viene generato un piccolo file firma da A, quindi il file firma e B vengono usati per generare il file delta. Inoltre, rdiff funziona egregiamente con file binari, per cui invece non è possibile usare diff.
Appoggiandosi a rdiff, un altro programma di utilità chiamato rdiff-backup mantiene un backup di un file o directory su un server remoto, memorizzando i file delta per ogni versione dei dati archiviati. Usando i delta memorizzati, si può poi ricostruire lo stato esatto dei dati in un qualunque momento fissato.

### rsyncX e rsyncXCD

Una versione speciale di rsync per il file system del macOS, rsyncX, trasferisce anche le cosiddette resource fork (dati addizionali contenuti nei file del Mac), che non sono supportate da rsync (né da altri programmi UNIX). Con Mac OS 10.4, la Apple ha inserito delle modifiche nella propria versione di rsync per fornire funzionalità analoghe.
rsyncXCD è una versione di rsyncX che consente di creare partizioni di boot.

### Interfaccia grafica

rsync non possiede una propria interfaccia grafica, ma solo quella testuale. Esiste tuttavia il programma Grsync, distribuito sotto licenza GPL, che implementa una interfaccia grafica per rsync. Degno di nota è inoltre il progetto FlyBack che si prefigge il compito di portare il programma di backup Time Machine di Apple Mac OS X 10.5 Leopard in ambiente GNU/Linux proprio utilizzando rsync come applicazione di copia dati e gli hard link in un singolo file system.

### Windows

Come per altre utilità UNIX, per eseguire rsync su Microsoft Windows è necessario avere installato il pacchetto Cygwin, che fornisce ai programmi una emulazione di ambiente UNIX su Windows. Sono disponibili alcuni pacchetti che includono rsync, cygwin e un programma di installazione, rendendo rsync accessibile agli utenti Windows. Fra gli altri:
* cwRsync (Licenza MIT)
* NasBackup (GNU General Public License), che fornisce anche un'interfaccia grafica
* DeltaCopy (GNU General Public License), che include un'interfaccia grafica e dei servizi di programmazione.
* Unison file Synchronzer (GNU General Public License), che fornisce anche un'interfaccia grafica
Tuttavia, va notato che si possono verificare dei piccoli problemi usando rsync fra macchine con diversi sistemi operativi, in particolare per quanto riguarda le date di modifica dei file, l'accuratezza con cui vengono trasmesse alcune informazioni ausiliarie sui file (proprietario, diritti, ecc.) e le possibili ambiguità fra nomi di file in maiuscolo e minuscolo su Windows.