Chapter sebelumnya memakai rsync sebagai mesin delta tanpa membedahnya; sekarang giliran mesinnya yang naik ke meja operasi. rsync adalah alat sinkronisasi yang hanya memindahkan beda antara sumber dan tujuan, sehingga backup kedua dan seterusnya jauh lebih ringan daripada menyalin ulang seluruh pohon direktori. Kita akan membaca cara kerja delta-transfer, membedah huruf-huruf --itemize-changes, menaklukkan jebakan garis miring, lalu menguji --delete yang menjadikan tujuan cermin sempurna dari sumber.
Cara Kerja Delta-Transfer #
Masalahnya sederhana: cp selalu menyalin seluruh file, dan scp di jaringan melakukan hal yang sama. Untuk file sebesar ratusan megabyte yang hanya berubah beberapa kilobyte, memindahkan semuanya adalah pemborosan. rsync menyelesaikannya lewat algoritma delta-transfer: kedua sisi membagi file menjadi blok-blok, menghitung checksum untuk setiap blok, membandingkan daftar checksum tersebut, lalu hanya blok yang berbeda yang dikirim. Sisi penerima merakit file baru dari blok lama yang masih sama plus blok baru yang dikirim — hasil akhirnya identik dengan salinan penuh, tetapi yang lewat jaringan (atau antar-folder lokal) hanya sebagian kecil.
Konsekuensinya penting dipahami: sinkronisasi pertama tetap menyalin semuanya karena belum ada apa pun di tujuan, sedangkan sinkronisasi berikutnya hanya memindahkan perubahan. Perilaku inilah yang membuat backup harian dengan rsync terasa hampir instan. Untuk transfer jarak jauh, rsync menumpang pada SSH:
rsync -a proyek/ budi@server-kantor:/srv/backup/proyek/
rsync -a --delete -e ssh foto/ [email protected]:/srv/backup/foto/Sintaksisnya sama persis dengan versi lokal — cukup tulis tujuan sebagai user@host:path. Sinkronisasi pertama mengirim pohon penuh lewat SSH, dan pemanggilan berikutnya hanya mengirim delta. Lingkungan latihan kita tidak memiliki SSH server, jadi seluruh praktik chapter ini menggunakan dua folder lokal; prinsipnya tidak berubah karena delta-transfer bekerja pada pasangan sumber-tujuan mana pun.
Membaca Keputusan rsync dengan –itemize-changes #
Opsi --itemize-changes (ringkas: -i) mencetak satu baris per item yang menegaskan keputusan rsync: dibuat, diperbarui, atau dihapus. Mari kita buktikan bahwa delta itu nyata — buat fixture tiga file, sinkronkan, ubah satu, lalu sinkronkan lagi. Waktu file yang direvisi dikunci dengan touch -d agar huruf yang muncul konsisten antar eksekusi:
mkdir -p proyek/src proyek/docs
printf 'readme proyek\n' > proyek/README.md
printf 'int main(){return 0;}\n' > proyek/src/main.c
printf 'catatan desain\n' > proyek/docs/desain.txt
touch -d "2026-01-15 09:00:00" proyek proyek/src proyek/docs
echo "== sinkronisasi pertama =="
rsync -a --itemize-changes proyek/ cadangan/
echo "== ubah satu file, sinkron ulang =="
printf 'readme proyek (revisi)\n' > proyek/README.md
touch -d "2026-01-15 10:00:00" proyek/README.md proyek
rsync -a --itemize-changes proyek/ cadangan/
diff -r proyek cadangan && echo "pohon identik"Output yang Dihasilkan:
== sinkronisasi pertama ==
created directory cadangan
cd+++++++++ ./
>f+++++++++ README.md
cd+++++++++ docs/
>f+++++++++ docs/desain.txt
cd+++++++++ src/
>f+++++++++ src/main.c
== ubah satu file, sinkron ulang ==
.d..t...... ./
>f.st...... README.md
pohon identikBedah baris per barisnya:
- Baris 1-5: menyiapkan pohon
proyekberisi dua subfolder dan tiga file sebagai data sumber;touch -dmenyetel waktu direktori ke nilai tetap. - Baris 8 (
rsync -a -i proyek/ cadangan/): mode-a(archive) menyalin rekursif sambil mempertahankan izin, waktu modifikasi, kepemilikan, dan symlink — mode yang hampir selalu tepat untuk backup. - Baris 10-12: satu file direvisi, waktunya dikunci ke pukul 10:00, waktu direktori induk dikembalikan ke 09:00, lalu
rsyncdijalankan ulang dengan opsi yang sama. - Baris 13 (
diff -r): membuktikan hasil sinkronisasi identik dengan sumber, termasuk isi subfolder.
Pada putaran pertama semua item bertanda cd+++++++++ (direktori baru) dan >f+++++++++ (file baru) — memang semua belum ada di tujuan. Pada putaran kedua satu-satunya baris adalah >f.st...... README.md: huruf s berarti ukuran berubah dan huruf t berarti waktu modifikasi berubah, jadi hanya file itulah yang ditransfer. File yang tidak berubah tidak dianggap sama sekali — inilah delta-transfer pada tingkat item. Kamus lengkap huruf-huruf ini terdokumentasi di rsync(1)
.
Jebakan Garis Miring di Ujung Sumber #
Satu karakter bisa mengubah hasil total: garis miring pada akhir path sumber. Aturannya — surat/ berarti “salin isi folder”, surat berarti “salin folder-nya”:
mkdir -p surat/2026
printf 'surat resmi\n' > surat/2026/resmi.txt
rsync -a surat/ salin-isinya/
rsync -a surat salin-foldernya/
find salin-isinya salin-foldernya -type f | sortOutput yang Dihasilkan:
salin-foldernya/surat/2026/resmi.txt
salin-isinya/2026/resmi.txtBedah baris per barisnya:
- Baris 3 (
rsync -a surat/ salin-isinya/): garis miring di ujungsurat/membuat isi folder langsung mendarat di akarsalin-isinya/. - Baris 4 (
rsync -a surat salin-foldernya/): tanpa garis miring, foldersuratitu sendiri yang disalin ke dalamsalin-foldernya/sehingga strukturnya lebih dalam satu tingkat. - Baris 5 (
find ... | sort): memajang hasil keduanya berdampingan agar bedanya terlihat dalam dua baris.
Sinkronisasi Penuh dengan –delete #
Tanpa opsi tambahan, rsync bersifat akumulatif: file yang dihapus dari sumber tetap tinggal di tujuan. Opsi --delete mengubahnya menjadi cermin sempurna — dan karena sifatnya merusak, biasakan mengawalinya dengan --dry-run (-n) yang mensimulasikan tanpa mengeksekusi:
mkdir -p foto
printf 'liburan 1\n' > foto/liburan.txt
printf 'kantor 1\n' > foto/kantor.txt
rsync -a foto/ mirror/
rm foto/kantor.txt
touch -d "2026-01-15 10:00:00" foto
echo "== dry-run =="
rsync -a --delete --itemize-changes --dry-run foto/ mirror/
echo "== eksekusi sungguhan =="
rsync -a --delete --itemize-changes foto/ mirror/
diff -r foto mirror && echo "mirror identik dengan sumber"Output yang Dihasilkan:
== dry-run ==
*deleting kantor.txt
.d..t...... ./
== eksekusi sungguhan ==
*deleting kantor.txt
.d..t...... ./
mirror identik dengan sumberBedah baris per barisnya:
- Baris 1-4: membuat dua foto, mensinkronkan pertama kali ke
mirror/, lalu menghapus satu file dari sumber — kejadian yang ingin tercermin. - Baris 6 (
touch -d): mengunci waktu direktorifotoke pukul 10:00 — menghapus isi folder memang menyentuh waktu foldernya, dan nilai tetap membuat output latihan konsisten. - Baris 8 (
--dry-run): menjalankan simulasi penuh;*deletingmemberi tahu file yang akan dihapus, sedangkan.d..tmencatat waktu direktori yang akan diperbarui. - Baris 10: eksekusi sungguhan tanpa
--dry-run— kali inikantor.txtbenar-benar dihapus darimirror/. - Baris 11 (
diff -r): bukti akhir bahwa tujuan kini cermin persis dari sumber.
Urutan keduanya bukan formalitas: output *deleting pada dry-run adalah kesempatan terakhir membatalkan sebelum penghapusan permanen terjadi. Pola ini — simulasi dulu, eksekusi kemudian — berlaku untuk semua perintah --delete apa pun sasarannya.
Menyaring dengan –exclude #
Data kerja nyata berisi file yang tidak layak dibackup: sisa editor, file sementara, artefak build. Opsi --exclude menerima pola glob dan melewatinya:
mkdir -p kerja
printf 'laporan final\n' > kerja/laporan.txt
printf 'sisa editor\n' > kerja/draft.tmp
printf 'kunci vscode\n' > kerja/.~lock.tmp
rsync -a --exclude='*.tmp' --itemize-changes kerja/ salinan/
find salinan -type f | sortOutput yang Dihasilkan:
created directory salinan
cd+++++++++ ./
>f+++++++++ laporan.txt
salinan/laporan.txtBedah baris per barisnya:
- Baris 1-4: membuat folder kerja dengan satu file penting dan dua file sampah berakhiran
.tmp. - Baris 5: pola
*.tmpmenyaring kedua file sampah — perhatikan bahwa pola cocok pada nama file di kedalaman mana pun. - Baris 6 (
find salinan -type f): membuktikan hanyalaporan.txtyang berpindah.
Opsi --exclude boleh diulang untuk beberapa pola, dan --exclude-from=file-daftar.txt membaca pola dari file — nyaman untuk daftar pengecualian panjang yang sama dipakai banyak script. Pola yang diawali / diikat ke akar transfer, misalnya --exclude=/cache hanya menyaring folder cache di paling atas. Lebih banyak resep penyaringan dirangkum di wiki Arch tentang rsync
.
rsync kini kita kuasai hingga ke detail itemize-nya: delta-transfer menjaga salinan selalu mengikuti keadaan terkini sumber. Tetapi backup juga butuh kebalikannya — membekukan keadaan pada satu titik waktu agar kemarin tetap bisa diakses meski hari ini berubah. Alat klasiknya adalah tar, topik chapter berikutnya.