domenica 25 aprile 2021

rsync

Si, lo so, fare backup locali da quando ci sono la nuvola disponibile ed i software di sincronizzazione on line non va molto più di moda, ma io sono all'antica, e mi piace avere un buon backup locale su un HD esterno.

Si, ci sono anche i NAS in Raid, è vero, ma se non aggiorni continuamente l'hardware (non il software, proprio l'hardware) ti ritrovi con dei sistemi pazzescamente lenti, e quando si parla di controllo di Terabyte di dati la cosa non è piacevole, specie quando si fanno spesso cambiamenti sostanziali e significativi. Certo, con l'automatismo te ne puoi anche dimenticare, ma se dopo una vita di attesa il software è ancora lì che lavora, beh, qualquadra non cosa.

Quindi, un paio di HDD esterni belli capienti, ed ecco che i backup 1 e 2 (perché vorrete avere 2 backup locali, no? No? Ahi, ahi ahi...) , anche se fatti a manina, ti fanno dormire un po' più tranquillo. E proprio per questo, ho tradotto una delle tante guide che ci sono in rete su rsync, che resta comunque un ottimo software a linea di comando (lasciate perdere la GUI, la linea è molto più divertente ed istruttiva) per ottenere backup rapidi ed efficienti. Per chi invece preferisce l'interfaccia grafica, anziché quelle per rsync, consiglio l'ottimo Krusader e le sue molte funzionalità, tra cui anche la sincronizzazione ricorsiva di cartelle.

Ah, rsync ha anche funzionalità per il backup remoto su spazi di rete, ma sono abbastanza limitate (e per quello è stato creato rclone, di cui parlerò in un altro post). Di seguito la guida, molto basilare, che, come già fatto per altre cose, metto in rete per potermela ritrovare quando mi serve, su qualunque device stia lavorando.

Buona lettura

rsync

Come utilizzarlo per sincronizzare cartelle locali e remote

By Justin Ellingwood Last Validated on November 18, 2020 Originally Published on September 10, 2013

Introduzione

rsync, che significa “remote sync” o “sincro remoto”, è un insieme di strumenti (tool) a linea di comando per la sincronizzazione di file sia locale che remota; utilizza un algoritmo che minimizza la quantità di dati copiati muovendo soltanto le porzioni di file che sono state modificate. Grazie alla sua ubiquità su Linux e sistemi “Unix-like” e la sua popolarità come strumento basato su script di sistema, è incluso tra le impostazioni predefinite nella maggior parte di distribuzioni Linux. Sintassi di base La sintassi di base di rsync è davvero semplice, ed agisce in modo simile a ssh, scp, e cp. rsync.

A titolo di esempio, vengono create due cartelle ed alcuni files con i seguenti comandi:

cd ~

mkdir dir1

mkdir dir2

touch dir1/file{1..100}

Ora esiste una cartella denominata dir1 contenente 100 files vuoti.
Per visualizzarne il contenuto si digita:

ls dir1

Output
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Esiste anche una cartella vuota denominata dir2.
Per sincronizzare il contenuto della cartella dir1 nella cartella dir2 entro lo stesso sistema, si digita:

rsync -r dir1/ dir2

dove l’opzione “-r“ significa “ricorsivamente”, che è necessaria per sincronizzare il contenuto delle cartelle, compreso quelle nidificate.
In alternativa è possibile utilizzare il parametro “-a” , che è un parametro combinato; significa “archivio” e sincronizza ricorsivamente, preservando links simbolici, file speciali e di periferiche, tempi di modifica, gruppi, proprietari e permessi.
E’ più comunemente utilizzato rispetto a -r , ed è ordinariamente ciò che probabilmente serve a chi vuole utilizzare rsync.

rsync -a dir1/ dir2

Nota importante
Si noti che è stata posta una barra terminale obliqua (“slash”) alla fine del primo argomento del comando appena citato (cfr dir1/ )
Il significato di tale slash è “il contenuto dell’argomento”, in questo caso della cartella dir1 ; così facendo, il contenuto di dir1 viene sincronizzato entro dir2 .
In caso la slash non fosse stata posta ( dir1 ) , allora la stessa cartella dir1 sarebbe stata sincronizzata entro dir2 , creando una gerarchia del tipo:
~/dir2/dir1/[files]

