Apakah rsync memverifikasi file yang disalin antara dua drive lokal?

65

Saya ingin membuat salinan baru dari sejumlah besar file dari satu drive lokal ke drive lain.

Saya telah membaca bahwa rsync melakukan perbandingan checksum dari file ketika mengirimnya ke mesin jarak jauh melalui jaringan.

  1. Akankah rsync membuat perbandingan saat menyalin file antara dua drive lokal?

  2. Jika memang melakukan verifikasi - apakah ini taruhan yang aman? Atau lebih baik melakukan perbandingan byte demi byte?

Frez
sumber

Jawaban:

77

rsync selalu menggunakan checksum untuk memverifikasi bahwa file telah ditransfer dengan benar. Jika file tujuan sudah ada, rsync dapat melewati pembaruan file jika waktu dan ukuran modifikasi sesuai dengan file sumber, tetapi jika rsync memutuskan bahwa data perlu ditransfer, checksum selalu digunakan pada data yang ditransfer antara proses pengiriman dan penerimaan rsync . Ini memverifikasi bahwa data yang diterima sama dengan data yang dikirim dengan probabilitas tinggi, tanpa overhead yang berat dari perbandingan tingkat byte melalui jaringan.

Setelah data file diterima, rsync menulis data ke file dan percaya bahwa jika kernel mengindikasikan penulisan berhasil, data ditulis tanpa korupsi ke disk. rsync tidak membaca ulang data dan membandingkannya dengan checksum yang dikenal sebagai cek tambahan.

Adapun verifikasi itu sendiri, untuk protokol 30 dan seterusnya (pertama kali didukung pada 3.0.0), rsync menggunakan MD5 . Untuk protokol yang lebih lama, checksum yang digunakan adalah MD4 .

Sementara lama dianggap usang untuk hash kriptografi yang aman, MD5 dan MD4 tetap memadai untuk memeriksa korupsi file.

Sumber: halaman manual dan melihat kode sumber rsync untuk memverifikasi.

Kyle Jones
sumber
3
Saya benci untuk memecahkan gelembung semua orang tetapi rsync hanya memeriksa verifikasi jumlah jika flag -c ditambahkan!
27
@clint Tidak, jawabannya benar. Dari penjelasan -cbendera halaman manual : "Perhatikan bahwa rsync selalu memverifikasi bahwa setiap file yang ditransfer direkonstruksi dengan benar di sisi penerima dengan memeriksa checksum seluruh file yang dihasilkan saat file ditransfer, tetapi otomatis setelah transfer. verifikasi tidak ada hubungannya dengan opsi ini sebelum transfer "Apakah file ini perlu diperbarui?" centang. "
Michael Mrozek
7
Jawaban ini tidak memperjelas apakah itu benar-benar memverifikasi file setelah salinan. Jika checksum dihitung saat file diterima, maka itu bukan checksum pasca-salin dan Anda tidak dapat memastikan bahwa file ditulis dengan benar. Anda kemudian perlu melakukan perbandingan tambahan.
Andre Miller
7
Voting karena saya tidak suka fakta bahwa jawaban ini ditulis dengan baik dan secara teknis benar dan pada saat yang sama terlalu banyak topik yang menyesatkan pembaca. Masalahnya adalah bahwa jawabannya masuk ke detail yang sangat besar tentang apa yang terjadi selama transfer sementara penanya secara khusus menyatakan bahwa ia peduli tentang salinan lokal dan bukan transfer jaringan. Saya cukup yakin Kyle Jones tidak ingin menyesatkan siapa pun tetapi jawaban ini (IMHO) tidak.
ndemou
4
Kyle, aku tidak percaya jawabanmu salah. Saya sudah mencatat bahwa itu "ditulis dengan baik dan terperinci secara teknis benar" tetapi mengharuskan pembaca untuk menjadi tidak perlu fokus dan hati-hati. Mengapa menutupi kurangnya verifikasi data disk yang sedang dipertanyakan di tengah jawaban Anda setelah 117 kata yang berulang kali menggambarkan proses verifikasi yang tidak relevan lainnya? Bagaimanapun, terima kasih atas waktu dan minat Anda dalam diskusi ini. Saya sangat menghargainya.
ndemou
40

rsynctidak tidak melakukan verifikasi pasca-copy untuk salinan file lokal. Anda dapat memverifikasi bahwa itu tidak dengan menggunakan rsyncuntuk menyalin file besar ke drive lambat (yaitu USB), dan kemudian menyalin file yang sama dengan cp, yaitu:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Kedua perintah membutuhkan waktu yang sama, oleh karena itu rsynctidak mungkin melakukan checksum — karena itu akan melibatkan membaca kembali file tujuan dari disk lambat.

The manHalaman sayangnya menyesatkan tentang hal ini. Saya juga memverifikasi ini dengan — stracesetelah salinannya selesai, rsynctidak ada read()panggilan pada file tujuan, sehingga tidak dapat diperiksa lagi. Satu lagi yang dapat Anda verifikasi adalah dengan sesuatu seperti iotop: Anda melihat rsyncmembaca dan menulis secara bersamaan (menyalin dari sumber ke tujuan), lalu keluar. Jika memverifikasi integritas, akan ada fase hanya baca.

