ฉันจะตรวจสอบว่าไฟล์ 1TB ถูกถ่ายโอนอย่างถูกต้องได้อย่างไร?


25

ฉันมักจะถ่ายโอนอิมเมจ VM จากไฮเปอร์ไวเซอร์ไปยังเซิร์ฟเวอร์เก็บถาวรสำหรับการจัดเก็บระยะยาว

ฉันถ่ายโอนโดยใช้ netcat เนื่องจากมันเร็วกว่า scp, rsync และอื่น ๆ

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

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

น่าเสียดายที่การใช้ md5sum กับไฟล์ขนาดใหญ่อาจใช้เวลานานมาก ฉันจะเปรียบเทียบความสมบูรณ์ของไฟล์ขนาดใหญ่สองไฟล์ได้เร็วขึ้นได้อย่างไร

ปรับปรุง:

  • การส่งของฉันไม่ค่อยได้รับการขัดจังหวะดังนั้นความสามารถในการรีสตาร์ทจึงไม่ใช่ปัญหา
  • โดยทั่วไปจะใช้เวลา 3-4 ชั่วโมงในการถ่ายโอนผ่าน NC และจากนั้น 40 นาทีเพื่อรับ md5sum
  • ความปลอดภัยของแฮชไม่ได้เป็นปัญหาในกรณีนี้

2
คุณอาจจะลองตรวจสอบที่แตกต่างกัน: en.wikipedia.org/wiki/Checksum ฉันไม่รู้เกี่ยวกับการแสดงของพวกเขา
tumchaaditya

การถ่ายโอนจริงใช้เวลานานเท่าใดและ md5sum ใช้เวลานานเท่าใด
Keith Thompson

โดยทั่วไปการถ่ายโอนจะใช้เวลาระหว่าง 3-4 ชั่วโมงและ md5sums ใช้เวลาประมาณ 40 นาทีในการคำนวณ
tbenz9

คำตอบ:


18

คุณสามารถใช้tee เพื่อทำผลรวมได้ทันทีด้วยสิ่งนี้ (ปรับคำสั่ง netcat สำหรับความต้องการของคุณ):

เซิร์ฟเวอร์:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

ลูกค้า:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111

1
แค่คิด: md5deepมีโหมด "กลุ่ม" ( md5deep.sourceforge.net/md5deep.html ) ที่อาจเป็นประโยชน์สำหรับสิ่งนี้
LawrenceC

@ultrasawblade - นั่นเป็นลิงค์ที่ยอดเยี่ยมฉันจะต้องตรวจสอบเพื่อจุดประสงค์อื่น ขอบคุณที่พูดถึงมัน!
nerdwaller

10

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

แต่ฉันต้องการเพิ่มบางสิ่ง:

1 TiB / 40 นาที≈ 437 เอ็มไอ / วินาที1

มันค่อนข้างเร็วจริง ๆ จำไว้ว่าถ้าคุณไม่มีแรมจำนวนมากนั่นก็คือต้องกลับมาจากที่เก็บข้อมูล ดังนั้นสิ่งแรกที่ต้องตรวจสอบคือดูiostat -kx 10เมื่อคุณเรียกใช้เช็คซัม โดยเฉพาะอย่างยิ่งคุณต้องการให้ความสนใจกับ%utilคอลัมน์ หากคุณกำลังตรึงดิสก์ (ใกล้ 100%) คำตอบคือซื้อพื้นที่เก็บข้อมูลที่เร็วขึ้น

ไม่เช่นนั้นจะมีโปสเตอร์อื่น ๆ ที่กล่าวถึงคุณสามารถลองอัลกอริทึมการตรวจสอบที่แตกต่างกันได้ MD4, MD5 และ SHA-1 ได้รับการออกแบบให้เป็นแฮ็คเข้ารหัสข้อมูล (แม้ว่าจะไม่ควรใช้สิ่งเหล่านี้เพื่อจุดประสงค์นั้นอีกต่อไป แต่ก็ถือว่าอ่อนแอเกินไป) openssl speed md4 md5 sha1 sha256ความเร็วที่ชาญฉลาดคุณสามารถเปรียบเทียบกับ ฉันถูกโยนลงไปใน SHA256 เพื่อที่จะมีกัญชาอย่างน้อยหนึ่งตัวที่แข็งแรงพอ

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

จากข้างต้นคุณจะเห็นว่า MD4 นั้นเร็วที่สุดและ SHA256 นั้นช้าที่สุด ผลลัพธ์นี้เป็นเรื่องปกติสำหรับฮาร์ดแวร์ที่ใช้พีซีอย่างน้อยที่สุด

หากคุณต้องการประสิทธิภาพการทำงานมากยิ่งขึ้น (ที่ค่าใช้จ่ายของการเป็นที่น่ารำคาญไปยุ่งด้วยและยังมีโอกาสน้อยที่จะตรวจสอบการทุจริต), คุณต้องการที่จะดูที่ซีอาร์ซีหรือแอดเลอร์แฮช ในบรรดาสอง Adler นั้นเร็วกว่า แต่ก็อ่อนแอกว่า น่าเสียดายที่ฉันไม่ได้ตระหนักถึงการใช้งานบรรทัดคำสั่งที่รวดเร็วจริงๆ โปรแกรมในระบบของฉันช้ากว่า OpenSSL ของ md4

