Panduan

rsync: contoh sinkronisasi berkas dan backup di Linux

Diperbarui: · Skillaria.Top

rsync menyalin dan menyinkronkan berkas secara lokal dan lewat SSH, dengan hanya mengirim perubahan. Perintah dasarnya adalah rsync -avz sumber/ user@host:/tujuan/: -a mempertahankan izin dan waktu, -v menampilkan berkas, -z mengompres lalu lintas; --delete membuat tujuan menjadi salinan persis dari sumber, dan -n memungkinkan Anda memeriksa hasilnya dulu tanpa mengubah apa pun.

rsync adalah alat standar Linux untuk menyalin dan menyinkronkan berkas: secara lokal, antar-disk, dan antar-server lewat SSH. Perbedaan utamanya dengan cp dan scp adalah rsync hanya mengirim bagian yang berubah, sehingga sinkronisasi ulang direktori besar hanya memakan beberapa detik. Di bawah ini contoh rsync untuk tugas-tugas yang umum: menyalin proyek ke server, membuat cermin direktori, pengecualian, backup dengan snapshot, dan penjadwalan berkala.

Sintaks dan flag yang paling penting

Bentuk umum perintahnya:

rsync [opsi] SUMBER... TUJUAN

Sumber dan tujuan bisa berupa path lokal atau path jarak jauh dengan format user@host:/path. Salah satu sisinya harus lokal: rsync tidak menyalin langsung antara dua mesin jarak jauh.

FlagFungsi
-amode arsip: rekursif, mempertahankan izin, pemilik, grup, waktu modifikasi, dan symlink (setara dengan -rlptgoD)
-vmenampilkan daftar berkas yang dikirim
-zmengompres data saat dikirim lewat jaringan
-hukuran dalam format yang mudah dibaca (K, M, G)
-Psama dengan --partial --progress: tampilkan progres dan lanjutkan berkas yang terputus
-n, --dry-runuji coba: tampilkan apa yang akan dilakukan tanpa mengubah apa pun
--deletehapus di tujuan berkas yang tidak ada di sumber
--excludejangan salin berkas yang cocok dengan pola tertentu
-etentukan shell jarak jauh, misalnya -e "ssh -p 2222"
-H, -A, -Xpertahankan hard link, ACL, dan atribut berkas yang diperluas (tidak termasuk dalam -a)

Dalam praktik, rsync -avh untuk lokal dan rsync -avzh untuk jaringan sudah cukup untuk sebagian besar kasus.

Garis miring di akhir path: jebakan utama

Kesalahan paling umum bagi pemula berkaitan dengan garis miring di akhir sumber. Dari situ ditentukan apakah yang disalin adalah direktorinya sendiri atau hanya isinya.

# Salin DIREKTORI project ke dalam /backup → hasilnya /backup/project/...
rsync -av project /backup/

# Salin ISI project ke /backup → berkas langsung berada di /backup/
rsync -av project/ /backup/

Cara mudah mengingatnya: garis miring di akhir sumber berarti "isi direktori ini". Di sisi tujuan, garis miring tidak berpengaruh. Jika ragu, tambahkan -n dan lihat path mana yang akan dibuat rsync.

Penyalinan lokal

Menyalin direktori ke disk eksternal dengan progres:

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

Menjalankan perintah yang sama lagi tidak menyalin ulang semuanya: rsync membandingkan ukuran dan waktu modifikasi berkas, lalu hanya mengirim berkas baru dan yang berubah. Keluaran di akhir menunjukkan berapa banyak data yang benar-benar dikirim:

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

Nilai speedup menunjukkan berapa kali lebih sedikit data yang dikirim dibandingkan dengan penyalinan penuh.

rsync lewat SSH: menyalin ke server dan kembali

Untuk path jarak jauh, rsync secara default memakai SSH, jadi tidak perlu konfigurasi tambahan selama login ssh biasa sudah berfungsi. Akan lebih praktis jika memakai kunci: dengan begitu kata sandi tidak diminta dan perintahnya bisa dijadwalkan lewat cron.

# Unggah situs ke server
rsync -avz ./site/ deploy@203.0.113.10:/var/www/site/

# Unduh log dari server ke komputer Anda
rsync -avz deploy@203.0.113.10:/var/log/nginx/ ./nginx-logs/

# SSH di port non-standar dan dengan kunci tertentu
rsync -avz -e "ssh -p 2222 -i ~/.ssh/deploy_key" ./site/ deploy@203.0.113.10:/var/www/site/

rsync harus terpasang di kedua mesin: di sisi jarak jauh ia dijalankan lewat SSH. Jika belum ada, Anda akan melihat rsync: command not found — pasang paketnya (sudo apt install rsync atau sudo dnf install rsync).

