spacer

Sysresccd-manual-it Backup and transfer your data using rsync

History


Introduzione

Rsync è un programma ‘open source’ per la sincronizzazione di programmi. E’ una multipiattaforma, esso è in grado di lavorare con Linux, Unix e Windows con cygwin. E’ un software molto avanzato che può essere usato per effettuare backups, o per copiare file attraverso la rete. Può anche essere usato per fare copie di files da un disco all’altro. I vantaggi di rsync sono l’alta efficienza nel copiare file molto grandi, la grande robustezza (effettua cheksums), e l’elevata flessibilità. Per tutte queste ragioni, e meglio di scp/ftp/http per le copie di files, ed è anche un software molto buono per effettuare backups. Esso inoltre supporta tutti i tipi di files (flat files, links, hard links), attributi estesi (xattr) e ACLs (licenze avanzate). Rsync può essere usato per fare ogni tipo di backup: backups completi, backups differenziali, backups incrementali, finchè si sta lavorando su ‘flat files’, che è spesso il caso dei sistemi operativi Linux e Unix.

Rysnc ha anche degli inconvenienti: ad esempio le opzioni potrebbero non essere chiare quindi si possono commettere errori se vengono dimenticate opzioni importanti (come l’opzione per mantenere gli attributi avanzati dei files). Bisogna inoltre memorizzare i backups su un file system di linux appropriato se si vuole essere in grado di conservare tutti questi attributi. Con l’archiviazione, gli attributi potrebbero essere memorizzati nell’archivio, e successivamente è possibile memorizzare l’archivio su una qualsiasi vecchia generazione di file system.

Rsync è fornito da SystemRescueCd, ma questa documentazione è interessante in altri contesti, quindi non si deve usare SystemRescueCd per seguire le istruzioni date qui.

Usi base

Una volta compilato, rsync viene installato come un programma binario singolo che può essere usato come server (quando viene avviato con l’opzione --daemon) o come client, quindi non si ha bisogno di avere due programmi. Rsync può anche essere usato per fare copie di files su una macchina locale o attraverso la rete. Di seguito sono riportati tre modi disponibili ed esempi. La prima opzione che è possibile usare è che –a specificare che rsync deve preservare tutte le caratteristiche basilari dei files (ad esempio un link simbolico sarà copiato come un link). Bisogna essere molto attenti col taglio finale, poiché può avere un effetto.

copia di un file su una local machine

In caso di una copia da disco a disco, è coinvolto un solo processo di rsync, esso può essere usato per un backup locale. Qui di seguito è riportato un esempio:

  rsync -a /home/mydata/ /backups/data-20080810/

trasferimento remoto in modalità standalone

In questo caso rsync è installato come un daemon che ascolta sulla porta tcp/873 da un lato, e dall’altro sta girando il client. Esso può lavorare in entrambi i lati: il client rsync può prendere files dal daemon di rsync, o il client di rsync può mandare files al daemon di rsync. Il daemon di rsync può essere installato anche in un modo di ascolto diretto (il processo di rsync è in ascolto diretto sulla porta tcp), o un daemon inetd/xinetd può essere in ascolto sul conto di rsync. Il secondo metodo è supposto essere più sicuro, poiché inetd/xinetd può fare controlli di sicurezza. Ciò significa anche che non bisogna riavviare il servizio quando bisogna cambiare la configurazione del file del daemon di rsync.

Qui è riportato come il client può spingere una directory a un server remoto di rsync mentre sta girando il daemon.

  rsync -a /home/mydata/ 192.168.1.1::mybackups/data-20080810/

Il client può anche scaricare I files dagli hosts remoti

  rsync -a 192.168.1.1::mybackups/data-20080810/ /home/mydata/

Si può notare che ci sono due volte i due punti tra l’indirizzo dell’host remoto e il percorso dove copiare i dati.

trasferimento remoto attraverso ssh

