Salvataggi con rsync

rsync è uno strumento utilizzato per il backup e la sincronizzazione dei file (può funzionare in molte versioni di *nix).

Un limite di rsync è che NON può copiare da sistema remoto a sistema remoto. Se si deve fare questo si deve copiare uno dei sistemi remoti sul sistema locale e poi copiarlo dal sistema locale al secondo sistema remoto. Questo è un limite di rsync.

Con aptosid si ha la scelta su come iniziare l'operazione, FAI-DA-TE oppure tramite un pacchetto in Debian sid:

Per il pacchetto debian:
apt-get install luckybackup

Sito internet di luckybackup.

Quello che segue da qui è per la versione FAI-DA-TE

Questa pagina fornisce una conoscenza sul campo di quello che può fare rsync e qualche esempio di codice da usare per uno script di backup (salvataggio) personale.

rsync è un programma di salvataggio dei file molto facile da usare, esso può anche salvare rapidamente file e cartelle. Questo viene fatto tramite una routine intelligente che controlla quando i file sono stati cambiati, cosicché solo quei file che sono stati cambiati vengono selezionati per la copia. rsync usa anche una utilità di compressione per velocizzare il processo di copia (quando è esplicitamente impostato con l'opzione -z). Questo può essere spiegato molto semplicemente:

il programma rsync rileva i file e le cartelle che devono essere copiati in base ai cambiamenti di uno o più degli attributi dei file (per esempio la data/ora delle ultime modifiche, o la dimensione del file), in ciascun caso qualcosa non è lo stesso di quello che è stato salvato in precedenza. Questo processo di selezione è molto veloce.

Quando rsync ha terminata la costruzione della lista che userà, la copia di questi file cambiati viene eseguita molto più velocemente a causa di una routine di compressione eseguita durante il processo di copia. rsync esegue la compressione prima dell'invio e decomprime "al volo" all'arrivo.

rsync può copiare file da:
* sistema locale a sistema locale,
* sistema locale a sistema remoto,
* sistema remoto a sistema locale.

lavora usando o il client ssh predefinito oppure attraverso un demone rsync sia sul sistema sorgente che su quello di destinazione. Le pagine del manuale (man pages) per rsync dicono che, se si può utilizzare ssh sul sistema, allora anche rsync potrà connettersi ad esso via ssh.

Un limite di rsync è che NON può copiare da sistema remoto a sistema remoto. Se si deve fare questo si deve copiare uno dei sistemi remoti sul sistema locale e poi copiarlo dal sistema locale al secondo sistema remoto. Questo è un limite di rsync.

Come esempio di questa logica, supponiamo di avere tre sistemi:

neo - il sistema locale
morpheus - un sistema remoto
trinity - un sistema remoto

Si vuole usare rsync per copiare o sicronizzare la /home/[utente]/Cartella dati da tutti i sistemi verso gli altri. Ogni sistema "appartiene" ad uno specifico utente, in altre parole, un utente specifico usa quel sistema così quel sistema dovrebbe essere usato come fonte per gli altri due sistemi. Si farà girare rsync solo sul sistema locale, che è "neo":

il principale utente di neo è cuddles,
il principale utente di morpheus è tartie, e
il principale utente di trinity è taylar.

Così, quello che si vuole è il salvataggio o la sincronia delle seguenti aree dati:

di neo in /home/cuddles/Data su morpheus e trinity,
di morpheus in /home/tartie/Data suo neo e trinity,
di trinity in /home/taylar/Data su neo e morpheus.

Il problema di rsync è la non possibilità di copiare da sistema remoto a sistema remoto quindi, negli esempi di cui sopra, quando cercheremo di salvare trinity su morpheus, o morpheus su trinity (con sia la fonte che al destinazione sistemi remoti) il salvataggio non funzionerà.

neo --> morpheus - funziona, è da locale a remoto
neo --> trinity - funziona, è da locale a remoto
morpheus --> neo - funziona, è da remoto a locale
trinity --> neo - funziona, è da remoto a locale
morpheus --> trinity - da remoto a remoto - non funziona
trinity --> morpheus - da remoto a remoto - non funziona

Per superare questo limite si deve cambiare un po' lo schema di rsync. Lo schema seguente dovrebbe funzionare:

morpheus --> trinity - diventa: morpheus --> neo & neo --> trinity
trinity --> morpheus - diventa: trinity --> neo & neo --> morpheus

Questa è un'operazione in più rispetto al passo singolo, ma considerando che si vuole maneggiare i file mediante neo, è solo un cambiamento della provenienza della sorgente, non il risultato finale. Ciò suppone che i nostri salvataggi siano buoni e nulla vada perso.

Questo limite di rsync deve essere considerato quando si sta progettando il processo di salvataggio.

Usare gli hostname con rsync

Come descritto in precedenza, l'uso di neo, morpheus, o trinity in una traduzione di indirizzi fisici IP Address, è un modo pulito e facile per rendere le cose molto più leggibili. Fare questo potendo usare gli hostname, è veramente semplice.

Si modificherà il file /etc/hosts aggiungendo gli hostname ed i relativi indirizzi IP. Ecco una piccola parte delle linee in cima al file /etc/hosts, che mostra le traslazioni:

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

La prima riga trasla l'indirizzo IP 192.168.1.15 al nome 'neo', la seconda 192.168.1.16 al nome 'morpheus' e l'ultima linea, l'indirizzo IP 192.168.1.17 al nome 'trinity'. Dopo aver salvato il file /etc/hosts, si può usare il "nome" invece dell'indirizzo IP, ma si può anche continuare ad usare l'indirizzo IP. La cosa che rende la traslazione davvero brillante è quando si devono cambiare gli indirizzi IP dei sistemi. Per esempio supponiamo che neo cambi il suo indirizzo IP da 192.168.1.15 a 192.168.1.25

Se si hanno degli script che usano gli indirizzi IP, si sarà costretti a localizzarli tutti e a sostituire gli indirizzi. Con la traslazione se negli script si sono utilizzati i "nomi", tutto quello che si deve fare è cambiare il file /etc/hosts per rispecchiare il cambiamento, e tutti gli script funzioneranno. Questo può essere molto pratico quando si hanno molti script che si connettono in remoto ad altri sistemi o viceversa. Il metodo dei "nomi" rende gli script molto più facili da leggere e da seguire in quanto non si stanno usando indirizzi IP, ma piuttosto un nome riconoscibile.

rsync, due modi d'uso.

Un modo è "spingere" i file verso la destinazione, e l'altro è "tirarli" da una sorgente. Ognuno dei due modi ha i suoi vantaggi e svantaggi (per questa spiegazione, supponiamo che uno dei sistemi sia locale e l'atro remoto, in questo modo si dovrebbe riconoscere molto meglio la terminologia):

