Sari la conținut

Acasă › Blog › Ghid complet pentru comenzile rsync în Linux

Ghid complet pentru comenzile rsync în Linux

10 august 2025 · , specialist în servicii SEO din 2007 · Linux

Ghid complet pentru comenzile rsync în Linux

Ghid complet pentru comenzile rsync în Linux, unealta cu care mutăm site-uri între servere, facem copii de siguranță zilnice și publicăm modificări de cod fără să retransmitem fișiere neschimbate. rsync compară sursa cu destinația și trimite doar diferențele, prin SSH sau local, păstrând permisiunile, proprietarii și datele fișierelor. Este instalat implicit pe aproape orice distribuție.

Ghidul pornește de la sintaxa de bază, trece prin opțiunile pe care le folosim zilnic, apoi prin scenariile de lucru și prin greșelile cu care am pierdut, la un moment dat, fișiere. Comenzile sunt valabile pentru rsync 3.1 și mai nou, cel din Ubuntu 22.04, 24.04 și AlmaLinux 9.

Ghid complet pentru comenzile rsync în Linux

Sintaxa și capcana slash-ului

rsync [opțiuni] sursă destinație
rsync -av /var/www/site/ /backup/site/     # conținutul lui site în backup/site
rsync -av /var/www/site  /backup/          # dosarul site, creat în backup/site

Diferența dintre cele două comenzi este slash-ul final după sursă. Cu slash, rsync copiază conținutul dosarului; fără slash, copiază dosarul însuși, ca subdosar al destinației. Este prima cauză a structurilor duplicate de tip backup/site/site. La destinație slash-ul nu contează. Regula pe care o folosim: punem slash la ambele, întotdeauna, și verificăm cu -n înainte.

Opțiunile de bază

  • -a (archive): recursiv, cu păstrarea permisiunilor, proprietarilor, grupurilor, datelor și legăturilor simbolice. Este echivalentul lui -rlptgoD și opțiunea pe care o puneți aproape întotdeauna.
  • -v (verbose): afișează fișierele transferate; -vv și mai mult.
  • -z: comprimă datele în tranzit; util prin internet, inutil local sau pentru fișiere deja comprimate (imagini, arhive, video).
  • -h: dimensiuni lizibile (MB, GB).
  • -P: combinația --partial --progress; păstrează fișierele transferate parțial la întrerupere și afișează progresul pe fiecare fișier.
  • -n sau --dry-run: simulează, fără să scrie nimic. Cu -v, arată exact ce ar face.
rsync -avhP -n /var/www/site/ utilizator@server:/var/www/site/   # simulare
rsync -avhP /var/www/site/ utilizator@server:/var/www/site/      # transferul real

Transferul prin SSH

rsync folosește SSH implicit pentru destinațiile de forma utilizator@gazdă:cale. Portul, cheia și alte opțiuni SSH se dau prin -e:

rsync -avz -e "ssh -p 2200 -i ~/.ssh/cheie-server" /date/ admin@203.0.113.7:/backup/date/
rsync -avz admin@203.0.113.7:/var/www/site/ /local/site/       # și în sens invers

Ambele capete trebuie să aibă rsync instalat; dacă lipsește pe server, comanda eșuează cu „rsync: command not found” în partea de la distanță. Autentificarea cu chei, descrisă în ghidul despre utilizatorii cu acces limitat, permite rularea din cron fără parolă.

Excluderi și filtre

Un site are dosare care nu trebuie copiate: cache, jurnale, fișiere temporare, dosarul .git. Opțiunea --exclude acceptă modele, iar --exclude-from citește o listă dintr-un fișier:

rsync -av --exclude 'cache/' --exclude '*.log' --exclude '.git/' /var/www/site/ /backup/site/
rsync -av --exclude-from=/etc/rsync-excluderi.txt /var/www/site/ /backup/site/

Modelele se raportează la rădăcina transferului: cache/ exclude orice dosar numit cache, oriunde; /cache/ exclude doar pe cel din rădăcină. --include se folosește împreună cu --exclude pentru a copia doar anumite tipuri, de exemplu doar fișierele PHP, cu ordinea regulilor contând: prima regulă care se potrivește câștigă.