ดังนั้นความเร็วในการเดิมพันที่ดีที่สุดของคุณคือopenssl md4 -r( -rทำให้ดูเหมือนเอาต์พุต md5sum)

หากคุณยินดีที่จะทำบางรวบรวมและ / หรือการเขียนโปรแกรมน้อยที่สุดดูรหัสมาร์คแอดเลอร์ไปบนกองมากเกินและยังxxhash หากคุณมี SSE 4.2 คุณจะไม่สามารถเอาชนะความเร็วของคำสั่ง CRC ของฮาร์ดแวร์ได้


1 1 TiB = 1024⁴ไบต์; 1 MiB = 1024²ไบต์ มาถึง≈417MB / วินาทีพร้อมกับ powers-of-1000 units


มันเร็วฉันกำลังคัดลอกจาก RAID ขนาดใหญ่หนึ่งตัวไปยัง RAID ขนาดใหญ่ตัวที่สอง
tbenz9

@ tbenz9 ฉันคิดว่าไม่มีวิธีที่เป็นดิสก์เดียว! ฉันได้เพิ่มพอยน์เตอร์บางตัวลงในแฮชที่เร็วมาก ๆ ซึ่งน่าเสียดายที่ต้องมีการรวบรวมอย่างน้อย ... แต่พวกมันจะทำงานเร็วเท่ากับดิสก์ของคุณ (หรือแม้แต่ RAM ของคุณ) สามารถให้ข้อมูลได้ (. และถ้าคุณกำลังสงสัยเกี่ยวกับมาร์คแอดเลอร์วี Adler32 ใช่ดูเหมือนว่าจะเป็นผู้สร้างของ Adler32)
derobert

@derobert แทนที่จะใช้ไฟล์ขนาดเล็กในการทดสอบคุณไม่ควรทดสอบด้วยไฟล์ขนาดใหญ่เช่น 1TB ใช่ไหม
Pacerier

@derobert ทำไมคุณไม่ใช้shasumแทนล่ะ
Pacerier

@Pacerier นั่นเป็นผลลัพธ์จากมาตรฐานในตัวของ OpenSSL ไม่ต้องสงสัยเลยว่าบล็อกที่ยาวกว่านั้นจะเร็วขึ้นเล็กน้อย แต่การจัดอันดับไม่น่าจะเปลี่ยนแปลง (มันสอดคล้องกันในทุกขนาดที่ทำแบบทดสอบ) Shasum มีการใช้งานที่รวดเร็วกว่า OpenSSL หรือไม่ แม้ว่าทุกวันนี้หากคุณต้องการแฮ็คการเข้ารหัสที่รวดเร็ว แต่คุณก็ต้องใช้ BLAKE2
Derobert

9

opensslคำสั่งย่อยสนับสนุนหลายข้อความ ในบรรดาที่ฉันสามารถลองmd4ดูเหมือนว่าจะทำงานในเวลาประมาณ 65% ของเวลาmd5และประมาณ 54% ของเวลาsha1(สำหรับไฟล์เดียวที่ฉันทดสอบด้วย)

นอกจากนี้ยังมีmd2ในเอกสารนี้ md5แต่ดูเหมือนว่าจะให้ผลเช่นเดียวกับ

ความเร็วค่อนข้างจะสัมพันธ์กับคุณภาพตรงกันข้าม แต่เนื่องจากคุณ (อาจ) ไม่กังวลเกี่ยวกับฝ่ายตรงข้ามที่สร้างการปะทะกันโดยเจตนาซึ่งไม่น่าเป็นปัญหามากนัก

คุณอาจมองหาข้อความย่อยที่เก่ากว่าและเรียบง่ายกว่า ( md1เช่นมี)

จุดเล็ก ๆ น้อย ๆ : คุณได้มีการใช้ประโยชน์ของ catค่อนข้างมากกว่า:

cat foo.box | nc <archive IP> 1234

คุณสามารถใช้ได้:

nc <archive IP> 1234 < foo.box

หรือแม้กระทั่ง:

< foo.box nc <archive IP> 1234

การทำเช่นนั้นจะบันทึกกระบวนการ แต่อาจไม่มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพ


1
ขอบคุณสำหรับเคล็ดลับในแมวที่ไม่เกี่ยวข้องกับคำถาม แต่เคล็ดลับที่เป็นประโยชน์อย่างไรก็ตาม ไชโย!
tbenz9

@ tbenz9: รหัสที่อ่านได้ง่ายต่อการดีบักและบำรุงรักษาและเปลี่ยนแปลง "ไร้ประโยชน์cat" ดังนั้นจึงไม่จำเป็นต้องเลวร้ายอย่างสิ้นเชิง หากไม่มีการเพิ่มประสิทธิภาพโดยการหลีกเลี่ยงมันก็เป็นการดีกว่าถ้าคุณจะใช้สิ่งที่คุณพอใจมากกว่าโดยสมมติว่าคุณเป็นผู้ดูแลรหัสนี้
iconoclast