Felix
sumber
1
"Sayangnya halaman manual menyesatkan tentang ini. Saya juga memverifikasi ini dengan strace" Apakah Anda strace remote, menjalankan proses rsync atau yang lokal? Ada dua ... satu berjalan di tujuan, bahkan ketika Anda menggunakan ssh.
user129070
8
Tidak ada verifikasi pasca-salin untuk salinan apa pun, lokal atau jarak jauh. Anda menjalankan rsync -clagi jika Anda ingin memaksanya untuk memeriksa.
psusi
Verifikasi dilakukan pada aliran masuk saat berjalan. Tidak perlu membacanya kembali dari disk jika sistem file telah mengkonfirmasi itu telah ditulis.
Stop Harming Monica
17

rsyncmembuat perbandingan checksum sebelum menyalin (dalam beberapa kasus), untuk menghindari menyalin apa yang sudah ada. Maksud perbandingan checksum adalah untuk tidak memverifikasi bahwa salinan berhasil. Itulah tugas dari infrastruktur yang mendasarinya: driver sistem file, driver disk, driver jaringan, dll. Aplikasi individual seperti rsynctidak perlu repot dengan kegilaan ini. Yang rsyncperlu Anda lakukan (dan lakukan!) Adalah memeriksa nilai pengembalian panggilan sistem untuk memastikan tidak ada kesalahan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Ini sepertinya bertentangan dengan jawaban yang diterima ...
djule5
2
@ djule5 Dengan cara apa? Jawaban yang diterima tampaknya kebanyakan tentang bagaimana rsync memeriksa file yang ditransfer , tetapi pertanyaannya, dan jawaban saya, adalah tentang salinan lokal .
Gilles 'SANGAT berhenti menjadi jahat'
3
Ok, baik dalam konteks itu saya setuju itu lebih masuk akal. Jadi "Poin perbandingan checksum adalah untuk tidak memverifikasi bahwa salinan berhasil" hanya berlaku untuk salinan lokal ; dan "checksum selalu digunakan pada data yang ditransfer antara proses pengiriman dan penerimaan rsync" hanya berlaku untuk salinan yang ditransfer . Saya menemukan jawaban yang diterima menyesatkan sehubungan dengan pertanyaan dan percaya jawaban Anda harus yang diterima (hanya 2 sen saya).
djule5
Saya masih merasa jawaban ini sedikit menyesatkan. Sebagai contoh, ia mengatakan bahwa driver jaringan khususnya memverifikasi jika salinan berhasil - tetapi jika Anda mengatakan bahwa perbandingan checksum tidak memverifikasi jika salinan berhasil hanya untuk lokal, driver jaringan tidak akan ikut berperan.
Ken,
1
@ Aku tidak mengerti maksudmu. Saya curiga Anda salah membaca sesuatu. Driver jaringan ikut bermain hanya jika ada salinan jaringan. Rsync sendiri melakukan perbandingan checksum sebelum melakukan salinan apa pun, untuk memutuskan apakah akan menyalin. Rsync tidak melakukan perbandingan checksum setelah menyalin (karena tidak ada gunanya: ia tahu apa yang baru saja disalin).
Gilles 'SANGAT berhenti menjadi jahat'
4

Jawaban cepat dan kotor, langsung ke pertanyaan.

T: Apakah akan rsyncmembuat perbandingan saat menyalin file antara dua drive lokal? A: Ini akan melakukan perbandingan untuk mengetahui apa yang akan disalin.

T: Jika memang melakukan verifikasi - apakah ini taruhan yang aman? Atau lebih baik melakukan perbandingan byte demi byte? A: seaman matematika di balik MD5 checksum file. Anda dapat mencoba melakukan percobaan sederhana untuk mempelajari dan mempercayai alat tersebut.

Jawaban panjang: Saya kira, Anda ingin rsyncmelakukan perbandingan file (sedikit demi sedikit atau dengan checksum) setelah menyalin file. Jika Anda salah satu dari sedikit yang menghargai integritas data, Anda mungkin menemukan hal-hal berikut berguna:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

rsyncfolder file kode di atas pada saat dijalankan pertama dan jika selesai tanpa masalah, akan rsyncsegera berjalan lagi saat melakukan perbandingan nama file yang sama dengan menggunakan hash seluruh file.

M N
sumber
1

Menggunakan rsync untuk memverifikasi integritas duplikat

Untuk menjamin bahwa tes ini secara fisik membaca kembali file dari media drive, saya sarankan mematikan kedua drive dan me-restart mereka sebelum menjalankan tes ini. Ini akan menghapus cache volatile internal mereka.

Jika tidak juga me-restart Linux, Anda setidaknya harus meletakkan cache ( * ) dengan:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Kemudian untuk membaca kembali kedua pohon dan membandingkan checksum mereka:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

Checksum rsync modern menggunakan MD5, yaitu 128 bit. Kemungkinan kegagalan untuk mendeteksi kesalahan dalam file individual ini sangat rendah (beberapa diskusi di sini ), tetapi bukan tidak mungkin.

bangsawan
sumber
Semoga berhasil memotong garis miring dengan benar.
nobar
Tidak ada berita adalah kabar baik.
Nobar
Jangan repot-repot --checksumsampai tes berlalu tanpa itu.
nobar