rsync -av --include '*/' --include '*.php' --exclude '*' /var/www/site/ /revizie/site/

Ștergerea la destinație

Implicit, rsync nu șterge nimic: fișierele care au dispărut din sursă rămân la destinație. Pentru o oglindă exactă, --delete le șterge. Este opțiunea cu care se pierd date, deci regulile noastre:

  1. Niciodată --delete fără un -n înainte, în aceeași sesiune, cu aceleași căi.
  2. Niciodată --delete spre un dosar de producție dintr-o sursă care ar putea fi incompletă (un dosar local montat de pe o rețea căzută arată gol, iar rsync ar șterge tot la destinație).
  3. --delete doar spre copii de siguranță, cu --backup și --backup-dir, ca fișierele șterse să fie mutate, nu distruse.
rsync -av --delete --backup --backup-dir=/backup/sterse-$(date +%F) /var/www/site/ /backup/site/

Opțiunea --max-delete=100 oprește transferul dacă ar șterge mai mult de 100 de fișiere, o plasă de siguranță ieftină pentru scripturile din cron.

Reluare, limitare, verificare

Un transfer de zeci de GB prin internet se întrerupe. Cu --partial (inclus în -P), fișierul parțial rămâne și la rularea următoare se continuă de unde a rămas. --append-verify reia și verifică fișierele mari incomplete. Viteza se limitează cu --bwlimit, în KB/s, ca transferul să nu sufoce serverul în timpul zilei:

rsync -avP --bwlimit=20000 /arhive/ admin@server:/arhive/   # maximum ~20 MB/s

Implicit, rsync decide ce s-a schimbat după dimensiune și dată. Opțiunea -c (checksum) compară conținutul fiecărui fișier, mai lent, dar sigur când datele fișierelor nu sunt de încredere, de exemplu după o restaurare din arhivă. Pentru o verificare finală a unei copii, comanda cu -avnc și --delete listează orice diferență fără să o corecteze.

Scenarii de lucru

Copie de siguranță zilnică, cu istoric

Opțiunea --link-dest creează instantanee zilnice în care fișierele neschimbate sunt legături fizice spre copia de ieri: fiecare instantaneu arată ca o copie completă, dar ocupă doar spațiul diferențelor.

AZI=/backup/site/$(date +%F); IERI=$(ls -d /backup/site/20* | tail -n 1)
rsync -a --delete --link-dest="$IERI" /var/www/site/ "$AZI/"

Scriptul complet, cu baza de date, rotație și trimitere pe alt server, este în ghidul despre copiile de siguranță automate cu cron și rsync.

Publicarea codului pe server

Din dosarul de lucru spre server, fără fișierele de dezvoltare și fără să atingeți dosarele de încărcări ale utilizatorilor:

rsync -avz --delete --exclude '.git/' --exclude 'node_modules/' --exclude 'storage/' --exclude '.env' \
  ./ deploy@server:/var/www/aplicatie/

Dosarul storage și fișierul .env există doar pe server și sunt excluse, ca --delete să nu le șteargă. După transfer, permisiunile se verifică după regulile din ghidul despre chmod și chown; rsync rulat ca alt utilizator decât proprietarul poate schimba proprietarul fișierelor noi.

Mutarea unui site între servere

Prima rulare copiază tot, cu site-ul vechi încă activ. În ziua mutării, a doua rulare transferă doar ce s-a schimbat, în minute, iar site-ul vechi se oprește abia după ea. Pașii, inclusiv baza de date și DNS-ul, sunt în ghidul despre migrarea unui website folosind cPanel și în cel despre migrarea unui site WordPress.

Copiere de pe Windows sau de pe un disc extern

Sistemele de fișiere FAT și NTFS montate în Linux nu păstrează permisiunile și proprietarii Linux. Cu -a, rsync încearcă să le seteze și afișează erori la fiecare fișier. Folosiți -rtv în loc de -a și, spre un server, --chmod pentru permisiuni corecte la destinație:

