IMPORTANTE - Questa pagina è scaduta 2779 giorni fa (il 10 Febbraio 2014). Puoi trovare una versione aggiornata dell'articolo Rsync, copie incrementali alla velocità della luce sul nuovo sito web Netdesign.

Sei comunque libero di consultare questa pagina, abbiamo deciso di lasciarla online per trasparenza e per rispetto nei confronti del nostro passato e del nostro lavoro. Questo sito web è stato pubblicato ad Ottobre 2011 ed è scaduto a Febbraio 2014.

ATTENZIONE! Le informazioni riportate in questa pagina non sono più valide o aggiornate e non rappresentano in alcun modo il sito web ufficiale di Netdesign a partire dal 10 Febbraio 2014.

NOTA: Questa pagina potrebbe contenere link rotti e quindi non più funzionanti.

Developers Network

Risorse ed articoli su Javascript, PHP, Python e CSS per Web designer e sviluppatori Web. Consigli utili per un corretto sviluppo di pagine ed applicazioni web.

Rsync, copie incrementali alla velocità della luce

rsync è un potentissimo software a riga di comando per la sincronizzazione di file e cartelle in ambiente Unix, rispolveriamone le potenzialità.

Articolo pubblicato il 28/10/2012

rsync fa parte del coltellino svizzero di ogni amministratore di sistema, permette di sincronizzare file e cartelle in modo efficiente sfruttando un algoritmo di una leggerezza ed efficienza praticamente uniche al mondo. Rsync è ormai incluso in tutte (o quasi) le distribuzioni GNU/Linux ed è entrato di fatto tra gli strumenti standard degli ambienti UNIX (e non solo). Esistono versioni di rsync per quasi tutti i sistemi operativi conosciuti dall'uomo, e la sua portabilità ne ha sicuramente incrementato la diffusione.

Un po' di storia