Jika host didefinisikan di ~/.ssh/config dengan alias, rsync mengenalinya: rsync -avz ./site/ prod:/var/www/site/.

Perlu hak root di server

Jika berkas di tujuan dimiliki root sedangkan Anda masuk sebagai pengguna biasa, rsync di sisi jarak jauh bisa dijalankan dengan sudo:

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

Agar ini berhasil, sudo untuk rsync di server harus berjalan tanpa kata sandi (diatur di sudoers). Jika tidak, perintah akan menggantung menunggu input.

Cermin direktori: --delete

Secara default rsync hanya menambah dan memperbarui berkas, tetapi tidak menghapus apa pun. Agar tujuan menjadi salinan persis dari sumber, gunakan --delete:

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

Flag ini kuat sekaligus berbahaya. Satu kesalahan path (misalnya sumber kosong atau garis miring yang terlupa) bisa menghapus data di tujuan. Karena itu aturannya satu: setiap perintah dengan --delete jalankan dulu dengan -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)

Baris deleting menunjukkan apa yang akan dihapus. Jika sudah yakin semuanya benar, jalankan tanpa -n.

Variasi yang berguna: --delete-after menghapus berkas setelah transfer selesai (tujuan tetap utuh lebih lama), sedangkan --backup --backup-dir=/mnt/backup/deleted-$(date +%F) tidak menghapus, melainkan memindahkan berkas yang akan dihapus atau ditimpa ke direktori terpisah.

Pengecualian: --exclude dan --include

Mengecualikan berkas sementara, dependensi, dan rahasia adalah praktik umum saat deploy dan backup.

# Beberapa pola sekaligus
rsync -avz --exclude='.git/' --exclude='node_modules/' --exclude='*.log' ./app/ server:/srv/app/

# Pola dari berkas
rsync -avz --exclude-from='.rsyncignore' ./app/ server:/srv/app/

Berkas .rsyncignore berisi daftar sederhana pola, satu per baris:

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

Cara kerja pola:

  • Pola tanpa garis miring di awal (*.log) cocok di kedalaman mana pun.
  • Pola dengan garis miring di awal (/tmp/) terikat pada akar transfer — hanya tmp di tingkat teratas yang dikecualikan.
  • Garis miring di akhir (cache/) berarti "hanya direktori".
  • Aturan diperiksa berurutan, dan yang pertama cocok akan berlaku.

Dari poin terakhir ini lahir teknik "salin hanya yang diperlukan": izinkan dulu yang dibutuhkan, lalu larang semua sisanya.

# Salin hanya berkas .conf dengan mempertahankan struktur direktori
rsync -av --include='*/' --include='*.conf' --exclude='*' /etc/ ./etc-confs/

Di sini --include='*/' diperlukan agar rsync masuk ke semua subdirektori. Tambahkan --prune-empty-dirs (-m) jika tidak ingin membuat direktori kosong.

Backup dengan rsync

Salinan harian sederhana

Backup minimal dari direktori home ke disk kedua:

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

Kekurangan cara ini adalah hanya ada satu versi. Jika berkas rusak dan backup sudah sempat tersinkronisasi, versi lama akan hilang.

Snapshot bertahap dengan --link-dest

Flag --link-dest mengatasi masalah ini hampir tanpa biaya tambahan. Berkas yang tidak berubah tidak disalin, melainkan dibuat sebagai hard link ke berkas di snapshot sebelumnya. Setiap snapshot tampak seperti salinan penuh, tetapi ruang yang dipakai hanya untuk perubahan.

#!/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"

Pada eksekusi pertama, direktori latest belum ada — rsync akan memberi peringatan dan membuat salinan penuh, dan itu normal. Snapshot lama dihapus dengan rm -rf biasa: berkas yang juga dirujuk oleh snapshot lain tidak akan ikut hilang.

Untuk menghapus snapshot yang lebih tua dari 30 hari:

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

Backup server ke mesin lain

Arah yang baik adalah "dari server backup ke server kerja": mesin backup sendiri yang menarik data, sehingga server kerja tidak punya akses ke salinan. Jika server kerja diretas, backup tetap aman.

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

Perlu diingat, basis data tidak boleh disalin dengan cara ini: berkas DBMS yang sedang berjalan tidak konsisten saat disalin. Buat dump dulu (mysqldump, pg_dump), lalu biarkan rsync memindahkan berkas dump yang sudah jadi.

Menjalankan terjadwal dengan cron

Skrip backup didaftarkan ke cron dengan perintah crontab -e:

