rsync ตรวจสอบไฟล์ที่คัดลอกระหว่างไดรฟ์ในเครื่องหรือไม่


65

ฉันต้องการสร้างสำเนาใหม่ของไฟล์จำนวนมากจากไดรฟ์ภายในเครื่องไปยังอีกเครื่องหนึ่ง

ฉันอ่านแล้ว rsync ทำการเปรียบเทียบการตรวจสอบไฟล์เมื่อส่งข้อมูลไปยังเครื่องระยะไกลผ่านเครือข่าย

  1. rsync จะทำการเปรียบเทียบเมื่อทำการคัดลอกไฟล์ระหว่างไดรฟ์ในเครื่องหรือไม่

  2. ถ้ามันทำการตรวจสอบ - มันเป็นเดิมพันที่ปลอดภัยหรือไม่ หรือมันจะดีกว่าที่จะทำการเปรียบเทียบแบบไบต์ต่อไบต์?

คำตอบ:


77

rsync ใช้ checksums เสมอในการตรวจสอบว่าไฟล์ถูกถ่ายโอนอย่างถูกต้อง ถ้าแฟ้มปลายทางอยู่แล้ว rsync อาจข้ามการปรับปรุงแฟ้มถ้าปรับเปลี่ยนเวลาและขนาดตรงกับแฟ้มแหล่งที่มา แต่ถ้า rsync ตัดสินใจว่าข้อมูลที่จะต้องมีการโอน checksums จะเสมอใช้ในการส่งข้อมูลระหว่างการส่งและรับกระบวนการ rsync . สิ่งนี้จะตรวจสอบว่าข้อมูลที่ได้รับนั้นเป็นข้อมูลเดียวกันกับข้อมูลที่ส่งด้วยความน่าจะเป็นสูงโดยไม่ต้องมีค่าใช้จ่ายมากในการเปรียบเทียบระดับไบต์ผ่านเครือข่าย

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

ในฐานะที่เป็นสำหรับการตรวจสอบของตัวเองสำหรับโปรโตคอล 30 และเกิน (ได้รับการสนับสนุนเป็นครั้งแรกใน 3.0.0) rsync ใช้MD5 สำหรับโปรโตคอลที่มีอายุมากกว่าการตรวจสอบที่ใช้MD4

ในขณะที่พิจารณามานานแล้วว่าล้าสมัยสำหรับการเข้ารหัสลับที่ปลอดภัย MD5 และ MD4 ยังคงเพียงพอสำหรับการตรวจสอบความเสียหายของไฟล์

แหล่งที่มา: หน้าคนและ eyeballing ซอร์สโค้ด rsync เพื่อตรวจสอบ


3
ฉันเกลียดที่จะระเบิดฟองสบู่ของทุกคน แต่ rsync จะตรวจสอบการตรวจสอบผลรวมหากมีการเพิ่มแฟล็ก -c!

27
@clint ไม่คำตอบนั้นถูกต้อง จากคำอธิบายของ-cแฟล็กman page : "โปรดทราบว่า rsync จะตรวจสอบเสมอว่าไฟล์ที่ถ่ายโอนแต่ละไฟล์นั้นถูกสร้างขึ้นใหม่อย่างถูกต้องที่ด้านรับโดยการตรวจสอบการตรวจสอบไฟล์ทั้งหมดที่สร้างขึ้นเมื่อไฟล์ถูกโอน แต่อัตโนมัติหลังจากการถ่ายโอน การตรวจสอบไม่เกี่ยวข้องกับตัวเลือกนี้ก่อนการถ่ายโอน "ไฟล์นี้จำเป็นต้องได้รับการอัพเดตหรือไม่" ตรวจสอบ "
Michael Mrozek

7
คำตอบนี้ไม่ได้ทำให้ชัดเจนถ้าจริงตรวจสอบไฟล์หลังจากคัดลอก หากมีการคำนวณ checksum เป็นไฟล์ที่ได้รับนั่นไม่ใช่การตรวจสอบ post-copy และคุณไม่สามารถแน่ใจได้ว่าไฟล์นั้นถูกเขียนอย่างถูกต้อง จากนั้นคุณจะต้องทำการเปรียบเทียบเพิ่มเติม
Andre Miller

7
การลงคะแนนเสียงเนื่องจากฉันไม่ชอบความจริงที่ว่าคำตอบนี้มีรายละเอียดที่เขียนได้ดีและถูกต้องทางเทคนิคและในเวลาเดียวกันก็มีหัวข้อที่ทำให้ผู้อ่านเข้าใจผิด ปัญหาคือว่าคำตอบจะไปลงในรายละเอียดมากกับสิ่งที่เกิดขึ้นในระหว่างการถ่ายโอนในขณะที่ผู้ถามโดยเฉพาะกล่าวว่าเขาใส่ใจเกี่ยวกับสำเนาท้องถิ่นและไม่ได้โอนเครือข่าย ฉันค่อนข้างมั่นใจว่า Kyle Jones ไม่ต้องการหลอกลวงใครเลย แต่คำตอบนี้ (IMHO) ทำได้
ndemou

