Perpindahan berkas ke dan dari server jarak jauh adalah pekerjaan harian administrasi, dan dua perintah yang menanganinya adalah scp untuk penyalinan langsung serta rsync untuk sinkronisasi yang hanya mengirim selisihnya. Topik ini membahas bentuk keduanya, semantik garis miring pada rsync yang sering tertukar, dan demonstrasi sinkronisasi inkremental yang dijalankan di sandbox dengan dua direktori lokal.
Menyalin dengan scp#
Perintah scp menyalin berkas dengan sintaks yang mirip cp, hanya saja sumber atau tujuannya boleh berupa mesin jarak jauh yang ditulis pengguna@host:jalur. Jalur di sisi jarak jauh ditulis setelah tanda titik dua, dan tanda ~ di sana berarti direktori home pengguna tersebut, sehingga [email protected]:~/arsip/ menunjuk folder arsip di dalam home budi. Opsi -r menyalin direktori beserta seluruh isinya, sedangkan opsi port ditulis -P dengan huruf besar. Sejak OpenSSH 9.0, scp bekerja di atas protokol SFTP, sehingga perilakunya ikut mengikuti pengaturan server SFTP.
# tidak-dijalankan
# scp memerlukan klien ssh yang tidak terpasang di sandbox
# menyalin satu berkas menuju direktori home pengguna budi
scp catatan.txt [email protected]:~/
# menyalin satu direktori beserta seluruh isinya
scp -r asal [email protected]:arsip/Setiap kali scp dijalankan, berkas dikirim ulang secara utuh, tanpa memandang apakah tujuan sudah memiliki salinan yang sama. Untuk koneksi yang lambat, opsi -C menyalakan kompresi, sedangkan -q menyembunyikan indikator kemajuan. Perilaku penyalinan utuh itu sederhana dan dapat diprediksi, tetapi boros ketika berkasnya besar dan hanya berubah sedikit, dan di sinilah rsync mengambil alih.
Sinkronisasi inkremental dengan rsync#
Perintah rsync membandingkan sumber dengan tujuan, kemudian hanya mengirim berkas yang berbeda. Untuk berkas besar yang berubah sebagian, hanya bagian yang berbeda itulah yang dikirim melalui jaringan. Opsi -a (arsip) menyalin secara rekursif sambil mempertahankan izin, waktu, dan tautan, sedangkan -v menampilkan daftar berkas yang dikerjakan. rsync harus terpasang di kedua ujung, sedangkan scp hanya menuntut sshd.
Semantik garis miring pada sumber adalah hal yang paling sering tertukar. Sumber asal/ dengan garis miring berarti isi direktori asal ditempelkan langsung ke tujuan, sedangkan asal tanpa garis miring menyalin direktori asal itu sendiri sehingga muncul tujuan/asal.
Demonstrasi berikut dijalankan sepenuhnya di sandbox dengan dua direktori lokal, dan ukuran isinya sengaja dibuat berbeda jauh agar efek sinkronisasinya terukur.
# menyiapkan folder latihan dengan isi yang mudah diukur
rm -rf /tmp/kerja-transfer-berkas
mkdir -p /tmp/kerja-transfer-berkas/asal/data
cd /tmp/kerja-transfer-berkas
printf 'catatan pemeliharaan server latihan\npembersihan cache selesai tanpa insiden\n' > asal/catatan.txt
seq 1 400000 > asal/data/besar.log
printf 'laporan cek harian: normal\n' > asal/data/laporan.txt# mengukur ukuran setiap berkas sebelum penyalinan
cd /tmp/kerja-transfer-berkas
wc -c asal/catatan.txt asal/data/besar.log asal/data/laporan.txt 76 asal/catatan.txt
2688895 asal/data/besar.log
27 asal/data/laporan.txt
2688998 total# sinkronisasi pertama: seluruh berkas disalin
cd /tmp/kerja-transfer-berkas
rsync -av --info=stats0 asal/ tujuan/sending incremental file list
created directory tujuan
./
catatan.txt
data/
data/besar.log
data/laporan.txtOpsi --info=stats0 meniadakan ringkasan statistik di akhir keluaran, yang memuat laju transfer yang berbeda-beda di setiap mesin dan tidak menambah pemahaman apa pun di sini. Keluaran pertama menampilkan seluruh isi asal/, lengkap dengan baris created directory tujuan karena tujuan memang baru dibuat.
# menambah satu baris pada satu berkas sumber, lalu sinkronisasi ulang
cd /tmp/kerja-transfer-berkas
printf 'baris tambahan setelah revisi\n' >> asal/data/laporan.txt
rsync -av --info=stats0 asal/ tujuan/sending incremental file list
data/laporan.txtSinkronisasi kedua hanya menyebut data/laporan.txt, sedangkan besar.log yang berukuran hampir 2,7 juta byte tidak tersentuh sama sekali karena rsync mengenalinya dari ukuran dan waktunya yang tidak berubah. Bandingkan dengan scp, yang pada situasi yang sama akan mengirim ulang seluruh isi direktori.
# menambah satu baris lagi, lalu memeriksa rencana transfer tanpa menjalankannya
cd /tmp/kerja-transfer-berkas
printf 'cek ulang cache: baik\n' >> asal/catatan.txt
rsync -avn --info=stats0 asal/ tujuan/sending incremental file list
catatan.txtOpsi -n (dry run) membuat rsync hanya merencanakan tanpa menyalin apa pun, sehingga isi tujuan/ masih dalam keadaan semula. Kombinasi -avn menjadi kebiasaan yang sehat sebelum sinkronisasi yang berisiko, karena rencana transfernya dapat dibaca terlebih dahulu.
Menyaring berkas yang disalin#
Pola pengecualian mempersempit cakupan sinkronisasi tanpa menyusun daftar berkas satu per satu. Opsi --exclude menerima pola yang dicocokkan dengan jalur relatif sumber, misalnya --exclude '*.log' untuk melewatkan seluruh berkas log, dan pola yang lebih spesifik dapat disusun berlapis. Opsi --include yang diletakkan sebelum --exclude menyelamatkan sebagian kecil berkas dari pola yang luas.
# merencanakan penyalinan yang tidak menyertakan berkas log
cd /tmp/kerja-transfer-berkas
rsync -avn --info=stats0 --exclude '*.log' asal/ tujuan-baru/sending incremental file list
created directory tujuan-baru
./
catatan.txt
data/
data/laporan.txtKeluarannya menunjukkan data/besar.log tidak masuk rencana transfer, sedangkan berkas lain tetap disalin. Pengecualian semacam ini sering dipakai bersama --delete, misalnya untuk cermin direktori situs yang tidak menyeret berkas hasil build, dan uji dry run tetap dilakukan dengan cara yang sama.
Mirror menuju server dan opsi –delete#
Bentuk tujuan jarak jauh pada rsync sama seperti pada scp, yaitu pengguna@host:jalur, sehingga sinkronisasi menuju server latihan ditulis seperti berikut. Contoh ini memakai -av penuh tanpa --info=stats0, karena ringkasan statistiknya justru berguna saat penyalinan benar-benar menuju jaringan.
# tidak-dijalankan
# rsync menuju server memerlukan klien ssh yang tidak terpasang di sandbox
rsync -av asal/ [email protected]:arsip-latihan/Opsi --delete mengubah rsync menjadi cermin (mirror) yang benar-benar menyamakan tujuan dengan sumber, yaitu berkas yang hilang dari sumber ikut dihapus dari tujuan. Tanpa opsi itu, rsync hanya menambah dan memperbarui, sedangkan berkas yang sudah tidak ada di sumber tetap ada di tujuan. Untuk cadangan rutin, -a yang menjaga atribut biasanya dipadukan dengan --delete agar cerminnya murni, dan susunan semacam ini menjadi bahan dasar strategi cadangan berkala.
Kesalahan umum#
- Menulis
-puntuk port padascp. Opsi port scp adalah-P, sedangkan-ppada scp berarti mempertahankan waktu berkas. - Mencampur semantik garis miring.
rsync -a asal tujuan/menghasilkantujuan/asal, sedangkan yang dimaksud biasanyarsync -a asal/ tujuan/. - Mengira rsync gagal karena penyalinan pertamanya lambat. Penyalinan pertama memang mengirim semuanya, dan keunggulan rsync baru terlihat pada sinkronisasi berikutnya.
- Lupa bahwa rsync juga harus terpasang di server. Pesan
rsync: command not founddari sisi jauh menunjukkan ujung tujuannya tidak memiliki rsync, dan scp menjadi pilihan penyalinan sederhananya.
Ringkasan#
scpmenyalin dengan sintaks miripcp, tujuanpengguna@host:jalur, port dengan-P, dan selalu mengirim berkas secara utuh.rsync -amenyinkronkan dengan hanya mengirim selisihnya, dan-avnmenampilkan rencana transfer tanpa menjalankannya.- Garis miring pada sumber menentukan yang disalin, yaitu isinya atau direktorinya itu sendiri.
- Opsi
--deletemengubah sinkronisasi menjadi cermin dan wajib didahului dry run.
Referensi#
- rsync(1) — Ubuntu manpages — Opsi -a, -n, –delete, –info, dan semantik garis miring pada sumber.
- scp(1) — OpenBSD — Bentuk sumber dan tujuan jarak jauh serta opsi -P dan -r.
- OpenSSH 9.0 release notes — OpenSSH — Catatan bahwa scp beralih menggunakan protokol SFTP secara default.