Gabay

rsync: mga halimbawa ng pag-sync ng file at backup sa Linux

Na-update: · Skillaria.Top

Kinokopya at isinasi-sync ng rsync ang mga file nang lokal at sa pamamagitan ng SSH, at ipinapadala lamang nito ang mga pagbabago. Ang pangunahing command ay rsync -avz pinagmulan/ user@host:/landas/: ang -a ay nagpapanatili ng permission at oras, ang -v ay nagpapakita ng mga file, ang -z ay nagko-compress ng trapiko; ginagawa ng --delete na eksaktong kopya ng pinagmulan ang destinasyon, at ang -n ay nagbibigay-daan na suriin muna ang resulta nang walang pagbabago.

Ang rsync ay ang standard na tool sa Linux para sa pagkopya at pag-sync ng file: lokal, sa pagitan ng mga disk, at sa pagitan ng mga server sa pamamagitan ng SSH. Ang pangunahing pagkakaiba nito sa cp at scp ay ipinapadala lamang nito ang nagbago, kaya ilang segundo lang ang paulit-ulit na pag-sync ng malaking direktoryo. Sa ibaba ang mga rsync halimbawa para sa karaniwang gawain: pagkopya ng proyekto sa server, mirror ng direktoryo, mga exclude, backup na may snapshot, at pagpapatakbo ayon sa iskedyul.

Syntax at ang pinakakailangang mga flag

Ang pangkalahatang anyo ng command:

rsync [opsyon] PINAGMULAN... DESTINASYON

Ang pinagmulan at destinasyon ay maaaring lokal na path o malayong path sa anyong user@host:/landas. Kailangang lokal ang isa sa dalawang panig: hindi direktang nagkokopya ang rsync sa pagitan ng dalawang malayong makina.

FlagAno ang ginagawa
-aarchive mode: recursive, pinananatili ang permission, owner, group, oras ng pagbabago at symbolic link (katumbas ng -rlptgoD)
-vipakita ang listahan ng mga file na ipinapadala
-zi-compress ang data habang ipinapadala sa network
-hsukat na madaling basahin (K, M, G)
-Pkapareho ng --partial --progress: progress at pagpapatuloy ng naputol na file
-n, --dry-runpagsubok na takbo: ipakita kung ano ang gagawin, nang hindi nagbabago ng anuman
--deleteburahin sa destinasyon ang mga file na wala sa pinagmulan
--excludehuwag kopyahin ang mga file na tumutugma sa pattern
-etukuyin ang remote shell, halimbawa -e "ssh -p 2222"
-H, -A, -Xpanatilihin ang hard link, ACL at extended attributes (hindi kasama sa -a)

Sa praktika, sapat na sa siyam sa sampung kaso ang rsync -avh para sa lokal at rsync -avzh para sa network.

Slash sa dulo ng path: ang pangunahing bitag

Ang pinakakaraniwang pagkakamali ng mga baguhan ay ang slash sa dulo ng pinagmulan. Dito nakasalalay kung ang mismong direktoryo ang makokopya o ang laman lamang nito.

# Kopyahin ang DIREKTORYONG project sa loob ng /backup → magiging /backup/project/...
rsync -av project /backup/

# Kopyahin ang LAMAN ng project sa /backup → lalabas ang mga file mismo sa /backup/
rsync -av project/ /backup/

Madaling tandaan: ang slash sa dulo ng pinagmulan ay nangangahulugang "ang laman ng direktoryong ito". Sa destinasyon, walang epekto ang slash. Kung nag-aalinlangan ka, idagdag ang -n at tingnan kung anong mga path ang balak gawin ng rsync.

Lokal na pagkopya

Kopyahin ang direktoryo sa external disk na may progress:

rsync -avhP ~/photos/ /mnt/usb/photos/

Ang pag-uulit ng parehong command ay hindi kinokopya ulit ang lahat: ikinukumpara ng rsync ang laki at oras ng pagbabago ng mga file, at ipinapadala lamang ang bago at nagbagong file. Ipinapakita ng output sa dulo kung gaano karaming data ang talagang naipadala:

sending incremental file list
2026/10/IMG_2041.jpg
          4.12M 100%   38.40MB/s    0:00:00 (xfr#1, to-chk=0/1534)

sent 4.13M bytes  received 9.25K bytes  2.76M bytes/sec
total size is 6.82G  speedup is 1,648.21

Ipinapakita ng speedup kung ilang beses na mas kaunting data ang naipadala kumpara sa buong pagkopya.

rsync sa pamamagitan ng SSH: pagkopya papunta at pabalik sa server

Para sa malayong path, gumagamit ang rsync ng SSH bilang default, kaya walang kailangang espesyal na setup: sapat nang gumagana ang normal na ssh login. Pinakamadali ito gamit ang key, dahil hindi hihingi ng password at maaaring ilagay ang command sa cron.

# I-upload ang site sa server
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/

# I-download ang logs mula sa server papunta sa akin
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/

# SSH sa hindi karaniwang port at may partikular na key
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/

Kailangang naka-install ang rsync sa parehong makina, dahil sa malayong panig ito pinapatakbo sa pamamagitan ng SSH. Kung wala ito roon, makikita mo ang rsync: command not found. I-install ang package (sudo apt install rsync o sudo dnf install rsync).

Kung nakalagay ang host sa ~/.ssh/config bilang alias, naiintindihan ito ng rsync: rsync -avz ./site/ prod:/var/www/site/.

Kailangan ang root na karapatan sa server

Kapag ang mga file sa destinasyon ay pag-aari ng root, pero ang pumapasok ay normal na user, puwedeng patakbuhin ang malayong rsync sa pamamagitan ng sudo:

rsync -avz --rsync-path="sudo rsync" ./conf/ admin@server:/etc/myapp/

Para gumana ito, kailangang walang password ang sudo para sa rsync sa server (sa pamamagitan ng sudoers rule), kung hindi, mag-hang ang command na naghihintay ng input.

Mirror ng direktoryo: --delete

Bilang default, nagdaragdag at nag-a-update lamang ang rsync ng mga file, pero wala itong binubura. Para maging eksaktong kopya ng pinagmulan ang destinasyon, kailangan ang --delete:

rsync -avh --delete ~/projects/ /mnt/backup/projects/

Makapangyarihan at mapanganib ang flag na ito. Ang maling path (halimbawa, walang lamang pinagmulan o nakalimutang slash) ay magbubura ng data sa destinasyon. Kaya iisa ang panuntunan: bawat command na may --delete ay patakbuhin muna nang may -n.

$ rsync -avhn --delete ~/projects/ /mnt/backup/projects/
sending incremental file list
deleting old-app/README.md
deleting old-app/
app/main.py

sent 1.20K bytes  received 64 bytes  2.53K bytes/sec
total size is 18.4M  speedup is 14,554.39 (DRY RUN)

Ipinapakita ng mga linyang deleting ang mga buburahin. Kapag sigurado ka nang tama ang lahat, patakbuhin ito nang walang -n.

May mga kapaki-pakinabang na variation: ang --delete-after ay nagbubura ng mga file pagkatapos ng paglilipat (nananatiling kumpleto ang destinasyon nang mas matagal), at ang --backup --backup-dir=/mnt/backup/deleted-$(date +%F) ay hindi nagbubura kundi inililipat ang mga bubura at papalitan na file sa hiwalay na direktoryo.

Mga exclude: --exclude at --include

Ang pag-exclude ng mga pansamantalang file, dependency at secret ay karaniwang gawain sa deploy at backup.

# Maraming pattern
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/

# Mga pattern mula sa file
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/

Ang file na .rsyncignore ay simpleng listahan ng mga pattern, isa bawat linya:

.git/
node_modules/
*.log
.env
tmp/

Paano gumagana ang mga pattern:

  • Ang pattern na walang slash sa unahan (*.log) ay tumutugma sa anumang lalim.
  • Ang pattern na may slash sa unahan (/tmp/) ay nakatali sa ugat ng paglilipat, kaya ang nasa pinakaitaas na tmp lamang ang maeexclude.
  • Ang slash sa dulo (cache/) ay nangangahulugang "direktoryo lamang".
  • Sinusuri ang mga panuntunan ayon sa pagkakasunod-sunod, at ang unang tumutugma ang nasusunod.

Mula sa huling punto, lumalabas ang teknik ng "kopyahin lamang ang kailangan": unahing payagan, saka ipagbawal ang natitira.

# Kopyahin lamang ang mga .conf file, pinananatili ang istruktura ng direktoryo
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/

Kailangan dito ang --include='*/' para pumasok ang rsync sa lahat ng subdirectory. Idagdag ang --prune-empty-dirs (-m) para hindi gumawa ng walang lamang folder.

Backup gamit ang rsync

Simpleng araw-araw na kopya

Minimal na backup ng home directory papunta sa pangalawang disk:

rsync -aH --delete --exclude='.cache/' /home/alice/ /mnt/backup/alice/

Ang kahinaan ng ganitong paraan ay iisang bersyon lamang ang naiimbak. Kung nasira ang isang file at nakapag-sync na ang backup, mawawala na ang lumang bersyon.

Incremental na snapshot gamit ang --link-dest

Nilulutas ng flag na --link-dest ang problemang ito nang halos walang dagdag na espasyo. Ang mga hindi nagbagong file ay hindi kinokopya, sa halip ay ginagawang hard link mula sa mga file ng nakaraang snapshot. Mukhang buong kopya ang bawat snapshot, pero ang espasyo ay inookupahan lamang ng mga pagbabago.

#!/bin/bash
set -euo pipefail

SRC="/home/alice/"
DEST="/mnt/backup/snapshots"
TODAY="$(date +%F)"

mkdir -p "$DEST"
rsync -aH --delete \
  --exclude='.cache/' \
  --link-dest="$DEST/latest" \
  "$SRC" "$DEST/$TODAY"

ln -sfn "$DEST/$TODAY" "$DEST/latest"

Sa unang takbo, wala pa ang direktoryong latest. Magbibigay ng babala ang rsync at gagawa ng buong kopya, at normal lang iyon. Ang lumang snapshot ay binubura gamit ang karaniwang rm -rf: ang mga file na ginagamit ng ibang snapshot ay hindi mawawala.

Para magbura ng snapshot na mas matanda sa 30 araw:

find /mnt/backup/snapshots -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} +