rsync -rtv --no-owner --no-group --chmod=D755,F644 /mnt/disc/site/ admin@server:/var/www/site/

Sincronizare în ambele sensuri

rsync sincronizează într-un singur sens: sursa are dreptate, destinația se aliniază. Pentru două dosare modificate în ambele locuri (doi colegi care lucrează pe același site), rsync nu știe ce e mai nou decât prin data fișierului, iar cu --delete ar șterge ce a adăugat celălalt. Soluția corectă este un sistem de control al versiunilor pentru cod și un singur punct de adevăr pentru fișierele încărcate; rsync rămâne unealta care duce codul din depozit pe server, nu între colegi.

Rularea din cron, corect

Un rsync programat are nevoie de trei lucruri pe care le uită scripturile scrise în grabă: o cheie SSH fără parolă, cu drepturi doar pe dosarul de destinație; un jurnal cu --log-file, ca să vedeți ce s-a întâmplat noaptea; și o încuietoare, ca două rulări să nu se suprapună când transferul durează mai mult decât intervalul. Utilitarul flock face încuietoarea într-o singură linie:

0 3 * * * flock -n /tmp/rsync-site.lock rsync -a --delete --log-file=/var/log/rsync-site.log /var/www/site/ backup@server:/backup/site/

Dacă rularea anterioară încă merge, flock -n renunță imediat, iar jurnalul de cron o arată. Verificați o dată pe săptămână că jurnalul are rânduri noi și că dimensiunea copiei crește odată cu site-ul; un rsync care „reușește” cu 0 fișiere transferate timp de o lună este semnul unei chei expirate sau al unei surse goale.

Opțiuni pe care le veți căuta

  • --update: nu suprascrie fișierele mai noi la destinație.
  • --ignore-existing: copiază doar fișierele care lipsesc la destinație, fără să atingă nimic existent.
  • --size-only: compară doar dimensiunea, util când datele au fost schimbate de un transfer anterior.
  • --itemize-changes (-i): afișează, pentru fiecare fișier, ce anume diferă (conținut, dată, permisiuni).
  • --stats: rezumat la final cu numărul de fișiere și octeții transferați efectiv.
  • --log-file=cale: jurnal complet, obligatoriu pentru rulările din cron.
  • --timeout=60: oprește un transfer blocat de o conexiune moartă.
  • --rsync-path="sudo rsync": rulează rsync cu sudo pe server, pentru fișiere ale altor utilizatori.

Greșeli pe care le-am făcut sau le-am văzut

  • Sursa și destinația inversate: rsync -av --delete /backup/site/ /var/www/site/ a suprascris producția cu copia de acum două zile. Citiți comanda de două ori; cu -n, de trei.
  • --delete cu sursa pe un disc nemontat: dosarul de montare gol a fost tratat ca sursă goală. Verificați montarea în script (mountpoint -q /mnt/date || exit 1).
  • Rulare ca root cu -a de pe un server pe altul: fișierele au ajuns cu id-uri numerice de utilizator care nu existau la destinație. Folosiți --chown=utilizator:grup sau un chown după.
  • Copierea unei baze de date „la cald”: fișierele MySQL copiate în timp ce serverul scrie sunt inconsistente. Exportați cu mysqldump și copiați exportul.
  • Excluderi scrise cu cale absolută (--exclude /var/www/site/cache): modelul se raportează la rădăcina transferului, deci nu se potrivește cu nimic și dosarul se copiază.

Pentru verificarea consumului în timpul transferurilor mari, htop și atop arată dacă limita este discul, procesorul (compresia) sau rețeaua. Iar când rsync nu este disponibil la unul dintre capete, de exemplu pe o găzduire partajată fără SSH, alternativa rămâne SFTP, mai lent, dar cu aceleași rezultate.

Surse

Cum a fost realizat acest articol

Autor
Publicat
10 august 2025
Ultima actualizare
9 septembrie 2026
Surse

Lucrăm după principiile noastre de publicare, politica pentru corectare, politica pentru etică.

Articole similare