4
ไคล์ฉันไม่เชื่อว่าคุณตอบผิด ฉันสังเกตเห็นแล้วว่า"รายละเอียดดีเขียนและถูกต้องทางเทคนิค"แต่ต้องให้ผู้อ่านมีสมาธิและระมัดระวังโดยไม่จำเป็น เหตุใดจึงขาดการตรวจสอบข้อมูลดิสก์ที่ถูกตั้งคำถามผ่านทางคำตอบของคุณหลังจากผ่านไป 117 คำซึ่งอธิบายกระบวนการตรวจสอบที่ไม่เกี่ยวข้องอื่น ๆ ซ้ำ ๆ อย่างไรก็ตามขอขอบคุณสำหรับเวลาและความสนใจของคุณในการสนทนานี้ ฉันขอขอบคุณอย่างจริงใจ
ndemou

40

rsyncไม่ได้ทำการตรวจสอบการโพสต์สำเนาสำเนาไฟล์ท้องถิ่น คุณสามารถตรวจสอบว่าไม่ได้ใช้rsyncเพื่อคัดลอกไฟล์ขนาดใหญ่ไปยังไดรฟ์ช้า (เช่น USB) แล้วคัดลอกไฟล์เดียวกันด้วยcpเช่น:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

ทั้งสองคำสั่งใช้เวลาในระยะเวลาเท่ากันดังนั้นจึงrsyncไม่สามารถทำการตรวจสอบได้เนื่องจากจะเกี่ยวข้องกับการอ่านไฟล์ปลายทางอีกครั้งจากดิสก์ช้า

manหน้าเป็นที่น่าเสียดายที่ทำให้เข้าใจผิดเกี่ยวกับเรื่องนี้ ฉันยังตรวจสอบสิ่งนี้ด้วยstrace- หลังจากการคัดลอกเสร็จสมบูรณ์แล้วจะrsyncไม่มีการread()โทรออกไฟล์ปลายทางดังนั้นจึงไม่สามารถตรวจสอบได้ อีกหนึ่งคุณสามารถตรวจสอบได้ด้วยสิ่งที่ชอบiotop: คุณเห็นrsyncการอ่านและเขียนพร้อมกัน (คัดลอกจากต้นทางไปยังปลายทาง) จากนั้นออก หากตรวจสอบความถูกต้องแล้วจะมีเฟสแบบอ่านอย่างเดียว


1
"หน้าคนโชคไม่ดีที่ทำให้เข้าใจผิดเกี่ยวกับเรื่องนี้ฉันยังตรวจสอบสิ่งนี้ด้วย strace" คุณ strace ระยะไกลเรียกใช้กระบวนการ rsync หรือท้องถิ่นหรือไม่ มีสอง ... หนึ่งวิ่งบนปลายทางแม้ว่าคุณจะใช้ ssh
user129070

8
ไม่มีการตรวจสอบหลังการคัดลอกสำหรับสำเนาท้องถิ่นหรือระยะไกล คุณทำงานrsync -cอีกครั้งหากคุณต้องการบังคับให้ตรวจสอบ
psusi

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

17

rsyncทำการเปรียบเทียบการตรวจสอบก่อนที่จะคัดลอก (ในบางกรณี) เพื่อหลีกเลี่ยงการคัดลอกสิ่งที่มีอยู่แล้ว จุดของการเปรียบเทียบผลรวมตรวจสอบไม่ได้เพื่อตรวจสอบว่าสำเนาสำเร็จ นั่นคืองานของโครงสร้างพื้นฐานพื้นฐาน: ไดรเวอร์ระบบไฟล์ไดรเวอร์ดิสก์ไดรเวอร์เครือข่าย ฯลฯ แอปพลิเคชั่นส่วนบุคคลเช่นrsyncไม่จำเป็นต้องกังวลกับความบ้าคลั่งนี้ สิ่งที่rsyncต้องทำ (และทำ!) คือการตรวจสอบค่าส่งคืนของการเรียกของระบบเพื่อให้แน่ใจว่าไม่มีข้อผิดพลาด


1
ดูเหมือนว่าจะขัดแย้งกับคำตอบที่ยอมรับ ...
djule5

2
@ djule5 ในทางใด คำตอบที่ได้รับการยอมรับดูเหมือนว่าส่วนใหญ่จะเกี่ยวกับวิธีการตรวจสอบ rsync โอนไฟล์ แต่คำถามและคำตอบของฉันมีเกี่ยวกับท้องถิ่นสำเนา
Gilles