"push - spingere" - il sistema locale ha la fonte dei file in cartelle su di sè e la destinazione è un sistema remoto. Il comando rsync è lanciato dal sistema locale e spinge i file verso il sistema di destinazione.

Vantaggi:
* Si può avere più di un sistema che salva sé stesso su un sistema di destinazione.
* Il processo di salvataggio è distribuito sull'intero sistema di computer e non solo un sistema verrà impegnato.
* Se un sistema è più veloce di un altro, esso può finire prima e poi fare altre cose.

Svantaggi:
* Se si sta usando uno script e se ne è programmata l'esecuzione con cron, questo richiederà aggiornamenti e cambiamenti delle molteplici crontabs su ogni sistema così come l'aggiornamento delle molteplici versioni dello script.
* Il salvataggio non può controllare se il sistema di destinazione ha le partizioni montate e potrebbe non salvare niente sulla destinazione.

"pull - tirare" - il sistema remoto ha la fonte dei file e delle cartelle su di esso e la destinazione è sul sistema locale. Il comando rsync viene lanciato dal sistema locale e "tira" i file dal sistema fonte.

Vantaggi:
* Un sistema è impostato per essere server e controllare tutti i salvataggi per tutti gli altri sistemi. Salvataggi centralizzati.
* se si sta usando uno script è contenuto solo su un sistema e solo uno script rende facili gli aggiornamenti e le variazioni. Esso permette anche di controllare un solo file crontab file per programmare l'esecuzione degli script.
* Lo script può controllare e montare, se necessario, la partizione di destinazione.

