Introduzione
Rsync, che sta per sincronizzazione remota, è uno strumento di sincronizzazione di file remoto e locale. Utilizza un algoritmo per ridurre al minimo la quantità di dati copiati spostando solo le porzioni di file che sono cambiate.
In questo tutorial, definiremo Rsync, esamineremo la sintassi quando si utilizza rsync
, spiegheremo come utilizzare Rsync per sincronizzare con un sistema remoto e le altre opzioni disponibili.
Implementa le tue applicazioni frontend da GitHub utilizzando DigitalOcean App Platform. Lascia che DigitalOcean si concentri sulla scalabilità della tua app.
Prerequisiti
Per praticare l’uso di rsync
per sincronizzare i file tra un sistema locale e remoto, avrai bisogno di due macchine che fungano da computer locale e remoto, rispettivamente. Queste due macchine potrebbero essere server virtuali privati, macchine virtuali, container o computer personali purché siano state configurate correttamente.
Se hai intenzione di seguire questa guida usando server, sarebbe prudente configurarli con utenti amministrativi e configurare un firewall su ciascuno di essi. Per configurare questi server, segui la nostra Guida alla Configurazione Iniziale del Server.
Indipendentemente dal tipo di macchine che utilizzi per seguire questo tutorial, dovrai aver creato le chiavi SSH su entrambe. Quindi, copia la chiave pubblica di ciascun server nel file authorized_keys
dell’altro server come indicato nel Passaggio 2 di quella guida.
Questa guida è stata validata su macchine con Ubuntu 20.04, anche se dovrebbe funzionare in generale con qualsiasi computer che esegue un sistema operativo basato su Linux e ha rsync
installato.
Definizione di Rsync
Rsync è un tool di sincronizzazione molto flessibile abilitato per la rete. Grazie alla sua ubiquità su sistemi Linux e simili a Unix e alla sua popolarità come strumento per script di sistema, è incluso nella maggior parte delle distribuzioni Linux per impostazione predefinita.
Comprensione della Sintassi di Rsync
La sintassi per rsync
funziona in modo simile ad altri strumenti, come ssh
, scp
e cp
.
Prima, cambia nella tua directory home eseguendo il seguente comando:
Poi crea una directory di test:
Crea un’altra directory di test:
Ora aggiungi alcuni file di test:
Adesso c’è una directory chiamata dir1
con 100 file vuoti al suo interno. Conferma elencando i file:
Outputfile1 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
Hai anche una directory vuota chiamata dir2
. Per sincronizzare i contenuti di dir1
su dir2
sullo stesso sistema, eseguirai rsync
e userai il flag -r
, che sta per “ricorsivo” ed è necessario per la sincronizzazione delle directory:
Un’altra opzione è usare il flag -a
, che è un flag combinato e sta per “archivio”. Questo flag sincronizza in modo ricorsivo e conserva i collegamenti simbolici, i file speciali e di dispositivo, i tempi di modifica, i gruppi, i proprietari e le autorizzazioni. È più comunemente usato rispetto a -r
ed è il flag consigliato da utilizzare. Esegui lo stesso comando dell’esempio precedente, questa volta usando il flag -a
:
Si prega di notare che c’è una barra obliqua finale (/
) alla fine del primo argomento nella sintassi dei due comandi precedenti e qui evidenziata:
Questa barra obliqua finale indica i contenuti di dir1
. Senza la barra obliqua finale, dir1
, inclusa la directory, verrebbe collocata all’interno di dir2
. Il risultato creerebbe una gerarchia come la seguente:
~/dir2/dir1/[files]
Un altro suggerimento è quello di controllare due volte i tuoi argomenti prima di eseguire un comando rsync
. Rsync fornisce un metodo per farlo passando le opzioni -n
o --dry-run
. La bandiera -v
, che significa “verbose”, è anche necessaria per ottenere l’output appropriato. Combinerai le bandiere a
, n
e v
nel seguente comando:
Outputsending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
Ora confronta quell’output con quello che ottieni quando rimuovi la barra finale, come nel seguente:
Outputsending 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
. . .
Questo output ora dimostra che la directory stessa è stata trasferita, anziché solo i file all’interno della directory.
Utilizzare Rsync per sincronizzare con un sistema remoto
Per utilizzare rsync
per sincronizzare con un sistema remoto, è sufficiente avere l’accesso SSH configurato tra la tua macchina locale e remota, oltre a rsync
installato su entrambi i sistemi. Una volta verificato l’accesso SSH tra le due macchine, puoi sincronizzare la cartella dir1
dalla sezione precedente su una macchina remota utilizzando la seguente sintassi. Si prega di notare in questo caso che si desidera trasferire la directory effettiva, quindi si ometterà la barra finale:
Questo processo è chiamato operazione push perché “spinge” una directory dal sistema locale a un sistema remoto. L’operazione opposta è il pull, ed è utilizzata per sincronizzare una directory remota sul sistema locale. Se la directory dir1
fosse sul sistema remoto invece che sul sistema locale, la sintassi sarebbe la seguente:
Come cp
e strumenti simili, la sorgente è sempre il primo argomento e la destinazione è sempre il secondo.
Utilizzo di Altre Opzioni di Rsync
Rsync fornisce molte opzioni per modificare il comportamento predefinito dell’utilità, come le opzioni flag che hai appreso nella sezione precedente.
Se stai trasferendo file che non sono già stati compressi, come file di testo, puoi ridurre il trasferimento di rete aggiungendo la compressione con l’opzione -z
:
Il flag -P
è anche utile. Combina i flag --progress
e --partial
. Il primo flag fornisce una barra di avanzamento per i trasferimenti, e il secondo flag ti consente di riprendere i trasferimenti interrotti:
Outputsending incremental file list
created directory destination
source/
source/file1
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=99/101)
sourcefile10
0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=98/101)
source/file100
0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=97/101)
source/file11
0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=96/101)
source/file12
0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=95/101)
. . .
Se esegui nuovamente il comando, riceverai un output abbreviato poiché non sono state apportate modifiche. Questo illustra la capacità di Rsync di utilizzare i tempi di modifica per determinare se sono state apportate modifiche:
Outputsending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
Immagina di aggiornare il tempo di modifica su alcuni dei file con un comando simile al seguente:
Quindi, se esegui rsync
con -azP
di nuovo, noterai nell’output come Rsync ricopia intelligentemente solo i file modificati:
Outputsending 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)
. . .
Per mantenere due directory veramente sincronizzate, è necessario eliminare i file dalla directory di destinazione se vengono rimossi dalla sorgente. Per impostazione predefinita, rsync
non elimina nulla dalla directory di destinazione.
Puoi cambiare questo comportamento con l’opzione --delete
. Prima di utilizzare questa opzione, puoi usare -n
, l’opzione --dry-run
, per eseguire un test e evitare perdite di dati indesiderate:
Se preferisci escludere determinati file o directory situati all’interno di una directory che stai sincronizzando, puoi farlo specificandoli in un elenco separato da virgole seguendo l’opzione --exclude=
:
Se hai un pattern specificato da escludere, puoi sovrascrivere tale esclusione per i file che corrispondono a un pattern diverso utilizzando l’opzione --include=
:
Infine, l’opzione --backup
di Rsync può essere utilizzata per memorizzare backup di file importanti. Viene utilizzata in combinazione con l’opzione --backup-dir
, che specifica la directory in cui devono essere memorizzati i file di backup:
Conclusione
Rsync può ottimizzare i trasferimenti di file su connessioni di rete e aggiungere robustezza alla sincronizzazione delle directory locali. La flessibilità di Rsync lo rende una buona opzione per molte diverse operazioni a livello di file.
A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.