3
ตกลงในบริบทนั้นฉันยอมรับว่ามันสมเหตุสมผลดีกว่า ดังนั้น"จุดของการเปรียบเทียบผลรวมตรวจสอบไม่ได้ตรวจสอบว่าสำเนานั้นสำเร็จ"เป็นจริงเฉพาะสำหรับสำเนาภายในเครื่องเท่านั้น และ"checksums มักใช้กับข้อมูลที่ถ่ายโอนระหว่างกระบวนการส่งและรับ rsync"เป็นจริงสำหรับสำเนาที่ถ่ายโอนเท่านั้น ฉันพบคำตอบที่เข้าใจผิดเกี่ยวกับคำถามและเชื่อว่าคำตอบของคุณควรเป็นคำตอบที่ยอมรับได้ (แค่ 2 เซ็นต์ของฉัน)
djule5

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

1
@Ken ฉันไม่เข้าใจประเด็นที่คุณพยายามทำ ฉันสงสัยว่าคุณเข้าใจผิดบางอย่าง ไดรเวอร์เครือข่ายเข้ามาเล่นเฉพาะในกรณีที่มีสำเนาเครือข่าย Rsync ทำการตรวจสอบตัวเองก่อนทำการคัดลอกเพื่อตัดสินใจว่าจะคัดลอกหรือไม่ Rsync ไม่ทำการเปรียบเทียบการตรวจสอบใด ๆหลังจากคัดลอก (เพราะจะไม่มีประโยชน์: รู้ว่ามันเพิ่งคัดลอก)
Gilles

4

คำตอบที่รวดเร็วและสกปรกโดยตรงกับคำถาม

ถาม: จะrsyncทำการเปรียบเทียบเมื่อคัดลอกไฟล์ระหว่างสองไดรฟ์ภายในหรือไม่ ตอบ: มันจะทำการเปรียบเทียบเพื่อค้นหาว่าจะคัดลอกอย่างไร

ถาม: ถ้ามันทำการตรวจสอบ - มันเป็นเดิมพันที่ปลอดภัยหรือไม่ หรือมันจะดีกว่าที่จะทำการเปรียบเทียบแบบไบต์ต่อไบต์? A: ปลอดภัยเท่ากับคณิตศาสตร์ที่อยู่เบื้องหลังการตรวจสอบ MD5 ของไฟล์ คุณสามารถลองทำการทดสอบอย่างง่าย ๆ เพื่อเรียนรู้และเชื่อถือเครื่องมือ

คำตอบยาว: ฉันเดาว่าคุณต้องการrsyncเปรียบเทียบไฟล์ (ทีละบิตหรือเช็คซัม) หลังจากคัดลอกไฟล์ หากคุณเป็นหนึ่งในไม่กี่คนที่ให้ความสำคัญกับความสมบูรณ์ของข้อมูลคุณอาจพบว่ามีประโยชน์ดังต่อไปนี้:

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

รหัสrsyncโฟลเดอร์ด้านบนไฟล์ในการทำงานครั้งแรกและหากเสร็จสมบูรณ์โดยไม่มีปัญหาจะทำงานrsyncอีกครั้งทันทีในขณะที่ทำการเปรียบเทียบชื่อไฟล์เดียวกันโดยใช้แฮชของไฟล์ทั้งหมด


1

การใช้ rsync เพื่อตรวจสอบความสมบูรณ์ของสำเนา

เพื่อรับประกันว่าการทดสอบนี้จะอ่านไฟล์จากสื่อไดรฟ์อีกครั้งฉันขอแนะนำให้ปิดไดรฟ์ทั้งสองและเริ่มต้นใหม่ก่อนที่จะทำการทดสอบนี้ นี่จะเป็นการล้างแคชภายในที่มีความผันผวน

หากยังไม่รีสตาร์ท Linux อย่างน้อยคุณควรปล่อยแคช ( * ) ด้วย:

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

จากนั้นให้อ่านต้นไม้ทั้งสองอีกครั้งและเปรียบเทียบ checksums ของพวกเขา:

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

การตรวจสอบ rsync สมัยใหม่ใช้ MD5 ซึ่งเป็น 128 บิต ความน่าจะเป็นของความล้มเหลวนี้เพื่อตรวจหาข้อผิดพลาดในแฟ้มแต่ละ astronomically ต่ำ (การอภิปรายที่นี่ ) แต่ไม่เป็นไปไม่ได้



โชคดีที่ได้รับเครื่องหมายทับขวา
โนเบิล

ไม่มีข่าวเป็นข่าวดี
โนเบิล

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