Se la porta tcp/873 non è aperta, si può anche usare rsync attraverso ssh. Tutto quello che bisogna fare è specificare un opzione sul lato del client (rsync –e ssh). Questo programma si connetterà al server ssh dell’indirizzo specificato, ed eseguirà in modo remoto un programma rsync nonostante lo shell di sicurezza. Un server ssh deve essere installato sul lato del server, e rsync deve essere installato su entrambe le parti, e i contenuti sono codificati a causa del ssh.

Qui è riportato come il client può spingere dati all’host remoto:

  rsync -a -e ssh /home/mydata/ 192.168.1.1:/backups/data-20080810/

E’ possibile anche trasferire files in un altro modo:

  rsync -a -e ssh 192.168.1.1:/backups/data-20080810/ /home/mydata/

Si può notare come ci sono solo due punti tra l’indirizzo dell’host remoto e il percorso remoto

Trasferire grandi file attraverso una rete lenta o inaffidabile

Spesso si ha bisogno di copiare una grande quantità di dati, anche files molti grandi, o migliaia di piccoli files. In entrambi i casi scp/ftp/http sono spesso inattendibili, e riprendere un trasferimento è un problema perché bisogna controllare quali files bisogna ancora copiare. Inoltre se un processo si interrompe al 99% di un grosso file, è anche molto complesso riprendere, e anche quando c’è una scelta tale (eg: wget - c) si potrebbe terminare con un file corrotto. In entrambi i casi, si è costretti a trasferire di nuovo tutto per essere sicuri che il trasferimento sia stato completato. Quindi i trasferimenti possono diventare degli incubi con una connessione di rete lenta o inaffidabile. Poiché rsync è efficiente su grandi archivi, è un buon metodo per scaricare, anche se è meno popolare di http e ftp. Ad esempio, molte distribuzioni di linux offrono specchi dove è possibile usare rsync per scaricare immagini iso del disco di installazione.

Trasferimento di migliaia di piccoli files

Rsync offre soluzioni molto buone per questo tipo di situazioni. Di default, rsync trasferisce i files che necessitano di essere copiati. In altre parole, per prima cosa compare il file sorgente i files di destinazione, e se sono diversi esso fa una copia. Ciò permette di salvare molta larghezza di banda in trasferimenti remoti, ed esso salva molte volte in backups locali. In caso di backups regolari, significa che bisogna copiare i files che sono stati modificati dal backup precedente.

Di default, rsync usa il tempo di modifica e la grandezza del file per fare il paragone. Esso considera due files con la stessa data e dimensione come simili. Questo è un buon compromesso in molti casi. Il confronto è molto rapido perché rsync non deve leggere i contenuti dei files, esso legge solo gli attributi dei files. Se non ci si vuole affidare a questi due attributi (tempo di modifica e dimensione), è possibile specificare –c o –checksum e quindi rsync effettua un checksum dei files per essere trasferiti. In caso di copia remota esso salva molta larghezza di banda poichè per i files identici devono essere trasferite solo le checksums.

Col behaviour di default (paragone basato sul tempo di modifica e la grandezza del file), si può interrompere il trasferimento e far partire rsync di nuovo. I files che sono stati appena copiati hanno lo stesso tempo e dimensione e quindi vengono ignorati, quindi vengono saltati tutti i files che sono stati appena copiati. Quindi rsync riesumerà solo il trasferimento. Si è sicuri che i files che rsync salta non sono compressi perché rsync effettua un checksumming. L’unica cosa che si può perdere se si stanno usando le opzioni di default è il file che si stava trasferendo quando il processo è stato interrotto. Se sono solo piccoli files ciò non è un problema, ma si può essere interessati a riesumare il trasferimenti di grandi files con rsync.

Trasferimento di grandi files

