Perbandingan perangkat blok mentah


12

Apakah ada utilitas (atau beberapa shell magic) yang memungkinkan saya untuk membandingkan dua perangkat blok?

Detail: Saya memiliki satu perangkat RAID besar (0,5 TB) yang telah saya cadangkan ke perangkat SATA yang sedikit lebih besar menggunakan dd. Perangkat memiliki beberapa partisi di atasnya, namun saya menyalin dari perangkat 'induk' dan bukan node perangkat dipartisi (misalnya, saya menyalin / dev / hda dan bukan / dev / hda1 misalnya).

Saya ingin memverifikasi bahwa cadangan baik / benar.

Saya telah berpikir tentang menjalankan md5sum di setiap perangkat, namun itu tidak akan memberi saya hasil yang akurat karena perangkat kedua sedikit lebih besar dari yang pertama dan dengan demikian byte tambahan akan mengubah hash.

Jawaban:


13

Saya akan menggunakan perintah

cmp /dev/hda /dev/hdb

ia akan berhenti pada byte pertama yang berbeda, menuliskan offsetnya, atau pada EOF pada byte yang lebih pendek.


Saya tidak melihat di manual apa pun tentang berhenti di EOF, apakah itu didokumentasikan di suatu tempat?
Kevin

Bahkan, status keluar mengatakan: "1: File-file berbeda; ini termasuk kasus di mana satu file identik dengan bagian pertama dari yang lain." Ini sepertinya menyiratkan bahwa itu tidak melaporkan mereka sebagai identik jika seseorang lebih pendek.
Kevin

@Kevin: from info cmp: "Perintah 'cmp' membandingkan dua file, dan jika mereka berbeda, memberi tahu byte pertama dan nomor baris di mana mereka berbeda."
enzotib

1
Anda dapat menggunakan --bytes=LIMITopsi, mengatur LIMITnilai ke bytesize dari perangkat yang lebih kecil untuk berhenti di akhir drive yang lebih kecil (atau batas partisi) tanpa harus cmpkeluar dengan status bukan nol.
rozcietrzewiacz

jika saya memiliki salinan / dev / loop0 dari / dev / sda dan saya melakukan perubahan ke / dev / loop0, bagaimana saya bisa menambahkan perubahan baru ke / dev / sda ?? Terima kasih
Milor123

2

Bergantung pada seberapa penuh drive sebenarnya, mungkin lebih cepat untuk me-mount sistem file dan melakukan

diff -qr /mnt/root1 /mnt/root2

Kalau tidak, saya akan mengatakan sesuatu seperti ini:

diff -q <(dd bs=1M count=500K if=/dev/sda) <(dd bs=1M count=500K if=/dev/sdb)

Jelas mencari tahu seberapa besar Anda perlu membuat bsdan countberhenti di (atau sebelum itu jika jauh lebih nyaman) ujung drive yang lebih kecil.

Atau, berkat komentar enzotib, sepertinya Anda bisa menggunakan cmp, tetapi Anda akan memerlukan -nbendera untuk membatasi jumlah byte ke yang lebih pendek dari dua drive.

cmp /dev/sda /dev/sdb -n 500GB

Sayangnya saya tidak dapat memasang perangkat sebagai volume NTFS, dan saya memiliki LiveCD tanpa driver yang tepat. Untuk perintah kedua subkulit yang Anda gunakan jangan mencoba untuk menyedot seluruh perangkat ke dalam memori sebelum memasukkannya ke dalam diff?
alanxz

1
@alanxz Tidak, diffsubkulit tidak akan membaca seluruh perangkat sebelum menulisnya. ddmenulis bsbyte segera setelah membacanya (atau memproses jika ditentukan, tidak di sini), dan mereka menulis ke fifos, yang memblokir sampai mereka dibaca.
Kevin

Saya lebih banyak berpikir pada level shell (atau apa pun yang mengimplementasikan FIFO). Tapi itu menjawab pertanyaanku!
alanxz

2

Anda mencari perangkat lunak biner

rdiff
dirancang untuk backup dan transmisi jaringan, lihat rdiff-backup dan dupity untuk backup propuse

xdelta3
adalah sumber biner diferensial, alat kompresi diferensial, kompresi delta VCDIFF (RFC 3284).

bsdiff
juga !! haus memori, tidak cocok untuk perangkat blok.


1

Ada sebuah utilitas bernama bsdiff , yang melakukan hal semacam ini. Itu benar-benar cepat, dan dapat menghasilkan tambalan biner, jika Anda perlu.

Lihat posting ini untuk penjelasan di sekitarnya.


bsdiffPekerjaan lebih kompleks daripada hanya membandingkan dua file, jadi saya ragu itu bisa lebih cepat daripada yang lebih sederhana cmp.
enzotib

Tautan rusak.
Owen Pauling

1

Anda dapat membandingkan dua perangkat blok berukuran berbeda menggunakan md5sumseperti ini:

(dengan asumsi perangkat yang lebih kecil /dev/sda)

# md5sum /dev/sda && head -c $(blockdev --getsize64 /dev/sda) /dev/sdb | md5sum

0

Pertimbangkan berjalan fsckdi cadangan. Anda mungkin perlu memainkan beberapa trik losetupuntuk mendapatkan perangkat loopback diatur pada partisi yang tertanam dalam cadangan, tetapi jika pemeriksaan file mengatakan struktur file konsisten, data itu sendiri kemungkinan bagus.

Jika Anda menginginkan checksum lengkap, Anda dapat menggunakan perangkat loopback dengan offset untuk melihat 'partisi' internal masing-masing dari cadangan dan md5sum secara terpisah, tetapi yang dipaksakan fsckmungkin memberi Anda ide dasar yang jauh lebih cepat daripada perbandingan byte demi byte atau perhitungan checksum.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.