Sintassi di rsync come descritto nelle sue man-page:
       rsync [OPTION]... SRC [SRC]... DEST

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

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

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

       rsync [OPTION]... SRC

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

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

       rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
Esempi funzionanti di comandi rsync:
rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Guardiamo un attimo alcune parti di questo comando:

il percorso dei file della fonte è: morpheus:/home/tartie
la destinazione è: /media/sda7/SysBackups/morpheus/home

tutti i file da /home/tartie... verrano salvati in /media/sda7/SysBackups/morpheus/home che apparirà come:

/media/sda7/SysBackups/morpheus/home/tartie...

È da notare che la sola ragione per cui /tartie è sotto /home è a causa del percorso designato per la DESTINAZIONE, e NON della FONTE. La 'fontè indica solo la provenienza dei file non dove questi si depositeranno. La "destinazione" è quella che dice a rsync dove mettere i file presi dalla "fonte". Vedere gli esempi seguenti:

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

Nel comando di cui sopra solo la cartella fonte /files, e quelle sotto di essa si ritroveranno sotto la cartella di destinazione /neo - e non la seguente /media/sda7/SysBackups/neo/home/user/data/files

Assicurarsi di aver preso in considerazione questo mentre si creano i comandi di salvataggio per rsync.

Spiegazione delle opzioni:
-a è usato per il modo archivio. La man-page spiega questa opzione nel modo seguente: 'in parole povere,
un modo di salvare in modo ricorsivo e preservare' quasi tutto. Accenna al fatto che questa opzione non preserva gli 'hardlinks' a causa della complessità del processo.
L'opzione -a option è dichiarata come equivalente delle seguenti: -rlptgoD che significano questo:
  -r = recursive - processa le sotto-cartelle e i file trovati nella nostra locazione fonte.
  -l = links - quando incontra dei symlinks li ricrea sulla cartella di destinazione.
  -p = permissions - dice a rsync di impostare nella destinazione gli stessi permessi della fonte.
  -t = times - dice a rsync di impostare nella destinazione gli stessi attributi di tempo della fonte.
  -q = quiet - dice a rsync di tenere al minimo il proprio output anche nel caso noi aggiungiamo un livello di prolissità con il comando -v giusto dopo questo. Per rendere il processo completamente 'quiet' rimuovete la 'v' nel comando.
  -o = owner - dice a rsync che se è lanciato come root, imposti il proprietario dei file nella destinazione uguale a quello della fonte.
-D = questo equivale ad usare questi due comandi: --devices --specials
 --devices = impone a rsync di trasferire caratteri e file 'block devicè al sistema remoto per ricreare questi dispositivi. Sfortunatamente se non includete anche --super nello stesso comando, il --devices non ha effetto.
 --specials = impone a rsync di trasferire file speciali come i 'named socket' ed i 'fifo'.
-g viene usato per preservare l'attributo di 'gruppò della fonte sulla destinazione.
-E è usato per preservare l'attributo eseguibile della fonte nella destinazione.
-v è usato per aumentare la prolissità emessa da rsync. Dopo che siamo sicuri che stiamo salvando ciò che vogliamo il comando 'v' può essere rimosso. Si può lasciare se, avendo programmato il processo di salvataggio con cron, si preferisce poi vedere cosa è stato fatto. Ognuno decida per sè.
-z è usata per comprimere i dati da trasferire o copiare. Ciò velocizza il processo in quanto i dati sono trasferiti con dimensione minore del reale.
--delete-after = i file/cartelle nella destinazione che non esistono più nella fonte verranno cancellate solo dopo la fine del trasferimento, non prima. Questo 'after' è usato in caso di problemi o un crash, e il 'delete' è usato per non tenere file non puliti e vaganti nella destinazione che non esistono più nella fonte.
--exclude = uno schema usato per escludere file o cartelle. Ad esempio, --exclude='*~' escluderebbe dal salvataggio TUTTI i file o cartelle che terminano con il carattere '~'. Solo uno schema può essere gestito da un --exclude, così se ne serve più di uno occorre aggiungere nuovi --exclude con altri schemi nella stringa del comando.