Rsync è in grado di riprendere il trasferimento di grandi files quando si usano due opzioni insieme: --partial and --inplace. La prima opzione significa “mantieni i files trasferiti parzialmente” e il secondo significa “carica la destinazione dei files nel-luogo”. Queste due opzioni sono necessarie perché di default rsync rimuove i files che sono stati trasferiti parzialmente quando è stato interrotto il processo. Se viene persa la connessione quando il file è stato inviato al 99% vuol dire che bisogna trasferire tutto di nuovo. E quando non viene usato --inplace, rsync lavora con files temporanei con un nome random durante il trasferimento, e lui rinomina il file una volta terminato il processo. Il problema si crea quando viene riavviato rsync, che non può trovare il file parziale di destinazione e quindi trasferisce il file di nuovo. Quando viene specificato --inplace, rsync lavora con il nome del file di origine, e successivamente può essere ricaricato. Bisogna controllare che non si sta utilizzando l’opzione -u --update, altrimenti la destinazione incompleta potrebbe essere considerata più nuova del file originale, e quindi il trasferimento non può essere ripreso.

Rsync utilizza un algoritmo molto efficiente per confrontare il contenuto di due files (il file sorgente e il file di destinazione). E’ in grado di riconoscere ridondanze anche su grandi files. Attraverso ciò, esso trasferisce solo le parti diverse dei files, quindi risparmia una grande quantità di larghezza di banda sui files con ridondanze. Quindi se si ha bisogno di trasferire diverse versioni dello stesso file su basi regolari, bisogna solo copiare la vecchia versione (che è già stata trasferita) sul nuovo file di destinazione, e rsync salterà automaticamente tutte le parti in comune.

Quindi è possibile trasferire files grandi con molta efficienza quando viene usato rsync con --partial e --inplace. Si può interrompere e riprendere il trasferimento tutte le volte che si vuole e non viene perso ciò che è stato trasferito. E una volta che rsync effettua il checksumming sui dati, si è sicuri che i files non sono danneggiati.

Ecco un esempio di buona dicitura per copiare in modo remoto una directory con grandi files

  rsync -a --partial --inplace /home/bigfiles/ 192.168.1.1::mybackups/bigfiles/

Bisogna anche controllare che si sta lavorando con le stesse versioni di rsync. L’algoritmo di rsync e il protocollo che aiuta a salvare una parte di larghezza di banda è stato implementato precedentemente. Quando le versioni di rsync che sono coinvolte in una copia remota sono diverse (client e server), rsync utilizzerà il migliore protocollo utilizzabile. Quindi bisognerebbe provare ad avere una versione aggiornata installata in entrambi i lati per ottimizzare il trasferimento.

Le più importanti opzioni di Rsync

Rsync viene distribuito con molte opzioni. Lo scopo di questo tutorial non è quello di essere esaustivo, quindi vengono descritte le opzioni di rsync più usate. Comunque esso esiste, vengono dati sia i nomi corti che quelli estesi delle opzioni, e bisognerebbe usare solo uno di loro.

-a, --archivio: conservare gli attributi di default

Questa opzione è molto importante in diversi casi. Essa assicura che rsync conserverà tutti gli attributi dei files (permessi, tempi, tipo di file,…). Con questa opzione, il file di destinazione sarà simile al file di origine. Ad esempio, un link simbolico sarà copiato come un link. Invece, i contenuti del file obiettivo sarà copiato nel file di destinazione. Bisogna stare attenti: i links pesanti, gli attributi estesi (xattr), a i ACLs non sono conservati con questa opzione, e quindi bisogna anche aggiungere – HAX

-u, --update: saltare i files che sono più nuovi sul ricevitore

Bisogna usare questa opzione solo se si devono effettuare modifiche della directory di destinazione. Ad esempio, se si stanno trasferendo dati da un vecchio server ad uno nuovo, e se le persone hanno già iniziato a lavorare sul nuovo server, bisogna usare questa opzione per essere sicuri che rsync non sovrascriva i cambiamenti con una versione più vecchia. Sui backups normali, questa opzione è inutile.

