Article original: How To Use Rsync to Sync Local and Remote Directories

Traduït per retiolus, útlima actualització: 2023-04-14


Introducció Link to heading

Rsync, que significa sincronització remota, és una eina de sincronització de fitxers remota i local. Utilitza un algorisme per minimitzar la quantitat de dades copiades movent només les parts dels fitxers que han canviat.

En aquest tutorial, definirem Rsync, revisarem la sintaxi al utilitzar rsync, explicarem com utilitzar Rsync per sincronitzar amb un sistema remot i altres opcions disponibles.

Requisits previs Link to heading

Per practicar l’ús de `rsync per sincronitzar fitxers entre un sistema local i remot, necessites dues màquines que actuïn com a ordinador local i com a màquina remota, respectivament. Aquestes dues màquines podrien ser servidors privats virtuals, màquines virtuals, contenidors o ordinadors personals sempre que s’hagin configurat correctament.

Si tens previst seguir aquesta guia utilitzant servidors, seria prudent configurar-los amb usuaris administratius i configurar un tallafoc a cadascun d’ells. Per configurar aquests servidors, segueix la nostra Guia de configuració inicial del servidor.

Independentment dels tipus de màquines que utilitzis per seguir aquest tutorial, hauràs d’haver creat claus SSH en totes dues. A continuació, copia la clau pública de cada servidor al fitxer authorized_keys de l’altre servidor, tal com es descriu al segon pas d’aquesta guia.

Aquesta guia s’ha validat en màquines amb Ubuntu 20.04, tot i que, en general, hauria de funcionar amb qualsevol ordinador amb un sistema operatiu basat en Linux que tingui instal·lat rsync.

Definició de Rsync Link to heading

Rsync és una eina de sincronització de xarxa molt flexible. A causa de la seva ubiqüitat en sistemes Linux i similars a Unix i la seva popularitat com a eina per als scripts del sistema, s’inclou a la majoria de distribucions de Linux de manera predeterminada.

Entendre la sintaxi de Rsync Link to heading

La sintaxi per a rsync és similar a altres eines, com ara ssh, scp i `cp.

Primer, canvia al teu directori d’inici executant l’ordre següent:

$ cd ~

A continuació, crea un directori de prova:

$ mkdir dir1

Crea un altre directori de prova:

$ mkdir dir2

Ara afegeix alguns fitxers de prova:

$ touch dir1/fitxer{1..100}

Ara existeix un directori anomenat `dir1 amb 100 fitxers buits. Confirma enumerant els fitxers:

$ 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

També tens un directori buit anomenat dir2. Per sincronitzar el contingut de dir1 amb dir2 al mateix sistema, executaràs rsync i utilitzaràs l’argument -r, que significa “recursiu” i és necessari per a la sincronització de directoris:

$ rsync -r dir1/ dir2

Una altra opció és utilitzar l’argument -a, que és un indicador de combinació i significa “arxiu”. Aquesta argument sincronitza de forma recursiva i conserva els enllaços simbòlics, els fitxers especials i de dispositius, els temps de modificació, els grups, els propietaris i els permisos. S’utilitza més habitualment que -r i és l’argument recomenat a utilitzar. Executa la mateixa ordre que l’exemple anterior, aquesta vegada utilitzant el senyalador -a:

$ rsync -a dir1/ dir2

Tingues en compte que hi ha una barra inclinada (/) al final del primer argument a la sintaxi de les dues ordres anteriors i es destaquen aquí:

$ rsync -a dir1[/] dir2

Aquesta barra inclinada al final indica el contingut de dir1. Sense la barra inclinada al final, dir1, inclòs el directori, es col·locaria dins de `dir2. El resultat crearia una jerarquia com la següent:

~/dir2/dir1/[fitxers]

Un altre consell és revisar els teus arguments abans d’executar una ordre rsync. Rsync proporciona un mètode per fer-ho passant les opcions -n o --dry-run. L’argument -v, que significa “verbositat”, també és necessari per obtenir la sortida adequada. Combinaràs les marques a, n i v a la següent comanda:

$ rsync -anv dir1/ dir2

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

Ara compara aquesta sortida amb la que rebs en eliminar la barra inclinada final, com es mostra a continuació:

$ 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
. . .

Aquesta sortida demostra ara que s’ha transferit el directori en si, en lloc de només els fitxers del directori.

