Lanjutkan transfer satu file oleh rsync

52

Di Ubuntu, saya ingin menyalin file besar dari hard drive saya ke drive yang dapat dilepas oleh rsync. Untuk beberapa alasan lain, operasi tidak dapat selesai dalam sekali jalan. Jadi saya mencoba mencari cara rsyncuntuk melanjutkan menyalin file dari tempat terakhir kali.

Saya telah mencoba menggunakan opsi --partialatau --inplace, tetapi bersama-sama dengan --progress, saya menemukan rsyncdengan --partialatau --inplacebenar - benar dimulai dari awal, bukan dari apa yang tersisa terakhir kali. Berhenti secara manual rsynclebih awal dan memeriksa ukuran file yang diterima juga mengkonfirmasi apa yang saya temukan.

Tetapi dengan --append, rsync dimulai dari apa yang tersisa terakhir kali.

Saya bingung karena saya melihat di halaman manual --partial , --inplacedan --appendtampaknya berhubungan dengan melanjutkan menyalin dari apa yang tersisa terakhir kali. Apakah seseorang dapat menjelaskan perbedaannya? Mengapa tidak --partialatau --inplacebekerja untuk melanjutkan menyalin? Apakah benar bahwa untuk melanjutkan penyalinan, rsyncharus bekerja dengan --appendopsi?

Juga, jika sebagian file ditinggalkan oleh mvatau cp, bukan oleh rsync, apakah akan rsync --appendmelanjutkan menyalin file dengan benar?

Tim
sumber

Jawaban:

39

Untuk melanjutkan salinan yang terputus, Anda harus menggunakan rsync --append. Dari penjelasan halaman manual tentang --append:

Ini menyebabkan rsync memperbarui file dengan menambahkan data ke bagian akhir file, yang menganggap bahwa data yang sudah ada di sisi penerima identik dengan awal file di sisi pengiriman. [...] Tersirat --inplace, [...]

Opsi --inplacemembuat rsync(over) menulis konten file tujuan secara langsung; tanpa --inplace , rsyncakan:

  1. buat file baru dengan nama sementara,
  2. menyalin konten yang diperbarui ke dalamnya,
  3. tukar dengan file tujuan, dan akhirnya
  4. hapus salinan lama dari file tujuan.

Mode operasi normal terutama mencegah konflik dengan aplikasi yang mungkin membuka file tujuan, dan beberapa kecelakaan lain yang tercantum di halaman rsyncmanual.

Perhatikan bahwa, jika operasi penyalinan / pembaruan gagal pada langkah 1.-3. di atas, rsyncakan menghapus file tujuan sementara; yang --partial pilihan menonaktifkan perilaku ini dan rsyncakan meninggalkan file-file sementara sebagian-ditransfer pada filesystem tujuan. Dengan demikian, melanjutkan operasi penyalinan file tunggal tidak akan mendapatkan banyak kecuali Anda memanggil yang pertama rsyncdengan --partialatau --partial-dir(efek yang sama seperti --partial, di samping menginstruksikan rsync untuk membuat semua file sementara di direktori tertentu).

Riccardo Murri
sumber
Terima kasih! Jika sebagian file ditinggalkan oleh mv atau cp bukan oleh rsync, apakah rsync --append melanjutkan resume penyalinan file dengan benar?
Tim
1
@ Tim Singkatnya, --appendmerek rsyncpercaya bahwa, jika dua sesuai file memiliki panjang yang berbeda, maka lebih pendek identik dengan bagian awal dari yang satu lagi. Jadi, ya, jika Anda mulai menyalin file besar dengan cpdan mengganggu proses salin, maka rsync --appendhanya akan menyalin bagian file yang tersisa. ( Catatan: jika cpterganggu oleh sistem crash, ada kemungkinan kecil bahwa isi file dan metadata tidak sinkron, yaitu file rusak. Dalam hal ini, berjalan rsyncsekali lagi tanpa --append harus memperbaiki masalah.)
Riccardo Murri
2
Jadi, jika saya memahami ini dengan benar, tidak ada cara untuk memberitahu rsync untuk memverifikasi sebagian file dan melanjutkan transfer ke file yang ditransfer sebagian ?
Winny
1
@ Winny, sangat terlambat: untuk salinan lokal tidak ada cara yang masuk akal untuk melakukan ini. Untuk salinan jaringan, ini adalah mode default ketika Anda menentukan --partialtanpa --append.
roaima
1
@ Winny --appenddan --append-verifymemiliki kasus kegagalan yang berbahaya: ketika file penerima berukuran sama atau lebih besar tetapi memiliki data yang berbeda. Saya menyarankan solusi yang berbasis di sekitar--no-whole-file sebagai gantinya.
Tom Hale
21

Sadarilah itu --appendmenyiratkan --inplace, yang dengan sendirinya menyiratkan --partial.

  • Dengan hanya menggunakan --partialAnda harus rsyncmeninggalkan transfer parsial dan melanjutkannya dalam upaya berikutnya.

  • Dengan menggunakan --appendAnda harus menyebabkan rsynckedua meninggalkan sebagian file dan melanjutkannya di lain waktu. Setelah transfer rsyncharus memverifikasi checksum dari data yang dikirimkan saja.

  • --append-verify termasuk seluruh file dalam verifikasi checksum, termasuk setiap bagian yang ditransfer dalam transfer sebelumnya.

  • Dengan salah satu --appendatau --append-verifygagal checksum verifikasi harus menyebabkan file akan dikirim kembali sepenuhnya (menggunakan --inplace)

Anda harus dapat melanjutkan mvatau cpberoperasi dengan rsynctetapi Anda mungkin ingin menggunakan --append-verifyopsi untuk ketenangan pikiran.