-c, --checksum: salto basato sul checksum, non sul tempo di modifica e dimensione

Di default rsync confronta il tempo di modifica e la grandezza di un file per capire se è stato modificato. Ciò è sicuro e rapido in molti casi. Ciononostante, se si pensa che due files con la stessa grandezza e tempo di modifica sono stati cambiati, e se si vuole essere assolutamente sicuri che i contenuti sono simili, è possibile usare questa opzione.

-x, --one-file-system: non oltrepassare i limiti dei filesystem

Se viene usato rsync per effettuare backups di una live machine, si potrebbe volere effettuare la copia di un file system alla volta. Di default, tutti i files che vengono visti vengono copiati. Quindi se si effettua il backup del root file system con rsync, tutti i files system caricati vengono copiati allo stesso tempo. Per mantenere questo behaviour di default, bisogna usare questa opzione.

-z, --compress: comprimere i dati durante il trasferimento

Rsync può comprimere i dati che vengono trasferiti per salvare larghezza di banda. Questo significa che i dati vengono compressi durante il trasferimento, il file di destinazione sarà uguale all’originale. Bisognerebbe usare questa opzione per trasferimenti remoti se si pensa che si stanno trasferendo files non compressi e con un buon rateo di compressione (es.: grandi files di testo, o immagini a righe). Questa opzione non è efficiente sui files che sono già compressi: zip, gz, bz2, jpeg, …

--inplace and --partial

Usare questa opzione se si vogliono trasferire grandi files e per essere sicuri che il trasferimento verrà ripreso allo stesso punto in caso di interruzione della connessione. Per maggiori dettagli vedere la sezione sul trasferimento di grandi files.

--progress: mostra l'avanzamento durante il trasferimento

Questa è un’opzione per visualizzare lo stato del trasferimento, quindi è utile quando si lavora con rsync a mano.

--delete: cancellare i files estranei dalle directrory di destinazione

Di default, rsync abbandona I files che sono nella directory di destinazione e che non sono in quella di origine. Ciò può essere un problema per i backups: quando i files vengono rimossi nella directory di origine, essi rimangono nella cartella di backup. Bisogna utilizzare questa opzione se si vuole che rsync rimuova i files che sono solo nella directory di destinazione.

--remove-source-files: il mittente rimuove i files sincronizzati (non-dir)

Si può utilizzare questa opzione se si vuole che rsync trasferisca i dati alla destinazione. Di default, rsync effettua una copia. Con questa opzione, i files sorgenti verranno cancellati da rsync se il trasferimento si conclude con successo.

--exclude=pattern: escludere i files matching pattern

Utilizzare questa opzione quando si vogliono escludere files o dictories dal trasferimento. Ad esempio, si potrebbe voler escludere i files contemporanei o altri dati inutili quando si effettua un backup.

Stato di ritorno di Rsync

Come qualsiasi altro programma, rsync viene resettato quando viene chiuso. Questo status di ritorno può essere usato per controllare se il trasferimento ha avuto successo o no. Quando rsync ritorna allo stato 0, significa che il trasferimento è stato completato con successo. Tutti gli altri stati indicano che c’è stato un errore. In ogni caso, è possibile far girare rsync su un sistema live. Ad esempio, è possibile far girare rsync su un server ogni notte per effettuare un backup dei suoi files system. Su un sistema live, vengono creati sempre nuovi files. Quindi rsync potrebbe probabilmente dare problemi su questi files che sono spariti durante il trasferimento (come i files temporanei). Per questa ragione, è possibile considerare gli stati 22 e 23 come un successo sui sistemi live:

  • 22: Error allocating core memory buffers
  • 23: Partial transfer due to error

Come installare e configurare il daemon di Rsync

