Bagaimana Saya Menyalin Folder yang Benar-Benar Bisa Dipercaya
On this page
- Pendahuluan
- A. Apa saja yang sebenarnya dibawa satu folder
- B. Di mana pembedaan itu berhenti jadi teori
- C. Menyamakan bukan menyalin
- D. Ini apa, dan ini bukan apa
- E. Tujuh hambatan yang menghalangi
- Metode
- A. Mempertahankan yang diketahui filesystem
- B. Hak khusus yang dituntut kepemilikan
- C. Flag yang melakukan pengrusakan
- D. Menolak argumen yang terlalu gampang diketik
- E. Menolak memutuskan diam-diam
- F. Karakter yang mengubah artinya
- G. Menjangkau mesin yang bukan mesin ini
- Hasil dan Pembahasan
- A. Apa yang sebenarnya dijanjikan "bisa dilanjutkan"
- B. Kenapa sebagian besar script-nya berupa penolakan
- C. Di mana ini berhenti jadi tool yang tepat
- Simpulan
- Istilah
Menyalin folder termasuk hal pertama yang dipelajari siapa pun di depan komputer, dan termasuk hal terakhir yang pernah diperiksa ulang. Perintahnya pendek, selesainya tanpa keluhan, dan folder tujuan sesudahnya tampak persis seperti sumbernya. Justru penampakan itulah pangkal perkaranya. Salinan yang terlihat benar padahal tidak, gagalnya belakangan, di tempat lain, dengan gejala yang tak memberi petunjuk sedikit pun tentang asalnya.
Pendahuluan
A. Apa saja yang sebenarnya dibawa satu folder
Folder bukan cuma byte di dalam file-file-nya. Tiap file di filesystem Unix juga membawa sejumlah fakta tentang dirinya yang tinggal di luar isinya: user mana pemiliknya, group mana tempatnya bernaung, siapa saja yang boleh membaca, menulis, atau menjalankannya, dan kapan terakhir kali ia diubah. Web server yang menolak start karena folder config-nya dimiliki user yang keliru sama sekali tidak sedang bereaksi terhadap isi folder itu. Ia bereaksi terhadap salah satu fakta tadi.
Fakta-fakta ini biasanya tak kasatmata. Ia tak muncul saat file dibuka di editor, dan tak ikut disebut saat isinya dibandingkan dengan salinan lain. Sebuah file bisa identik byte demi byte dengan aslinya dan tetap tak berguna di tempat ia disalin, sebab yang membuat aslinya bekerja memang bukan byte-nya.
Untuk salinan yang membawa serta seluruhnya, saya pakai satu kata: setia. Salinan folder yang setia bukan cuma mengulang apa yang tertulis di file, melainkan segala yang diketahui filesystem tentangnya. Salinan yang tak setia mengulang isinya lalu membuang sisanya diam-diam.
B. Di mana pembedaan itu berhenti jadi teori
Untuk folder berisi dokumen, pembedaan tadi nyaris tak berarti. Kepemilikan file teks jarang menanggung beban apa-apa, dan seandainya permission-nya bergeser beberapa bit pun tak ada yang peduli.
Ia jadi berarti ketika yang disalin adalah infrastruktur. Folder deployment memuat file yang dibaca service tertentu sebagai user tertentu. Folder data memuat file yang dibuka proses database saat start, dan database itu menolak menyentuhnya bila permission-nya lebih longgar dari yang ia harapkan. Folder certificate memuat private key yang sengaja hanya bisa dibaca satu akun, dan salinan yang melonggarkan permission itu bukan memindahkan kunci — ia menerbitkannya.
Pada ketiga kasus itu kegagalannya muncul berjarak dari sebabnya. Tak ada yang meleset saat penyalinan. Penyalinannya melaporkan berhasil. Yang meleset adalah service yang lalu menolak start, atau start tapi tak bisa menulis, atau start dan bisa menulis ke tempat yang semestinya tak pernah boleh ia sentuh. Pencariannya lalu dimulai dari log service itu — tempat yang salah, sebab kekeliruannya dibuat berjam-jam sebelumnya oleh perintah yang tampak berhasil.
C. Menyamakan bukan menyalin
Ada pembedaan kedua yang bersembunyi di bawah yang pertama, dan pembedaan inilah yang membuat urusannya benar-benar sulit, bukan sekadar rewel.
Menyalin itu menambah. Jalankan dua kali, dan folder tujuan memuat segalanya dari sumber, ditambah apa pun yang sudah ada di sana sebelumnya. Tak pernah ada yang dibuang, jadi tak mungkin ada yang hilang — dan justru karena itu menyalin saja tak akan pernah menghasilkan folder yang sama dengan folder lain. File yang tiga minggu lalu dihapus dari sumber masih duduk di tujuan, dan berapa kali pun disalin ia takkan pergi.
Menyamakan itu mengganti. Ia membuat tujuan setara dengan sumber, yang mau tak mau berarti menghapus dari tujuan apa pun yang sudah tak dimiliki sumber. Cuma operasi inilah yang menghasilkan kesamaan sungguhan, dan operasi ini pula yang memang dirancang untuk memusnahkan data. Beda keduanya adalah beda antara tool yang boleh dijalankan sambil lalu dan tool yang tidak.
Seluruh isi artikel ini lahir dari keinginan memakai perilaku kedua sambil menolak menerima kecelakaan yang menyertainya.
D. Ini apa, dan ini bukan apa
Yang saya buat adalah pembungkus. Kerjanya dilakukan rsync, program yang menyalin file antarfolder atau antarmesin dengan hanya mengirim bagian yang berbeda. Program itu sudah ada sejak 1996, dan sedikit pun tak saya perbaiki. Tak ada satu pun di artikel ini yang merupakan temuan tentang rsync; semuanya tertulis di manual page-nya.
Artikel ini bicara soal pertanyaan yang lebih sempit: diberi tool dengan seratus opsi, beberapa di antaranya sanggup memusnahkan folder yang keliru, mana segelintir yang saya ingin terjadi setiap kali tanpa kecuali — dan apa yang harus ditolak tool itu bahkan ketika saya sendiri yang memintanya? Jawabannya script lima puluh delapan baris, dan sebagian besar barisnya berupa penolakan.
E. Tujuh hambatan yang menghalangi
Jadi tujuannya gampang dirumuskan: membuat folder tujuan benar-benar identik dengan folder sumber, termasuk segala yang diketahui filesystem tentang file-file-nya dan bukan cuma isinya, serta sanggup melakukannya ke folder di mesin ini maupun ke mesin lain di suatu tempat. Identik, berulang kali, tanpa sekali pun membuang yang tak saya maksud untuk dibuang.
Gampang dirumuskan, canggung dibangun. Tujuh hambatan berdiri antara tujuan itu dan sebuah perintah yang berani saya jalankan di folder production, dan sebagian besarnya sama sekali bukan soal menyalin.
Yang pertama, perintah yang paling kentara justru menghasilkan salinan yang bukan salinan. cp -r adalah yang diraih semua orang, dan ia diam-diam membuang hampir semua yang membuat aslinya bekerja. Kepemilikan berubah jadi milik siapa pun yang menjalankannya. Permission disaring lewat umask milik shell. Waktu modifikasi jadi sekarang — dan itu memusnahkan satu-satunya penanda murah yang tersedia untuk menilai apakah dua file sama. Hasilnya lolos pemeriksaan mata dan gagal di pemeriksaan fungsi, lalu gagalnya belakangan, di log service, jauh dari perintah penyebabnya.
Yang kedua, mempertahankan kepemilikan menuntut hak yang tak selalu saya punya. Kepemilikan bukan atribut yang boleh ditetapkan sembarang proses. Menyerahkan file kepada user lain adalah tindakan berhak khusus, sebab kalau tidak, siapa pun bisa menanam file bermilik root. Maka flag yang mempertahankan kepemilikan cuma bekerja saat perintahnya dijalankan sebagai root — dan saat tidak, ia tak gagal. Ia diam-diam menyerahkan tiap file salinan kepada yang menjalankannya, dan salinannya tampak lengkap padahal kelirunya sama persis seperti kalau memakai cp -r.
Yang ketiga, menyamakan dengan sumber berarti bersedia menghapus. Menghasilkan tujuan yang setara dengan sumber menuntut pembuangan file yang sudah tak dimiliki sumber, dan tak ada versi operasi ini yang aman secara bawaan. Seluruh risiko tool ini tinggal di satu flag. Yang bisa dikendalikan bukan apakah flag itu berbahaya, melainkan apakah keadaan saat ia dijalankan sudah diperiksa lebih dulu.
Yang keempat, argumen paling berbahaya justru paling gampang diketik. Satu titik berarti folder saat ini, dan itu cara terpendek yang mungkin untuk menyebut tujuan. Digabung dengan penghapusan, ia juga berarti perintah untuk mengosongkan folder tempat saya sedang berdiri lalu menggantinya dengan yang lain. Pertahanan yang menggoda adalah berhati-hati. Kehati-hatian bukan mekanisme, dan tool yang bersandar padanya belum mempertahankan apa pun.
Yang kelima, tujuan yang tak kosong kadang benar dan kadang bencana, dan tool-nya tak sanggup membedakan. Menyamakan ke folder yang sudah berisi adalah keadaan normal saat memperbarui deployment. Itu juga yang terjadi ketika path salah ketik dan tujuannya ternyata folder penuh pekerjaan yang tak ada hubungannya. Dari dalam script keduanya tampak identik. Tool-nya memang tak bisa memutuskan, tapi ia bisa menolak memutuskan diam-diam.
Yang keenam, satu karakter di ujung path mengubah arti perintahnya. Garis miring di ujung sumber memilih isi folder; ketiadaannya memilih folder itu sendiri, yang lalu mendarat bersarang di dalam tujuan. Ini perilaku rsync yang terdokumentasi dan gampang salah ingat. Dipasangkan dengan penghapusan, salah ingat berarti tujuan dikosongkan lalu diisi ulang dengan satu subfolder saja.
Yang ketujuh, "bisa dilanjutkan" adalah klaim bermakna dua, dan cuma satu yang berlaku di sini. Transfer ribuan file yang mati di tengah jalan tidak mengulang dari nol, sebab file yang sudah terkirim dikenali tak berubah lalu dilewati. Satu file besar yang mati di tengah jalan justru mengulang dari nol, sebab yang sudah tertulis dibuang. Kedua perilaku itu datang dari tool yang sama, dan mencampuradukkannya membuat orang merencanakan transfer di atas jaminan yang tak berlaku.
Masing-masing punya seksi di bawah. Urutannya penting: dua yang pertama menentukan apakah salinannya setia sama sekali, tiga berikutnya menentukan apakah perintahnya aman dijalankan, dan dua terakhir soal mengetahui persis apa yang dijanjikan — sebab tool yang dipercaya mengerjakan yang sebenarnya tak ia kerjakan lebih berbahaya ketimbang tool yang memang tak dipercaya.
Metode
A. Mempertahankan yang diketahui filesystem
Inilah jawaban atas hambatan pertama: berhenti memakai program yang menyalin isi, lalu pakai yang menyalin file. Pembedaan itulah seluruh intinya, dan ia terungkap lewat satu flag saja.
Bagian yang menarik adalah -a, yang sebenarnya bukan satu opsi melainkan tujuh: masuk rekursif ke subfolder, membuat ulang symlink tetap sebagai symlink, mempertahankan permission, mempertahankan waktu modifikasi, mempertahankan group, mempertahankan owner, serta membuat ulang device dan file istimewa. Tiap satunya adalah fakta tentang file yang dibuang cp -r.
Dua di antaranya bernilai lebih dari yang tampak. Mempertahankan waktu modifikasi penting bukan demi kerapian, melainkan karena rsync memakai ukuran dan waktu modifikasi bersama-sama untuk menilai apakah sebuah file perlu dikirim sama sekali — buang waktunya, dan tiap jalan berikutnya menyalin ulang segalanya. Membuat ulang symlink tetap sebagai symlink, bukan mengikutinya, penting karena symlink yang diikuti berubah jadi salinan sasarannya, dan folder penuh symlink ke satu library bersama berubah jadi folder penuh duplikat library.
Sisa flag-nya biasa saja dan memang disengaja: -v dan --progress karena transfer panjang tanpa keluaran tak bisa dibedakan dari transfer yang menggantung, -h supaya angka ukurannya terbaca, dan --info=stats2 demi ringkasan di akhir yang menyebut berapa yang benar-benar terkirim, bukan berapa yang diperiksa.
B. Hak khusus yang dituntut kepemilikan
Inilah jawaban atas hambatan kedua, dan jawabannya sebagian berupa pengakuan: flag-nya ada, dan apakah ia berbuat sesuatu bergantung pada siapa yang menjalankan perintahnya.
Mempertahankan kepemilikan berarti memanggil chown, dan chown ke user lain dibatasi hanya untuk root di tiap sistem Unix. Alasannya masuk akal — proses yang bisa menyerahkan file bisa menanam file bermilik root lalu menunggunya dijalankan. Tapi akibatnya bagi tool penyalin jadi canggung: dijalankan sebagai user biasa, -o yang ada di dalam -a sama sekali tak berbuat apa-apa, dan tak berbuat apa-apanya itu tanpa suara.
# as an ordinary user: contents and permissions survive, ownership does not
# as root: the copy carries its owners across as well
Tak ada jalan pintar untuk menyiasatinya, dan saya tak mencobanya. Yang penting adalah tahu keadaan mana dari keduanya yang sedang berlaku. Untuk folder source code ia tak relevan, sebab segalanya memang milik saya. Untuk folder data milik akun service, menjalankannya tanpa sudo menghasilkan salinan yang takkan bekerja di tempat tujuannya, dan kekeliruannya baru kelihatan saat ada yang mencoba memakainya.
C. Flag yang melakukan pengrusakan
Inilah jawaban atas hambatan ketiga, dan pada flag itu sendiri tak ada pertahanan apa pun. --delete membuang dari tujuan tiap file yang tak dimiliki sumber. Itulah yang membuat tujuan jadi setara, bukan sekadar diperbarui, dan itu pula alasan sisa script ini ada.
# without --delete: the destination accumulates every version ever deployed
# old-template.html removed from source three releases ago, still here
# legacy-bundle.js removed from source last year, still here
# with --delete: the destination is what the source is, and nothing elseSaya sempat menimbang untuk tak memakainya dan urung, sebab penyamaan yang cuma bisa menambah bukanlah penyamaan. Memperbarui deployment tanpa flag itu berarti file yang dibuang di versi baru tertinggal selamanya — template lama, aset lama, artefak hasil build lama — dan folder yang menumpuk gabungan seluruh versi yang pernah di-deploy bukan salinan apa pun.
Maka flag-nya tetap dipakai, dan sisa rancangannya menerima satu konsekuensi: tool ini sanggup memusnahkan data, karena itu saat-saat sebelum ia berjalan lebih berharga ketimbang saat-saat sesudahnya. Seluruh isi tiga seksi berikutnya terjadi sebelum rsync dipanggil sama sekali.
D. Menolak argumen yang terlalu gampang diketik
Inilah jawaban atas hambatan keempat. Satu tujuan ditolak mentah-mentah, dan justru itulah yang paling sedikit menuntut ketikan.
if [; then
Alasannya menyangkut bagaimana kekeliruan sungguhan terjadi. Tak ada yang berniat menghapus folder kerjanya sendiri. Yang terjadi adalah perintah disusun dari ingatan, tujuan jadi bagian yang diketik paling akhir, dan satu titik adalah yang keluar dari jari saat pikiran sudah berpindah ke apakah transfernya selesai sebelum rapat. Titik itu sintaksnya benar dan masuk akal sebagai tujuan, jadi tak ada satu pun bagian sistem yang keberatan.
Pesannya sama pentingnya dengan penolakannya. Error yang berbunyi invalid argument tak mengajari apa-apa dan akan disiasati dengan mencoba bentuk lain dari kekeliruan yang sama. Error yang menjelaskan apa yang tadinya akan terjadi adalah satu-satunya versi yang mengubah perilaku, sebab orang yang membacanya pada detik itu belum sadar apa yang barusan ia minta.
E. Menolak memutuskan diam-diam
Inilah jawaban atas hambatan kelima. Tujuan yang sudah berisi diperiksa, lalu keputusannya diserahkan kembali kepada manusia.
if [; then
if ; then
fi
Dua rincian di situ memang disengaja. Prompt-nya [y/N] dengan N besar, jadi bawaannya tidak — tekanan Enter dari orang yang pikirannya sedang ke mana-mana membatalkan operasinya, bukan mengizinkannya. Lalu yang diperiksa cuma "tujuannya tak kosong", bukan pemeriksaan yang lebih pintar, sebab script-nya memang tak sanggup membedakan folder deployment dari folder berisi pekerjaan orang lain. Ia tak berusaha. Ia menyatakan apa yang hendak ia lakukan lalu berhenti.
Konfirmasi semacam ini saya pasang di depan tiap operasi tak terbatalkan yang saya otomatiskan, dan alasannya selalu sama: untuk operasi yang tak bisa dibatalkan, ongkos satu ketikan tambahan bukan apa-apa dibanding ongkos satu kali kejadian yang menentukan. Alternatif yang ditolak adalah flag --force untuk melewati prompt — flag semacam itu selalu berakhir jadi flag yang selalu dipasang semua orang, sehingga pemeriksaannya hilang sama sekali.
F. Karakter yang mengubah artinya
Inilah jawaban atas hambatan keenam, dan ia dipatok di dalam script, bukan diserahkan kepada yang mengetik perintahnya.
# the trailing slashes are not decoration
# without them, the source folder lands nested inside the destination:
# rsync -avh --delete /srv/app /backup/app -> /backup/app/app/Rsync membaca garis miring di ujung sumber sebagai isi folder ini dan ketiadaannya sebagai folder ini sendiri. Keduanya sah dan pembedaannya terdokumentasi, tapi inilah persisnya jenis rincian yang diingat dengan benar sampai pada satu saat tidak lagi.
Digabung dengan penghapusan, salah ingat jadi mahal. Menyamakan /srv/app ke /backup/app tanpa garis miring mengosongkan tujuan lalu mengganti seluruh isinya dengan satu subfolder bernama app. Transfernya berhasil. Hasilnya salinan yang benar atas benda yang keliru.
Menempelkan garis miring di dalam script menghapus pilihan itu. Ia juga menghapus sedikit keluwesan, dan pertukaran itulah inti dari menulis pembungkus: pembungkus ada supaya satu perilaku terjadi setiap kali, bukan supaya segala kemampuan tool di bawahnya terbuka.
G. Menjangkau mesin yang bukan mesin ini
Pekerjaan yang sama lintas jaringan adalah perintah yang sama dengan transport yang ditempelkan, dan di sinilah pekerjaannya terbelah dua.
Opsi -e memberitahu rsync program mana yang dipakai untuk koneksinya, dan lewat situlah identity file beserta port non-standar diteruskan. Rsync-nya sendiri tak berubah: tujuh perilaku pertahanan yang sama, semantik penghapusan yang sama, garis miring ujung yang sama.
Yang tidak simetris adalah persiapan yang dibutuhkan tiap arah. Mengirim dari lokal ke remote menuntut folder tujuan sudah ada di seberang, jadi satu koneksi dibuat lebih dulu semata-mata untuk membuatnya:
Menarik dari remote ke lokal tak punya langkah semacam itu — folder lokal dibuat dengan mkdir -p biasa — tapi ia mewarisi sifat yang lain. Perbincangan soal kepemilikan dari hambatan kedua kembali dalam bentuk yang lebih pelik, sebab user di kedua mesin bukan user yang sama. File bermilik deploy di server tiba di laptop yang barangkali tak punya akun bernama itu, dan kepemilikan berupa angka yang berarti satu hal di satu mesin berarti hal lain di mesin seberang.
Ketidaksimetrisan inilah alasan kedua arah ditulis sebagai dua cabang terpisah, bukan sebagai satu jalur dengan argumen yang ditukar. Keduanya bukan operasi yang sama dalam dua arah. Keduanya dua operasi yang kebetulan berbagi satu transport.
Hasil dan Pembahasan
A. Apa yang sebenarnya dijanjikan "bisa dilanjutkan"
Ini hambatan ketujuh, dan tempatnya di hasil, bukan di metode, sebab ia bukan perilaku yang dikerjakan script-nya, melainkan pelajaran tentang apa yang tidak ia kerjakan.
Transfer yang mati di tengah jalan lalu tinggal dijalankan ulang tidak mulai dari nol. Rsync membandingkan ukuran dan waktu modifikasi tiap file dengan yang di tujuan lalu melewati yang cocok, jadi penyalinan dua belas ribu file yang gagal di file kesembilan ribu memeriksa ulang sembilan ribu pertama dan tak mengirim satu pun. Memeriksa itu cepat; mengirim tidak. Pada praktiknya jalan kedua mencapai titik kegagalan dalam sepersekian waktu aslinya.
| Keadaan | Saat dijalankan ulang |
|---|---|
| Banyak file, transfer mati di antara file | File yang sudah selesai dilewati; pekerjaan lanjut dekat titik berhentinya |
| Satu file besar, transfer mati di tengah file | Data separuhnya dibuang; file itu mulai dari nol |
| File sumber berubah sejak percobaan pertama | Terdeteksi lewat ukuran atau waktu modifikasi; dikirim ulang |
Baris kedua yang layak dihafalkan. Tanpa opsi untuk menyimpan file yang baru terkirim separuh, apa yang sudah tertulis sebelum gangguan tidak disimpan. Untuk folder berisi banyak file sedang, ini tak kelihatan. Untuk folder yang bobotnya satu arsip besar, gangguan di sembilan puluh persen menelan seluruh sembilan puluh persen itu.
Saya belum menambahkan opsi yang mengubahnya, dan alasannya: menyimpan file separuh punya mode kegagalannya sendiri — file separuh yang tertinggal di tujuan tampak seperti file utuh bagi apa pun selain rsync. Itu jenis kekeliruan yang berbeda dari percobaan ulang yang lambat, dan untuk folder yang saya pakai tool ini, percobaan ulang yang lambat justru yang lebih saya inginkan.
B. Kenapa sebagian besar script-nya berupa penolakan
Lima puluh delapan baris, dan bagian yang mengerjakan pekerjaannya cuma satu. Sisanya pemeriksaan argumen, satu tujuan yang ditolak, satu prompt konfirmasi, dan pesan-pesan yang menjelaskan apa yang hendak terjadi.
# an alias can carry the flags
# it cannot inspect the destination, ask a question, or declinePerbandingan itu tak saya rencanakan dan saya kira itulah bentuk jujurnya. Penyalinannya sudah dipecahkan pada 1996 dan saya tak menyumbang apa pun di sana. Yang tersisa untuk dibangun adalah pertimbangan di sekelilingnya: mana dari sekian banyak kemungkinan perilaku rsync yang saya ingin jadi otomatis, dan mana dari sekian kemungkinan kekeliruan saya sendiri yang saya ingin jadi mustahil. Pembungkus yang cuma memendekkan perintah akan menghemat ketikan sambil menambah risiko, sebab perintah yang pendek adalah perintah yang dijalankan tanpa berpikir.
Penolakan-penolakan itu juga menjelaskan kenapa ini script dan bukan alias. Alias sanggup menyimpan flag-nya, tapi ia tak bisa memeriksa tujuan, tak bisa mengajukan pertanyaan, dan tak bisa menolak. Justru bagian-bagian itulah yang membuat tool ini aman dipakai dengan cepat — dan cepat adalah satu-satunya cara ia pernah dipakai.
C. Di mana ini berhenti jadi tool yang tepat
Ia pembungkus yang punya pendirian, dan pendiriannya tak cocok di mana-mana.
Penghapusan bukan opsional di sini, jadi ini tool yang keliru untuk menggabungkan dua folder atau untuk menambahkan file tanpa menyentuh yang sudah ada — rsync polos tanpa flag itu mengerjakannya, dan sebaiknya dijalankan langsung. Prompt konfirmasinya berarti ia tak bisa dipakai tanpa ditunggui, dan itu mencoret cron sama sekali; penyamaan terjadwal butuh script lain tanpa langkah interaktif. Lalu ia menyalin pohon folder sebagaimana adanya pada satu saat tertentu, dan itu bukan backup, sebab salinan setia atas file yang rusak sejam lalu adalah salinan setia atas file yang rusak.
Simpulan
Tool yang paling sering saya pakai justru yang paling sedikit memuat kode asli buatan saya. Satu baris mengerjakan pekerjaannya, dan baris itu bisa ditulis siapa saja setelah sepuluh menit membaca manual page. Yang menuntut pemikiran adalah segala yang mengelilinginya: memutuskan bahwa kesetiaan mencakup kepemilikan walau kepemilikan cuma selamat bila punya hak khusus, memutuskan bahwa menyamakan menuntut penghapusan dan karena itu menuntut pagar, serta memutuskan bahwa tujuan yang paling cepat diketik justru yang harus ditolak mentah-mentah.
Pola yang akan saya bawa ke tool berikutnya: nilai sebuah pembungkus terletak pada apa yang ia jadikan mustahil, bukan pada apa yang ia jadikan pendek. Memendekkan perintah berbahaya cuma membuatnya lebih gampang dijalankan secara berbahaya. Alasan saya mempercayakan folder production kepada tool ini bukan karena ia nyaman — melainkan karena saya tahu persis tiga hal apa yang akan ia tolak, dan saya tahu gagasannya tentang salinan yang setia sama dengan gagasan saya.
Istilah
- Salinan setia
- Salinan yang mengulang bukan cuma isi file melainkan catatan filesystem tentangnya — owner, group, permission, waktu modifikasi, dan pembedaan antara symlink dengan sasarannya.
- Menyamakan
- Membuat tujuan setara dengan sumber, termasuk membuang dari tujuan apa pun yang sudah tak dimuat sumber. Berbeda dari menyalin, yang cuma bisa menambah.
- Kepemilikan
- User dan group yang tercatat pada sebuah file. Mengubah owner sebuah file ke user lain adalah operasi berhak khusus, jadi mempertahankan kepemilikan lintas salinan menuntut dijalankan sebagai root.
- Permission
- Bit yang mencatat siapa di antara owner, group, dan others yang boleh membaca, menulis, atau menjalankan sebuah file. Service kerap menolak start ketika bit ini lebih longgar dari yang diharapkan.
- Garis miring ujung
- Pada rsync, garis miring di ujung path sumber berarti "isi folder ini"; ketiadaannya berarti "folder ini sendiri", yang lalu mendarat bersarang di dalam tujuan.
- Melanjutkan
- Meneruskan transfer yang terganggu. Di sini berlaku antar file — file yang sudah terkirim dilewati — tapi tidak di dalam satu file, yang data separuhnya dibuang.
Technologies covered
- Bash
- rsync
- SSH
- Linux