Il progetto rsync è nato il 22 Giugno del 1996 (questa è la data del primo commit) dalle sapienti mani di Andrew Tridgell, che all'epoca rivestiva ruoli di Amministratore UNIX e ricercatore nell'ambito dei supercomputer presso la Australian National University (considerato il miglior istituto di istruzione superiore dell'Australia).

Lo stesso Tridgell ne aveva annunciato il primo rilascio il 19 giugno dello stesso anno con un messaggio nel quale discuteva le caratteristiche fondamentali di rsync, come l'utilizzo della codifica delta, il supporto ai trasferimenti crittografati tramite ssh ed opzioni per la copia di collegamenti simbolici, permessi, proprietà e timestamp.

Le caratteristiche appena elencate lo rendevano una validissima alternativa al vecchio rcp il quale, oltre ad avere un approccio più semplicistico nella copia dei file - rcp copia e basta, rsync sincronizza - era assolutamente insicuro dal momento che il trasferimento poteva avvenire solamente in chiaro.

Buona parte del lavoro svolto da Tridgell durante la progettazione e lo sviluppo di rsync, ha dato vita alla sua tesi di dottorato (Ph.D.) dal titolo "Efficient Algorithms for Sorting and Synchronization" (Visualizza il pdf in Google Docs) terminata nel Febbraio del 1999.

Ancora prima di dar vita a rsync, lo stesso Tridgell aveva seguito e sviluppato parecchi progetti software nel corso del suo dottorato presso la ANU. Durante il loro sviluppo, l'attesa da affrontare per il trasferimento dei codici sorgenti attraverso la linea analogica dell'epoca (1992-1995 c.ca) da una parte all'altra del pianeta era notevole, a tal punto da essere l'ispirazione per la nascita di rsync:

3.1 Inspiration

The rsync algorithm was developed out of my frustration with the long time it took to send changes in a source code tree across a dialup network link. I have spent a lot of time developing several large software packages during the course of my PhD and constantly finding myself waiting for source files to be transferred through my modem for archiving, distribution or testing on computers at the other end of the link or on the other side of the world. The time taken to transfer the changes gave me plenty of opportunity to think about better ways of transferring files.

Le idee alla base di rsync erano molto chiare, era necessario poter contare su uno strumento software in grado di sincronizzare file o directory, indipendentemente dalla loro natura e in tempi ragionevoli, minimizzando la quantità di dati da trasferire (cruciale per i trasferimenti via rete) ed utilizzando efficaci tecniche di analisi nei casi in cui fossero coinvolti, nel trasferimento, differenti versioni dello stesso file. Tutto questo cercando di utilizzare il minor numero di cicli di CPU possibile.

Gli obiettivi preposti sono stati raggiunti per intero e, con il passare degli anni, rsync ha raggiunto un ottimo livello di stabilità ed affidabilità.
L'ultima major relase, la 3.0.0, è stata rilasciata nel Marzo del 2008 apportando, come si evince dall'annuncio via mail e dal changelog, alcune importanti migliorie al design interno di rsync, migliorie che lo hanno reso ancora più efficiente e veloce soprattutto nel sincronizzare grosse quantità di dati.

L'algoritmo alla base di rsync

L'algoritmo di rsync parte dal presupposto che, nel caso in cui sia necessario copiare un file F da un computer sorgente A ad una destinazione B, e la destinazione (B) abbia già una versione simile ma non identica del file F, risulta molto conveniente trasferire soltanto le differenze tra le due versioni e non l'intero file. Questa semplice affermazione è l'origine del lavoro di Tridgell, il quale, per lo sviluppo di rsync, ha speso la maggior parte delle sue energie nel rendere le fondamentali operazioni di analisi e confronto il più veloci ed efficienti possibile.

3.2 Designing a remote update algorithm

Say you have two computers A and B connected by a low-bandwidth high-latency link. At the start of the transfer you have a file with bytes ai on A and a file with bytes bi on B. Assume for the sake of discussion that 0 ≤ i < n so that each file is n bytes long. The aim of the algorithm is for B to receive a copy of the file from A. The basic structure of a remote update algorithm will be:

  1. B sends some data S based on bi to A
  2. A matches this against ai and sends some data D to B
  3. B constructs the new file using bi , S and D

The questions then is what form S will take, how A uses S to match on ai and how B reconstructs ai. Even with this simple outline we can already see that the algorithm requires a probabilistic basis to be useful. The data S that B sends to A will need to be much smaller than the complete file in order for there to be any significant speedup.
This means that S cannot uniquely identify all possible files bi which means that the algorithm must have a finite probability of failure. We will look at this more closely after the algorithm has been fleshed out some more.

La prima strategia seguita dall'algoritmo è stata quella di spezzare il file (sia sorgente che destinazione) in blocchi di larghezza L, calcolando per ogni blocco una firma (checksum) debole con un basso consumo di CPU (rolling hash). Il basso consumo di CPU offerto da questo approccio permette di ottenere un algoritmo leggero ma col difetto di poter produrre falsi positivi (blocchi che producono un match pur possedendo delle differenze).

Per ovviare ai limiti intrinsechi della firma debole e CPU-friendly, rsync calcola un secondo checksum (MD4 hash), più complesso ed affidabile soltanto per i blocchi che producono un match, riducendo al minimo la quantità di firme complesse da calcolare e massimizzando l'affidabilità dell'intero algoritmo. Nella logica interna di rsync, l'algoritmo di rolling hash debole lavora quindi come un filtro, riducendo di fatto la quantità di firme complesse MD4 hash da calcolare.

3.2.3 Two signatures

The solution (and the key to the rsync algorithm) is to use not one signature per block, but two. The first signature needs to be very cheap to compute for all byte offsets and the second signature needs to have a very low probability of collision. The second, expensive signature then only needs to be computed by A at byte offsets where the cheap signature matches one of the cheap signatures from B.

[...]

3.2.5 Selecting the fast signature

The role of the fast signature in rsync is to act as a filter, preventing excessive use of the strong signature algorithm. The most important features is that it needs to be able to be computed very cheaply at every byte offset in a file.

Dalla versione 3.0.0 gli sviluppatori di rsync hanno rimpiazzato l'algoritmo MD4 con il più recente MD5 migliorando notevolmente l'affidabilità e la velocità dell'intera procedura di analisi e di match. L'MD5 possiede effettivamente parecchie differenze rispetto all'MD4 che lo rendono più veloce nel produrre L'effetto Avalanche.

Usare rsync localmente

È spesso utile dover sincronizzare due directory - o filesystem diversi - che risiedono localmente (sul medesimo host) con l'obiettivo di ottenere delle copie di backup o di condividere - ad esempio su un supporto di storage USB - un'intera struttura di directory con un'altra persona.
In questi casi rsync diventa la chiave di volta e può essere usato con i seguenti flag:

rsync -avz /path/to/source /path/to/destination /* -a modalità "archivio" (copia ricorsivamente tutti i file, permessi e timestamp ricorsivamente) -v modalità "verbose", offre un output verboso -z comprime i dati usando l'algoritmo gzip */

Nel blocco di codice appena visto, rsync copia le differenze dai file presenti nel path sorgente a quelli presenti nel path di destinazione ricorsivamente, mantenendo inalterati permessi, timestamp e collegamenti simbolici e considerando come versione aggiornata, la versione dei file presenti nella directory sorgente.

Nel caso in cui le directory sorgente e destinazione fossero eterogenee (contengano cioè entrambe delle versioni aggiornate di alcuni files), è necessario aggiungere l'opzione -u pensata per preservare tutti i file nella directory di destinazione, a patto che abbiano un timestamp più recente dello stesso file nella directory sorgente. In questo caso, il comando diventa:

rsync -auvz /path/to/source /path/to/destination /* -a modalità "archivio" -u evita la copia per i file che risultano più recenti nella directory di destinazione -v modalità "verbose" -z comprime i dati */

Se fosse poi necessario preservare i permessi di esecuzione dei file presenti nella directory sorgente, è possibile utilizzare il flag -E (--executability).

O se ancora, ci fosse l'esigenza di sincronizzare tutti i file che abbiano una dimesione minore o superiore ad un limite arbitrario, è possibile utilizzare i flag --max-size=SIZE e --min-size=SIZE (dove SIZE può essere un numero intero o non intero seguito da un'unità di misura come k, m o g per indicare rispettivamente Kilobyte, Megabyte e Gigabyte).