E’ importante ricontrollare sempre gli argomenti prima di eseguire un comando rsync. Esiste un metodo che permette di prevenire gli errori, ed è quello di inserire l’opzione “-n” oppure “–dry-run”.

L’opzione “-v”  (verbose, cioè descrittiva) è necessaria per ottenere un output descrittivo delle operazioni compiute:

rsync -anv dir1/ dir2

Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .

Se si compara questo output con quello che si ottiene senza la slash al termine del primo argomento si ha:

rsync -anv dir1 dir2

Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .

Si può qui vedere che è stata trasferita la cartella stessa, e non solo i files contenuti, creando una sottogerarchia.

Come utilizzare rsync per sincronizzare con un sistema remoto
Sincronizzare con un sistema remoto è semplice se si ha accesso SSH alla macchina remota e rsync installato su entrambe. Ci sono due possibilità: si può effettuare l’accesso direttamente mediante il comando rsync con opportuni parametri, oppure effettuare preliminarmente l’accesso via SSH e poi inviare i comandi rsync.
In entrambi i casi, una volta effettuato l’accesso SSH tra le due macchine, è possibile sincronizzare la cartella dir1 dal computer locale a quello remoto effettuando un’operazione di “spinta” (“push”), poiché spinge una directory dal sistema locale a quello remoto, usando la seguente sintassi (notare che in questo caso la mancanza della slash finale al primo argomento è voluta, perché vogliamo trasferire direttamente la directory):

Senza accesso preliminare
rsync -avzhe ssh local_directory username@remote_host:destination_directory
   
ad es:
rsync -avzhe ssh ~/dir1/ root@192.168.0.100:/root/dir1

Con accesso preliminare
rsync -avzh ~/dir1 username@remote_host:destination_directory

ad es:
rsync -avzh ~/dir1/ root@192.168.0.100:/root/dir1

L’operazione opposta, cioè sincronizzare una directory remota con il sistema locale, è chiamata di “tiro” (“pull”). Se la directory dir1 si trova nel sistema remoto anziché in quello locale, la sintassi sarà:

Senza accesso preliminare
rsync -avzhe ssh username@remote_host:destination_directory/ local_directory
   
ad es:
rsync -avzhe ssh root@192.168.0.100:/root/dir1/ ~/dir1

Con accesso preliminare
rsync -avzh username@remote_host:destination_directory/  local_directory

ad es:
rsync -avzh  root@192.168.0.100:/root/dir1/ ~/dir1

Come cp ed altri tools similari, la sorgente è sempre il primo argomento, e la destinazione è sempre il secondo.

Opzioni utili di rsync
rsync ha a disposizione molte opzioni per modificare il suo comportamento di base, e le opzioni viste in precedenza ne sono un esempio tra le più utilizzate.
Se si vogliono trasferire files non compressi, come files di testo, è possibile ridurre il carico di rete nel trasferimento aggiungendo la compressione mediante l’opzione “-z”:

rsync -az source destination

L’opzione “-P” è particolarmente utile, poiché unisce l’opzione “-progress”, che mostra una barra progressiva durante il trasferimento, e l’opzione “--partial”, che consente di riprendere trasferimenti interrotti:

rsync -azP source destination

Output
sending incremental file list
./
file1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file100
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101)
file11
           0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101)
. . .

Se si da nuovamente il comando, si otterrà un output breve, perché non sono stati fatti cambiamenti. Questo dimostra la capacità di rsync di utilizzare la data ed ora di modifica per determinare, fra due files, se sono stati effettuati dei cambiamenti:

rsync -azP source destination

Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00


E’ possibile aggiornare la data ed ora di modifica di alcuni files, e verificare che rsync, in modo intelligente, copia solo i files modificati:

touch dir1/file{1..10}

rsync -azP source destination

Output
sending incremental file list
file1
            0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
            0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file2
            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)
file3
            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)
. . .