1
@
Keith

4

สองตัวเลือก:

ใช้ sha1sum

sha1sum foo.box

ในบางสถานการณ์sha1sum ได้เร็วขึ้น


ใช้ rsync

การถ่ายโอนจะใช้เวลานานกว่า แต่ rsync จะตรวจสอบว่าไฟล์นั้นมาถึงอย่างสมบูรณ์

จากหน้า rsync

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


1
ขอบคุณสำหรับเคล็ดลับใน sha1sum rsync ใช้เวลามากกว่า 10 ชั่วโมงในการถ่ายโอนฉันสามารถถ่ายโอนไฟล์เดียวกันและเรียกใช้ md5sums ในเวลาประมาณ 4 ชั่วโมงโดยใช้ nc และ md5sum ฉันพยายามทำให้เวลาของฉันลดลง 4 ชั่วโมง
tbenz9

3

วิทยาศาสตร์กำลังก้าวหน้า ดูเหมือนว่าฟังก์ชั่นแฮช BLAKE2 ใหม่นั้นเร็วกว่า MD5 (และการเข้ารหัสที่แข็งแกร่งกว่าในการบูต)

การอ้างอิง: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

จากสไลด์ของ Zooko:

รอบต่อไบต์บนฟังก์ชัน Intel Core i5-3210M (Ivy Bridge) 
ต่อไบต์
ข้อความยาว 4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4.7 4.8 13.7 SHA256 12.8 13.0 30.0 Keccak 8.2 8.5 26.0 BLAKE1 5.8 6.0 14.9 BLAKE2 3.5 3.5 9.3

2

คุณอาจไม่สามารถทำได้ดีกว่าแฮชที่ดี คุณอาจต้องการที่จะตรวจสอบฟังก์ชันแฮช / การตรวจสอบอื่น ๆ md5sumเพื่อดูว่าส่วนใดมีนัยสำคัญได้เร็วกว่า โปรดทราบว่าคุณอาจไม่ต้องการอะไรที่แข็งแกร่งพอ ๆ MD5 (และสิ่งอื่น ๆ เช่น SHA1) ได้รับการออกแบบให้มีความแข็งแกร่งในการเข้ารหัสดังนั้นจึงเป็นไปไม่ได้ที่ผู้โจมตี / ผู้เลียนแบบจะสร้างไฟล์ใหม่ที่มีค่าแฮชเหมือนกับค่าที่มีอยู่ (เช่นเพื่อยากต่อการเซ็นสัญญากับ e - อีเมลและเอกสารอื่น ๆ ) หากคุณไม่กังวลเกี่ยวกับการโจมตีการสื่อสารของคุณ แต่มีข้อผิดพลาดเพียงแค่การทำงานผิดพลาด comms บางอย่างเช่นการตรวจสอบความซ้ำซ้อนแบบวนซ้ำ (CRC) อาจดีพอ (แต่ฉันไม่รู้ว่ามันจะเร็วกว่านี้ไหม)

อีกวิธีคือพยายามแฮชขนานกับการถ่ายโอน สิ่งนี้อาจลดเวลาโดยรวมและสามารถลดปัจจัยการระคายเคืองที่ต้องรอให้การถ่ายโอนเสร็จสิ้นและจากนั้นรออีกครั้งเพื่อให้ MD5 เสร็จสิ้น ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่ควรทำสิ่งนี้:

  • บนเครื่องต้นทาง:

    mkfifo myfifo
    tee myfifo < source_file | nc dest_host  port_number & md5sum myfifo
    
  • บนเครื่องปลายทาง:

    mkfifo myfifo
    nc -l -p port_number | tee myfifo> dest_file & md5sum myfifo
    

แน่นอนว่าการตรวจสอบขนาดของไฟล์เป็นวิธีที่ดีและรวดเร็วในการตรวจสอบว่ามีไบต์ตก


2

การส่งไฟล์ขนาดใหญ่เป็นเรื่องเจ็บปวด ทำไมไม่ลอง chunking ไฟล์ที่สร้าง hash สำหรับ chunk แต่ละอันแล้วส่งมันไปที่ปลายทางจากนั้นตรวจสอบ hash และเข้าร่วม chunks

คุณสามารถตั้งค่าเครือข่าย BitTorrent ส่วนตัว เพื่อให้แน่ใจว่าทุกอย่างจะปลอดภัย


ความเข้าใจของฉันคือเนื่องจากเป็นแหล่งเดียวและปลายทางหนึ่งเครือข่าย BitTorrent จะไม่เป็นประโยชน์ ไม่เพียง แต่จะได้ประโยชน์เมื่อมันไปยังจุดหมายปลายทางมากมายจากหลาย ๆ แหล่ง?
tbenz9

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

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

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