rsync over SSH

Una delle più entusiasmanti caratteristiche di rsync è quella di poter sincronizzare file tra host remoti utilizzando un canale di comunicazione cifrato tramite ssh. Questa - oltre alla sua straordinaria velocità - è forse la caratteristica che ne ha permesso l'incredibile fama e diffusione. Poter utilizzare rsync insieme ad ssh vuol dire poter contare su due strumenti fortemente singergici che, di fatto, danno egregiamente vita ad un "terzo" strumento.
È spesso utile trasferire alcune tipologie di file (come ad esempio chiavi private o file sensibili), attraverso un canale di comunicazione crittografato. Rsync over SSH svolge dunque con disinvoltura questo compito.
Per sincronizzare due directory che risiedono su computer remoti è quindi sufficiente modificare l'URI sorgente o destinazione aggiungendo il protocollo ssh:

rsync -auvz user@host:/path/to/source /path/to/destination

In questo modo rsync utilizza una connessione SSH agganciandosi alla porta di default (TCP 22). Se invece la nostra sorgente remota utilizzasse una porta diversa da quella di default, è sufficiente specificare gli argomenti da passare ad SSH direttamente nel flag --rsh di rsync:

rsync -auvz --rsh="ssh -p PORT" user@host:/path/to/source /path/to/destination /* Dove PORT può essere qualsiasi porta dalla quale ci sia un server ssh in ascolto. */

Piattaforme e OS supportati

Come già anticipato, rsync è disponibile sulla maggior parte dei sistemi operativi noti all'uomo come:

  • GNU/Linux
  • Solaris
  • Mac OS X
  • Windows