# Setiap hari pukul 03:15, keluaran dicatat ke log
15 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Hal yang perlu diperiksa agar backup dari cron benar-benar berjalan:

  • Skrip memakai path absolut: cron memiliki PATH yang minimal dan direktori kerja yang berbeda.
  • Kunci SSH tanpa kata sandi, dan host sudah ada di known_hosts — jika tidak, rsync akan menggantung menanyakan keaslian host.
  • Skrip memeriksa kode keluar: rsync mengembalikan 0 jika berhasil, 23 jika sebagian berkas tidak terkirim, dan 24 jika berkas hilang selama penyalinan.
  • Untuk mencegah dua salinan berjalan bersamaan, gunakan flock: flock -n /tmp/backup.lock /usr/local/bin/backup.sh.

Sebagai alternatif cron, Anda bisa memakai timer systemd — keluarannya masuk ke journal, dan hasilnya mudah dilihat dengan journalctl.

Opsi berguna untuk transfer besar

TugasOpsi
Membatasi kecepatan agar jaringan tidak penuh--bwlimit=5M
Melanjutkan berkas besar setelah terputus-P (atau --partial)
Progres keseluruhan, bukan daftar berkas--info=progress2
Membandingkan berdasarkan isi, bukan waktu-c (--checksum), lebih lambat
Jangan menyentuh berkas yang lebih baru di tujuan-u (--update)
Jangan menimpa berkas yang sudah ada--ignore-existing
Hapus berkas sumber setelah transfer (pindah)--remove-source-files
Statistik rinci di akhir--stats

Kesalahan umum dan cara memperbaikinya

  • Permission denied saat menulis — pengguna tidak punya hak atas direktori tujuan. Periksa pemilik direktori atau gunakan --rsync-path="sudo rsync".
  • Berkas selalu disalin ulang dari awal — waktu modifikasi tidak terjaga. Pastikan ada -a atau -t; pada FAT/exFAT tambahkan --modify-window=2, karena sistem ini menyimpan waktu dengan akurasi dua detik.
  • Error chown atau chgrp saat menyalin ke flashdisk atau folder jaringan — sistem berkas tidak mendukung pemilik. Ganti -a dengan -rlt.
  • Muncul folder bertingkat /backup/project/project — garis miring di akhir sumber tertukar.
  • connection unexpectedly closed — masalah SSH atau rsync belum terpasang di sisi jarak jauh. Coba login biasa dengan ssh dan pastikan rsync ada di server.

Kesimpulan

Untuk pekerjaan sehari-hari cukup mengingat beberapa perintah: rsync -avz sumber/ host:/tujuan/ untuk menyalin lewat SSH, --delete bersama -n untuk cermin, --exclude untuk membuang yang tidak perlu, dan --link-dest untuk backup bersnapshot. Perhatikan garis miring di akhir sumber — dan rsync menjadi cara paling andal untuk memindahkan berkas antar mesin. Sinkronisasi dan backup dibahas dalam praktik pada kursus Linux.

Pertanyaan umum

Apa keunggulan rsync dibanding scp?

scp selalu menyalin berkas secara penuh, sedangkan rsync hanya mengirim perubahan, bisa melanjutkan transfer, menghapus berkas berlebih di tujuan, dan mengecualikan berkas berdasarkan pola. Untuk satu berkas sekali salin perbedaannya kecil, tetapi untuk sinkronisasi rutin rsync jauh lebih cepat.

Bisakah rsync dipakai di Windows?

Bisa, melalui WSL — rsync dipasang seperti di Linux biasa — atau melalui Cygwin. Untuk menyinkronkan berkas dari PC Windows ke server Linux, WSL adalah pilihan paling praktis.

Apakah rsync mengenkripsi data yang dikirim?

rsync sendiri tidak mengenkripsi, tetapi jika disalin lewat SSH, seluruh lalu lintas berjalan melalui koneksi SSH yang terenkripsi. Tanpa enkripsi, data dikirim hanya pada mode daemon rsync dengan alamat berbentuk rsync://.

Bagaimana cara memastikan salinan sama persis dengan aslinya?

Jalankan rsync -avnc sumber/ tujuan/ — flag -c membandingkan berdasarkan checksum, dan -n tidak mengubah apa pun. Jika daftar berkas yang ditampilkan kosong, kedua salinan identik.

Apa yang terjadi jika rsync dihentikan di tengah transfer?

Berkas yang sudah terkirim tetap ada, sedangkan berkas yang belum selesai dihapus secara default. Menjalankan ulang perintah yang sama akan melanjutkan dari titik berhenti, dan dengan flag -P bagian berkas yang terputus juga dipertahankan.

Pelajari topik ini lewat video

Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.

Ke kursus