Backup ng server sa ibang makina

Mas mainam na piliin ang direksiyon na "mula sa backup server papunta sa working server": ang backup machine mismo ang kumukuha ng data, at walang access ang working server sa mga kopya. Kung mahack ang working server, buo pa rin ang mga backup.

rsync -azH --delete -e "ssh -i /root/.ssh/backup_key" \
  backup@web01:/var/www/ /srv/backups/web01/www/

Tandaan na hindi dapat kopyahin nang ganito ang mga database: hindi magkakatugma ang mga file ng tumatakbong DBMS habang kinokopya. Gumawa muna ng dump (mysqldump, pg_dump), at hayaan ang rsync na ilipat ang tapos nang dump file.

Pagpapatakbo ayon sa iskedyul gamit ang cron

Ilagay ang backup script sa cron gamit ang crontab -e:

# Araw-araw sa 03:15, ang output ay mapupunta sa log
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Mga dapat suriin para gumana nang tama ang backup mula sa cron:

  • Gumamit ng absolute path sa script: maliit ang PATH ng cron at iba ang kasalukuyang direktoryo.
  • Walang password ang SSH key, at nasa known_hosts na ang host, kung hindi, mag-hang ang rsync sa tanong tungkol sa authenticity ng key.
  • Sinusuri ng script ang return code: nagbabalik ng 0 ang rsync kapag matagumpay, 23 kung may bahagi ng file na hindi naipasa, at 24 kung nawala ang mga file habang kinokopya.
  • Pinipigilan ng flock ang sabay na pagtakbo ng dalawang kopya: flock -n /tmp/backup.lock /usr/local/bin/backup.sh.

Sa halip na cron, puwede ring gumamit ng systemd timer. Isinusulat nito ang output sa journal, at madali itong tingnan gamit ang journalctl.

Mga kapaki-pakinabang na opsyon para sa malalaking paglilipat

