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