Utilitzar Rsync per sincronitzar amb un sistema remot Link to heading

Per utilitzar rsync per sincronitzar-se amb un sistema remot, només necessites l’accés SSH configurat entre les teves màquines locals i remotes, així com rsync instal·lat als dos sistemes. Un cop hàgis verificat l’accés SSH entre les dues màquines, pots sincronitzar la carpeta dir1 de la secció anterior amb una màquina remota mitjançant la sintaxi següent. Tingues en compte, en aquest cas, que vols transferir el directori real, de manera que ometràs la barra inclinada final:

$ rsync -a ~/dir1 [usuari]@[amfitrió_remot]:[directori_destinació]

Aquest procés s’anomena operació push perquè “envia” un directori del sistema local a un sistema remot. L’operació oposada és pull, i s’utilitza per sincronitzar un directori remot amb el sistema local. Si el directori dir1 estigués al sistema remot en lloc del teu sistema local, la sintaxi seria la següent:

$ rsync -a [usuari]@[amfitrió_remot]:[/home/usuari/dir1] [lloc_per_sincronitzar_a_màquina_local]

Igual que cp i eines similars, la font sempre és el primer argument i la destinació sempre és el segon.

Ús d’altres opcions de Rsync Link to heading

Rsync ofereix moltes opcions per alterar el comportament predeterminat de la utilitat, com ara els arguments has après a la secció anterior.

Si estàs transferint fitxers que encara no s’han comprimit, com ara fitxers de text, pots reduir la transferència de xarxa afegint compressió amb l’argument -z:

$ rsync -az [origen] [destí]

L’argument -P també és útil. Combina els arguments --progress i --partial. Aquest primer indicador proporciona una barra de progrés per a les transferències, i el segon indicador et permet reprendre les transferències interrompudes:

$ rsync -azP [origen] [destí]

Output
sending 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)
. . .

Si tornes a executar l’ordre, rebràs una sortida escurçada ja que no s’han fet canvis. Això il·lustra la capacitat de Rsync d’utilitzar els temps de modificació per determinar si s’han fet canvis:

$ rsync -azP [origen] [destí]

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

Suposem que has d’actualitzar l’hora de modificació d’alguns dels fitxers amb una ordre com la següent:

$ touch dir1/fitxer{1..10}

Aleshores, si tornes a executar rsync amb -azP, notaràs a la sortida com Rsync torna a copiar de manera intel·ligent només els fitxers modificats:

$ rsync -azP [origen] [destí]

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)
. . .

Per mantenir dos directoris realment sincronitzats, cal esborrar fitxers del directori de destinació si s’eliminen de l’origen. Per defecte, rsync no elimina res del directori de destinació.

Pots canviar aquest comportament amb l’opció --delete. Abans d’utilitzar aquesta opció, pots utilitzar -n, l’opció --dry-run, per realitzar una prova per evitar la pèrdua de dades no desitjada:

$ rsync -an --delete [origen [destí]

Si prefereixes excloure determinats fitxers o directoris situats dins d’un directori que estàs sincronitzant, pots fer-ho especificant-los en una llista separada per comes seguint l’opció --exclude=:

$ rsync -a --exclude=[patró_per_excloure] [origen] [destí]

Si tens un patró especificat per excloure, pots anul·lar aquesta exclusió per als fitxers que coincideixin amb un patró diferent mitjançant l’opció --include=:

$ rsync -a --exclude=[patró_per_excloure] --include=[patró_per_incloure] [origen] [destí]

Finalment, l’opció --backup de Rsync es pot utilitzar per emmagatzemar còpies de seguretat dels fitxers importants. S’utilitza juntament amb l’opció --backup-dir, que especifica el directori on s’han d’emmagatzemar els fitxers de còpia de seguretat:

$ rsync -a --delete --backup --backup-dir=[/path/to/backups] [/path/to/source] [destí]

Conclusió Link to heading

Rsync pot agilitzar les transferències de fitxers a través de connexions de xarxa i afegir robustesa a la sincronització de directoris locals. La flexibilitat de Rsync el converteix en una bona opció per a moltes operacions diferents a nivell de fitxer.

Un domini de Rsync et permet dissenyar operacions de còpia de seguretat complexes i obtenir un control detallat sobre com i què es transfereix.