Vediamo dunque come installare rsync sui più diffusi sistemi operativi.

rsync su GNU/Linux

Negli ambienti GNU/Linux installare rsync è un gioco da ragazzi. Quale che sia la distribuzione utilizzata, esiste sicuramente un pacchetto precompilato (.deb o .rpm) contenente le librerie ed i binari di rsync. Sui sistemi debian-based (Debian ed Ubuntu) è quindi naturale utilizzare apt-get:

apt-get install rsync

Mentre sui sistemi di stampo Red Had (Red Had, CentOS, Fedora, Scientific Linux etc. etc.) basta utilizzare yum:

yum install rsync

rsync su Windows

Installare rsync su Windows è leggermente più complesso: è necessario installare cygwin oppure il pacchetto cwRsync che include una versione alleggerita di cygwin insieme a tutti i file binari di rsync.

Nel caso vogliate installare l'intera libreria offerta da Cygwin è consigliabile far riferimento alla guida ufficiale Installing and updating cygwin e, successivamente compilare i sorgenti di rsync - cygwin offre infatti tutti gli strumenti utili alla compilazione dei sorgenti come make e gcc; per una lista completa dei pacchetti disponibili consulta la Cygwin Package List.

Per installare invece cwRsync, vi consigliamo di leggere la semplice documentazione ufficiale dal titolo "cwRsync Installation/Usage".

rsync su Mac OS X

Rsync è incluso in tutte le versioni di Mac OS X a partire dalla versione 10.4 Tiger (intel). Per una installazione completa di rsync sulle versioni più datate di Mac OS X è necessario installare gli Apple Developer Tools e scaricare i sorgenti. Sul sito di Lorenzo Baloci è presente una semplice guida alla compilazione su Mac OS X.


2 Risposte a Rsync, copie incrementali alla velocità della luce

Giovanni

Davvero interessante l'analisi e la discussione sull'algoritmo di rsync. Qualche suggerimento su come installare rsync su windows? Cosa pensate sia meglio, usare cygwin oppure il pacchetto cwRsync? grazie in anticipo per il vostro supporto, un abbraccio, Giovanni.

Commento del 02/11/2012

Netdesign (Fabio Buda)

Dipende dalle tue esigenze. Se pensi che in futuro, nel tuo ambiente Windows, potrai aver bisogno di altri strumenti Unix oltre ad rsync, ti consigliamo di installare Cygwin. Se invece pensi di dover utilizzare soltanto rsync, ti troverai benissimo con cwRsync. Ciao!!!

Commento del 07/11/2012


Lascia un Commento

La tua email non verrà pubblicata ma sarà utile per notificarti le risposte al tuo commento. I commenti considerati spam non verranno pubblicati. Puoi utilizzare i seguenti tag html nel commento: <p>,<b>,<strong>,<code> e <em>.

Il tuo Nome:



Il tuo indirizzo email:



Il tuo Commento:

Invia Commento

Twitter Stream

Contatta Netdesign

Hai bisogno di consulenza sul mondo dello sviluppo web e dell'ottimizzazione della tua infrastruttura informatica? Contattaci subito, ti aiuteremo a trovare le migliori soluzioni alle tue esigenze di Information Techonology.

Contattaci




Questa pagina è scaduta 2779 giorni fa (il 10 Febbraio 2014). Puoi trovare una versione aggiornata di questo/i articolo/i sul nuovo sito web Netdesign alla sezione Guide

Sei comunque libero di consultare questa pagina, abbiamo deciso di lasciarla online per trasparenza e per rispetto nei confronti del nostro passato e del nostro lavoro. Questo sito web è stato pubblicato ad Ottobre 2011 ed è scaduto a Febbraio 2014.

ATTENZIONE! Le informazioni riportate in questa pagina non sono più valide o aggiornate e non rappresentano in alcun modo il sito web ufficiale di Netdesign a partire dal 10 Febbraio 2014.

NOTA: Questa pagina potrebbe contenere link rotti e quindi non più funzionanti.