การเปรียบเทียบอุปกรณ์บล็อกดิบ


12

มียูทิลิตี้ (หรือเวทย์มนตร์เชลล์) ที่ทำให้ฉันสามารถเปรียบเทียบอุปกรณ์บล็อกสองอันได้หรือไม่?

รายละเอียด: ฉันมีอุปกรณ์ RAID ขนาดใหญ่ (0.5 TB) ที่ฉันสำรองข้อมูลไปยังอุปกรณ์ SATA ที่ใหญ่กว่าเล็กน้อยโดยใช้ dd อุปกรณ์มีหลายพาร์ติชัน แต่ฉันคัดลอกจากอุปกรณ์ 'parent' ไม่ใช่โหนดอุปกรณ์ที่แบ่งพาร์ติชัน (เช่นฉันคัดลอก / dev / hda และไม่ใช่ / dev / hda1 เป็นต้น)

ฉันต้องการตรวจสอบว่าการสำรองข้อมูลดี / ถูกต้อง

ฉันคิดเกี่ยวกับการใช้ md5sum ในแต่ละอุปกรณ์ แต่นั่นจะไม่ให้ผลลัพธ์ที่ถูกต้องกับฉันเนื่องจากอุปกรณ์ที่สองมีขนาดใหญ่กว่าครั้งแรกเล็กน้อยดังนั้นไบต์พิเศษจะเปลี่ยนแฮช

คำตอบ:


13

ฉันจะใช้คำสั่ง

cmp /dev/hda /dev/hdb

มันจะหยุดที่ไบต์ที่แตกต่างแรกเขียนออฟเซ็ตหรือบน EOF ที่สั้นกว่า


ฉันไม่เห็นอะไรใน manpage เกี่ยวกับการหยุดที่ EOF นั่นคือเอกสารที่ไหนสักแห่ง?
Kevin

ในความเป็นจริงสถานะการออกจะบอกว่า: "1: ไฟล์ต่างกันซึ่งรวมถึงกรณีที่ไฟล์หนึ่งไฟล์เหมือนกับส่วนแรกของอีกไฟล์" ดูเหมือนว่าจะไม่ได้รายงานว่าเหมือนกันหากมีขนาดสั้นกว่า
Kevin

@Kevin: จากinfo cmp: "คำสั่ง 'cmp' เปรียบเทียบสองไฟล์และหากมีความแตกต่างให้บอกไบต์แรกและหมายเลขบรรทัดที่พวกเขาแตกต่างกัน"
enzotib

1
คุณสามารถใช้--bytes=LIMITตัวLIMITเลือกตั้งค่าเป็นไบต์ของอุปกรณ์ขนาดเล็กเพื่อหยุดที่ส่วนท้ายของไดรฟ์ขนาดเล็ก (หรือขอบเขตพาร์ติชัน) โดยไม่ต้องcmpออกด้วยสถานะที่ไม่เป็นศูนย์
rozcietrzewiacz

ถ้าฉันมี copy / dev / loop0 ของ / dev / sda และฉันเปลี่ยนเป็น / dev / loop0 ฉันจะเพิ่มการเปลี่ยนแปลงใหม่ใน / dev / sda ได้อย่างไร? ขอขอบคุณ
Milor123

2

อาจจะเร็วที่สุดในการติดตั้งระบบไฟล์และทำ

diff -qr /mnt/root1 /mnt/root2

มิฉะนั้นฉันจะพูดบางสิ่งเช่นนี้:

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

เห็นได้ชัดว่าคุณต้องสร้างbsและcountหยุดที่ (หรือก่อนหน้านี้ถ้าสะดวกกว่า) ในตอนท้ายของไดรฟ์ขนาดเล็ก

หรือด้วยความเห็นของ enzotib ดูเหมือนว่าคุณสามารถใช้งานcmpได้ แต่คุณจะต้อง-nตั้งค่าสถานะเพื่อ จำกัด จำนวนไบต์ให้สั้นลงสำหรับไดรฟ์ทั้งสองตัว

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

น่าเสียดายที่ฉันไม่สามารถเมานต์อุปกรณ์เป็นโวลุ่ม NTFS และฉันมี LiveCD โดยไม่มีไดรเวอร์ที่ถูกต้อง สำหรับคำสั่งที่สอง subshells ที่คุณใช้อย่าพยายามดูดอุปกรณ์ทั้งหมดเข้าสู่หน่วยความจำก่อนป้อนลงใน diff?
alanxz

1
@alanxz ไม่diffsubshells จะไม่อ่านอุปกรณ์ทั้งหมดก่อนที่จะเขียน ddเขียนbsไบต์ทันทีหลังจากอ่าน (หรือการประมวลผลหากระบุไม่ใช่ที่นี่) และพวกเขาเขียนไปยังfifos ซึ่งบล็อกจนกว่าพวกเขาจะอ่าน
Kevin

ฉันกำลังคิดถึงระดับเชลล์มากขึ้น (หรืออะไรก็ตามที่ใช้ FIFO) แต่นั่นตอบคำถามของฉัน!
alanxz

2

คุณกำลังมองหาซอฟต์แวร์เลขฐานสอง

rdiff
ถูกออกแบบมาสำหรับการสำรองข้อมูลและการส่งผ่านเครือข่ายดูที่ rdiff-backup และความซ้ำซ้อนในการสำรองข้อมูล

xdelta3
เป็นไบนารีโอเพนซอร์ซแตกต่างเครื่องมือบีบอัดข้อมูล VCDIFF (RFC 3284) การบีบอัดเดลต้า

bsdiff
ก็เช่นกัน !! หน่วยความจำหิวไม่เหมาะสำหรับอุปกรณ์บล็อก


1

มียูทิลิตีที่ชื่อbsdiffซึ่งทำสิ่งนี้ได้อย่างแน่นอน มันทำได้เร็วจริง ๆ และสามารถสร้างไบนารีแพตช์ได้หากคุณต้องการ

ดูโพสต์นี้สำหรับคำอธิบายรอบ ๆ


bsdiffงาน 's cmpมีความซับซ้อนมากกว่าเพียงแค่การเปรียบเทียบสองไฟล์ดังนั้นฉันสงสัยมันอาจจะเร็วกว่าที่เรียบง่าย
enzotib

ลิงก์เสีย
โอเว่นพอล

1

คุณสามารถเปรียบเทียบอุปกรณ์บล็อกที่มีขนาดต่างกันสองชนิดโดยใช้md5sumสิ่งนี้:

(สมมติว่าอุปกรณ์มีขนาดเล็กลง/dev/sda)

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

0

พิจารณาทำงานfsckกับการสำรองข้อมูล คุณอาจต้องเล่นลูกเล่นด้วยlosetupเพื่อให้อุปกรณ์ลูปแบ็คตั้งอยู่ในพาร์ติชั่นที่ฝังอยู่ในการสำรองข้อมูล แต่ถ้าการตรวจสอบไฟล์บอกว่าโครงสร้างไฟล์มีความสอดคล้องกันข้อมูลเองก็น่าจะดี

หากคุณต้องการการตรวจสอบเต็มรูปแบบคุณสามารถใช้อุปกรณ์ย้อนกลับพร้อมออฟเซ็ตเพื่อดู 'พาร์ติชัน' ภายในของการสำรองข้อมูลและ md5sum แต่ละรายการแยกกัน แต่การบังคับfsckอาจให้แนวคิดพื้นฐานที่เร็วกว่าไบต์สำหรับการเปรียบเทียบไบต์หรือการตรวจสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.