Perhatikan bahwa menggunakan --appendpenyebab rsyncuntuk menyalin hanya file-file yang memiliki ukuran pada penerima lebih pendek daripada ukuran pada pengirim (terlepas dari stempel waktu), atau tidak ada pada penerima. Dengan dokumentasi opsi ini:

Jika suatu file perlu ditransfer dan ukurannya pada penerima adalah sama atau lebih panjang dari ukuran pada pengirim, file tersebut dilewati.

Info lebih lanjut di halaman manual

TomG
sumber
--appenddan --append-verifymemiliki kasus kegagalan berbahaya: ketika file penerima berukuran sama atau lebih besar tetapi memiliki data yang berbeda. Saya menyarankan solusi yang berbasis di sekitar--no-whole-file sebagai gantinya.
Tom Hale
@ TomHale, dokumentasi menunjukkan bahwa agar file dapat dilewati, file tersebut harus memiliki ukuran dan waktu modifikasi yang persis sama di kedua ujungnya. Jika ini merupakan keprihatinan yang masuk akal maka --checksumharus digunakan. Saya tidak dapat menemukannya ditentukan secara eksplisit, tetapi secara logis salah satu dari opsi yang dapat dilanjutkan harus menyiratkan --no-whole-filekarena --whole-fileharus tidak kompatibel.
TomG
--append-verifyakan melewati file berukuran sama atau lebih besar dengan tanggal berbeda , yang mungkin "tidak terduga". Tidak perlu --checksum semua file, karena rsyncakan melakukan checksum seluruh file, tetapi hanya pada apa yang ditransfer.
Tom Hale
--checksummemberitahu rsyncchecksum file sebelum mengirim yang memastikan bahwa semua file yang diubah ditransfer, terlepas dari ukuran / waktu. Sudahkah Anda mendapatkan sumber untuk --append-verifyperilaku tak terduga karena apa yang Anda gambarkan tidak cocok dengan dokumentasi atau pengalaman saya (terbatas)?
TomG
--append-verifymengacu pada --appendyang mengatakan: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Bahkan jika suatu file perlu ditransfer karena --checksum, masih dapat dilewati.
Tom Hale
6

David Schwartz benar, --partial(atau lebih baik, -P) melakukan apa yang Anda inginkan. Saya memverifikasi ini pada file 37G yang dihentikan ~ 8g ke dalamnya, melalui jaringan. rsync dengan cepat memindai bagian-bagian pertama dari parsial (menunjukkan kemajuan seperti yang akan terjadi berkat -P), dan kemudian melanjutkan transfer ke akhir file parsial.

Steve Byrne
sumber
Salinan jaringan diperlakukan berbeda dengan salinan lokal, yang merupakan masalah di sini.
roaima
@roaima Apakah Anda memiliki sumber untuk itu, atau dokumen yang menjelaskan secara lebih rinci apa perbedaannya? Saya gagal menemukannya di halaman (besar).
Jonas Schäfer
@JonasWielicki halaman manual menyinggung tentang itu di bawah --whole-filedeskripsi opsi.
roaima
@roaima Terima kasih banyak! Ini juga berarti bahwa solusi yang tepat adalah --no-W(yang sebenarnya berfungsi!)
Jonas Schäfer
@JonasWielicki ini sangat tidak efisien, oleh karena itu dinonaktifkan secara default. Anda benar-benar tidak ingin menggunakan --no-Wkecuali Anda mengerti persis apa artinya pengaturan untuk file lokal. Lihat unix.stackexchange.com/a/181018/100397
roaima
2

Anda melakukannya dengan benar, --partialmelakukan apa yang Anda inginkan. Tampaknya mulai dari awal karena selalu dimulai pada awal daftar potongan data file yang perlu disalin. The --appendpilihan adalah berbahaya dan akan menghasilkan file korup jika data tidak cocok untuk beberapa alasan.

David Schwartz
sumber
Salinan lokal tidak dibandingkan, mereka hanya ditimpa (atau dengan --appendmelanjutkan dari byte offset).
roaima
1

Secara default, rsyncakan memungkinkan --whole-filejika mentransfer dari disk lokal ke disk lokal. Ini akan memulai kembali transfer yang terputus dari awal, daripada memeriksa bagian-bagian yang sudah ada.

Untuk menonaktifkan ini, gunakan:

--no-whole-file

Menggabungkan ini dengan salah satu --inplaceatau --partialakan memungkinkan melanjutkan transfer nanti.

Alias ​​saya untuk digunakan rsyncuntuk menyalin adalah:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Peringatan : hati-hati menggunakan --append-verifykarena akan melewati file tujuan yang ukurannya sama atau lebih besar.

Tom Hale
sumber
Untuk transfer jaringan rsyncmembandingkan sumber dan file tujuan yang sesuai sebelum mentransfer untuk mengirim hanya bagian-bagian yang telah berubah (delta-transfer). --no-whole-filememberitahu rsyncuntuk melakukan hal yang sama untuk menyalin lokal ke lokal. Dokumentasi tidak menyarankan itu akan berdampak pada melanjutkan transfer parsial file tunggal. rsyncakan melewatkan file dengan ukuran dan stempel waktu yang sama persis dengan desain. Tidak --append-verifyjuga --no-whole-fileseharusnya mengubah perilaku itu tetapi --checksumharus bekerja dengan baik untuk ketenangan pikiran dengan biaya disk IO
TomG
--append-verifyakan melewati file berukuran sama atau lebih besar dengan tanggal berbeda , yang mungkin "tidak terduga". Tidak perlu --checksum semua file, karena rsyncakan melakukan checksum seluruh file, tetapi hanya pada apa yang ditransfer.
Tom Hale