GawainOpsyon
Limitahan ang bilis para hindi mapuno ang channel--bwlimit=5M
Ituloy ang malaking file pagkatapos ng putol-P (o --partial)
Kabuuang progress sa halip na listahan ng file--info=progress2
Ihambing ayon sa nilalaman, hindi ayon sa oras-c (--checksum), mas mabagal
Huwag galawin ang mga file na mas bago sa destinasyon-u (--update)
Huwag i-overwrite ang mga umiiral nang file--ignore-existing
Burahin ang orihinal na file pagkatapos ilipat (move)--remove-source-files
Detalyadong estadistika sa dulo--stats

Karaniwang mga error at kung paano ayusin ang mga ito

  • Permission denied habang nagsusulat — walang karapatan ang user sa direktoryo ng destinasyon. Tingnan ang may-ari ng direktoryo o gamitin ang --rsync-path="sudo rsync".
  • Muling kinokopya ang mga file sa bawat takbo — hindi napapanatili ang oras ng pagbabago. Tiyaking may -a o -t; sa FAT/exFAT, idagdag ang --modify-window=2, dahil dalawang segundo lang ang katumpakan ng oras sa mga file system na iyon.
  • Error sa chown o chgrp kapag kumokopya sa flash drive o network folder — hindi sinusuportahan ng file system ang owner. Palitan ang -a ng -rlt.
  • Lumitaw ang dagdag na nesting na /backup/project/project — napagpalit ang slash sa dulo ng pinagmulan.
  • connection unexpectedly closed — problema sa SSH o hindi naka-install ang rsync sa malayong panig. Subukan muna ang normal na ssh login at tingnan kung may rsync sa server.

Buod

Para sa pang-araw-araw na gamit, sapat nang tandaan ang ilang command: rsync -avz src/ host:/dst/ para sa pagkopya sa pamamagitan ng SSH, --delete kasama ang pagsubok na -n para sa mirror, --exclude para sa mga hindi kailangan, at --link-dest para sa backup na may snapshot. Bantayan ang slash sa dulo ng pinagmulan, at magiging pinakamaaasahang paraan ang rsync sa paglilipat ng file sa pagitan ng mga makina. Ang pag-sync at backup ay ipinapaliwanag din nang praktikal sa kursong Linux.

Mga madalas itanong

Mas maganda ba ang rsync kaysa scp?

Kinokopya ng scp ang buong file sa bawat pagkakataon, habang ipinapadala lamang ng rsync ang mga pagbabago. Kaya rin nitong ituloy ang naputol na paglilipat, burahin ang labis sa destinasyon, at i-exclude ang mga file ayon sa pattern. Para sa iisang beses na pagkopya ng isang file, halos walang pagkakaiba, pero para sa regular na pag-sync, mas mabilis at mas maayos ang rsync.

Puwede bang gamitin ang rsync sa Windows?

Oo, sa pamamagitan ng WSL, kung saan naka-install ang rsync gaya sa normal na Linux, o sa pamamagitan ng Cygwin. Pinakamadaling i-sync ang mga file ng Windows machine sa Linux server mula sa WSL.

Naka-encrypt ba ang data na ipinapadala ng rsync?

Hindi ito nagse-encrypt sa sarili nito, pero kapag kumokopya sa pamamagitan ng SSH, dumadaan ang buong trapiko sa naka-encrypt na SSH connection. Walang encryption kapag ginamit ang rsync daemon sa address na anyong rsync://.

Paano i-verify na magkapareho ang kopya at ang orihinal?

Patakbuhin ang rsync -avnc pinagmulan/ destinasyon/. Ang -c ay nagkukumpara ayon sa checksum, at ang -n ay hindi nagbabago ng anuman. Kung walang lumabas na listahan ng file, magkapareho ang mga kopya.

Ano ang mangyayari kung maputol ang rsync habang naglilipat?

Mananatili ang mga file na nailipat na, at ang hindi pa tapos na file ay karaniwang binubura. Ang pag-uulit ng parehong command ay magpapatuloy mula sa huling punto, at sa flag na -P, mapapanatili rin ang bahagi ng naputol na file.

Pag-aralan ito sa video

Detalyadong tinatalakay ang paksang ito, may praktis, sa kursong “Linux: с нуля до уверенного администрирования”.

Pumunta sa kurso