L’opzione -u o --update permette a rsync di tralasciare files che sono presenti già aggiornati nella directory di destinazione

rsync -azuP source destination

Al fine di tenere due directory davvero in sincronia, è necessario cancellare files dalla directory di destinazione, se questi sono stati rimossi dalla directory sorgente. Come impostazione di base, rsync non cancella nulla nella directory di destinazione.
E’ possibile modificare questo aspetto con l’opzione “--delete”. Prima di utilizzarla, è bene utilizzare l’opzione --dry-run per verificare quali cambiamenti verranno apportati e prevenire la perdita di dati:

rsync -a --delete source destination

Se si vuole escludere alcuni files o cartelle presenti all’interno della directory che si sta sincronizzando, lo si può fare specificandoli in una lista, separata da virgole, descritta con l’opzione “--exclude=”:

rsync -a --exclude=pattern_to_exclude source destination

Se è possibile specificare un percorso da escludere, è anche possibile ignorare tale esclusione per files che appartengono ad un percorso differente utilizzando l’opzione “--include=”.

rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

Per ultima, l’opzione “--backup” può essere utilizzata per archiviare il backup di files importanti, in congiunzione con l’opzione “--backup-dir”, che specifica la directory dove il files di backup devono essere archiviati.

rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

Conclusioni
rsync può semplificare trasferimenti di file attraverso connessioni di rete ed aggiungere solidità a sincronizzazioni tra directory locali. La sua flessibilità la rende un’ottima soluzione per molte operazioni di differente livello di complessità.
Un’adeguata padronanza di rsync consente di progettare complesse operazioni di backup ed ottenere un controllo di elevata precisione su ciò che viene trasferito e come.


Riassunto delle opzioni principali

(N.B. come si nota, le opzioni gestite da una sola lettera vanno precedute da un unico segno meno, mentre le opzioni verbali (una o più parole separate da un segno meno) vanno precedute da un DOPPIO segno meno.)

-r : ricorsivo, necessaria per sincronizzare il contenuto delle cartelle, compreso quelle nidificate
-a : archivio, parametro combinato; sincronizza ricorsivamente, preservando links simbolici, file speciali e di periferiche, tempi di modifica, gruppi, proprietari e permessi.
-n : oppure –dry-run, agisci senza fare; mostra le operazioni senza eseguirle realmente
-v : verbose, cioè descrittivo
-z : compressione, comprime i file prima di effettuare la transazione
-u : oppure –update, aggiornamento;tralascia i files che sono presenti già aggiornati nella directory di destinazione
--progress : progressione; consente il controllo del progresso del trasferimento, mostrando i files trasferiti ed il tempo restante al completamento dell’operazione.
--partial : parziale; permette di riprendere sincronizzazioni interrotte
-P : progressione+parziale; unisce l’opzione “-progress” con l’opzione “--partial”
--delete : cancellazione; cancella files dalla directory di destinazione (di default rsync non lo fa) (conviene eseguire prima --dry-run)
--exclude=lista directory separata da virgole; esclusione; esclude alcuni files o cartelle presenti all’interno della directory che si sta sincronizzando
--include=lista directory separata da virgole; inclusione; include alcuni files o cartelle escluse o presenti all’esterno della directory che si sta sincronizzando
--backup : backup di files importanti, in congiunzione con l’opzione –backup-dir , che specifica la directory dove i files di backup devono essere archiviati.

–max-size=’200k’ : dimensione massima dei file da trasferire; consente di stabilire un limite dimensionale ad ogni file trasferito, non trasferendo file che superino tale soglia (nell’esempio 200 kb)
--remove-source-files : rimuove automaticamente al termine del trasferimento i file SORGENTE (!!!) trasferiti
--bwlimit=100 : limite di banda da utilizzare; utilizzabile durante le operazioni di trasferimento files (nell’esempio 100 bytes/sec)
-h : human-readable, intelligibile dall'uomo; mostra gli output numerici in formato leggibile

Comando standard con verifica senza scrittura

rsync -anvzuP -–delete source/ destination

Comando finale dopo verifica

rsync -avzuP –-delete source/ destination

Nessun commento:

Posta un commento