In molti casi si può avere bisogno di installare un daemon di sync se si vuole trasferire dati attraverso la rete. Il daemon è il processo di rsync che viene avviato nel background e che ascolta sulle porte tcp per gestire le connessioni in entrata da altri client di rsync. Il daemon può essere installato o come servizio standalone (utilizzare / etc/ init.d/ rsync per gestire il servizio), o come modulo di inetd/xinetd.

Il file di configurazione per un daemon è conservato o / etc/ rsyncd.conf o / etc/ rsync/ rsyncd.conf di default. Questo è il file che bisogna compilare per cambiare i settaggi del daemon. Quando viene cambiata la configurazione, non bisogna dimenticare di riavviare il daemon di rsync (o di inviare un segnale HUP utilizzando kill –HUP <pid-of-rsync>). Ciò non è necessario se si sta utilizzando inetd/xinetd, poiché la configurazione viene letta ogni volta che un client si connette. In questo caso, non bisogna dimenticare di attivare il servizio inetd/xinetd, poiché potrebbe essere interrotto.

Quando viene installato un daemon , bisogna ricordare che potrebbe dover essere criptato. E’ possibile usare le seguenti tecniche:

  • Il daemon richiede una password per connettersi
  • E’ possibile far connettere solo determinati indirizzi IP
  • È possibile permettere un accesso al client in sola lettura

Se viene utilizzato un accesso protetto attraverso una password, è raccomandato che la password usata dal client di rsync venga scritta in un file di testo invece che in una riga di comando. Ciò permette che un’altra persona che legge da fuori non veda la password.

Qui è riportato un esempio di base di una configurazione sicura per un daemon di rsync:

  # ======================/etc/rsyncd.conf======================
  pid file = /var/run/rsyncd.pid
  read only = yes
  uid = root
  gid = root
  
  [share1]
      path = /mnt/share1
      read only = yes
      hosts allow = 192.168.1.1, 10.88.45.0/24
  
  [backups]
      path = /var/tmp/catalyst/tmp
      read only = no
      hosts allow = 192.168.1.1, 10.88.45.0/24
  
  [rootfs]
      path = /
      read only = yes
      hosts allow = 192.168.1.1, 10.88.45.0/24
  
  [upload]
      path = /upload
      read only = no
      hosts allow = 172.16.0.0/16

Come installare Rsync su Windows con Cygwin

E’ possibile anche installare il daemon di rsync su Windows installando l’ambiente cywin. Cywin offre un ambiente compatibile con linux che gira su Windows. Non è un emulatore: è lo stesso software che viene usato su linux che è stato compilato per lavorare su Windows, quindi è un eseguibile di Windows che si rivolge direttamente al kernel di Windows.

Per installare cywin bisogna caricare il programma setup.exe fornito sul sito web ufficiale, e installare il pacchetto di cui si ha bisogno. L’installer scarica i pacchetti binari e li installa sul disco fisso. Quando l’installazione è completa, bisogna solo cliccare sull’icona per far caricare una finestra bash shell. Non bisogna fare altro per installare il client rsync su Windows. Bisogna ricordare che i dischi fissi sono visti in / cygdrive/ c/ , / cydrive/ d/ , … quando si lavora sotto cywin.

E’ possibile anche installare rsync come un daemon su cywin. Per installare servizi su cywin, è possibile utilizzare un programma speciale chiamato cygrunsrv.exe. Esso installa un servizio cywin come un normale servizio di Windows, in modo che può essere avviato automaticamente all’avvio di Windows. In questo modo non bisogna avviare il daemon a mano.

Le persone riportano che rsync non lavora bene sul top di ssh su cywin, quindi bisognerebbe usare il daemon stand alone. Qui è riportato il comando da usare:

  cygrunsrv.exe -I "cygrsyncd" -p /usr/bin/rsync.exe -a "--config=/etc/rsyncd.conf --daemon --no-detach"

Successivamente bisogna avviare il nuovo servizio (caricare services.msc e avviare il servizio chiamato “cygrsyncd”).

spacer