Le seguenti sono altre opzioni utili dei comandi:

-c - aggiunge un'altro livello di controllo nella fonte che verrà comparata con la destinazione dopo il processo di copia,
ma per questo impiegherà piu tempo, mentre rsync già fa una comparazione tra fonte e destinazione
durante il suo processo, ed è solo una forma di ridondanza, alla fine non necessaria.
--super - ol quale, come descritto nella man-page, il ricevente, o il sistema di destinazione, tenterà di fare delle attività come super-user.
--dry-run - lancia una simulazione che mostrerà cosa verrebbe trasferito, è come usare l'opzine -s con apt-get install, o apt-get dist-upgrade.

Il resto del comando è la fonte dei file/cartelle e poi la locazione della cartella di destinazione.

Comandi di esempio:
rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Questo comando salverà tutti i file e le cartelle sotto /home/tartie sul sistema traslato col nome 'morpheus', e li metterà nella cartella /media/sda7/SysBackups/morpheus/home - conservandone la struttura presa dalla cartella tartie.

rsync -agEvz --delete-after --exclude='*~' /home/tartie neo:/media/sda7/SysBackups/morpheus/home

Questo comando è il riversametnto del comando di cui sopra. Esso "spingerà" la cartella /home/tartie, i suoi contenuti e le sottocartelle sul sistema chiamato neo nella stessa cartella - notare che un sistema è considerato remoto quando ha il simbolo ":" (due punti) davanti al percorso (path).

rsync -agEvz --delete-after --exclude='*~' /home/cuddles /media/sda7/SysBackups/neo/home

Questo comando esegue un salvataggio da locale a locale; notare che non esistono simboli ':' né nella locazione della fonte né in quella di destinazione. Questo comando salverà localmente l'area /home/cuddles sullo stesso sistema alla locazione /media/sda7/SysBackups/neo/home.

Vediamo come verrebbe un comando "exclude" multiplo di rsync:

rsync -agEvz --delete-after --exclude='*~' --exclude='*.c' --exclude='*.o' "/*" /media/sda7/SysBackups/neo

Il comando di cui sopra salverà TUTTO a partire dalla root del sistema locale, e metterà futti i suoi file/cartelle nella locazione di destinazione /media/sda7/SysBackups/neo - ma escluderà solo che ora escluderà tutti i file o le cartelle chefiniscono con un '~', o un '.c', o un '.o'

Sotto viene mostrato un esempio di comando rsync che dovrebbe essere evitato quando possibile. È un esempio di un comando rsync da un sistema remoto a un sistema remoto:

rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie trinity:/home

Come già detto prima in questo documento. questa è una limitazione di rsync.

Con l'ultimo esempio di comando, vediamo come dovrebbe apparire invece un rsync da remoto a locale se noi rimpiazziamo i nostri 'system names' con gli indirizzi IP.

Il primo comando è con il metodo a 'nomì mentre il secondo è lo stesso esatto comando usando per gli indirizzi IP

rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home
rsync -agEvz --delete-after --exclude='*~' 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

Come detto in precedenza, non si è obbligati ad usare la traslazione con i nomi ma nel primo esempio, dove viene usata, si può leggere cosa sta facendo il comando molto più facilmente che nel secondo.

Ora si dovrebbe essere in grado di progettare un comando semplice, sia dagli esempi dati, sia togliendo e abbinando i comandi mostrati per ottenere quello che ci serve.

Page last revised 14/08/2010 0100 UTC