พิจารณาอุปกรณ์บล็อกดิบ 100MB เป็นตัวอย่างง่ายๆ นั่นคือ 204800 บล็อก 512 ไบต์แต่ละรายการรวมเป็น 102760448 ไบต์
ความท้าทายคือการเปลี่ยน 98MB แรก (200704 บล็อก) ดังนั้นจึงมีช่องว่าง 2MB (4096 บล็อก) ที่ด้านหน้า เมื่อต้องการทำสิ่งนี้ในสถานที่นั้นจะต้องไม่มีสิ่งใดถูกเขียนไปยังเซกเตอร์ที่ยังไม่ได้อ่าน วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการแนะนำบัฟเฟอร์:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
ความคาดหวังคือmbuffer
จะเก็บบล็อก 4096 ก่อนส่งผ่านสิ่งใดไปยังผู้เขียนดังนั้นให้แน่ใจว่าไม่มีสิ่งใดถูกเขียนไปยังพื้นที่ที่ไม่ได้ถูกอ่านและผู้เขียนล่าช้าผู้อ่านตามขนาดของบัฟเฟอร์ บัฟเฟอร์ควรอนุญาตให้ตัวอ่านและตัวเขียนทำงานเร็วที่สุดเท่าที่จะเป็นไปได้ภายในกลุ่มค่าเหล่านั้น
อย่างไรก็ตามดูเหมือนว่าจะไม่สามารถทำงานได้อย่างน่าเชื่อถือ ฉันได้ลองใช้อุปกรณ์จริง แต่มันก็ไม่สามารถใช้งานได้ในขณะที่การทดสอบกับไฟล์ทำงานบนกล่อง 64- บิตของฉัน แต่ไม่ได้อยู่ในกล่อง 32- บิตของฉัน
ก่อนอื่นให้เตรียม:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
สิ่งนี้ใช้ไม่ได้:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
สิ่งนี้ใช้ได้กับระบบ 64- บิต แต่ไม่ได้อยู่ในระบบ 32- บิต:
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
สิ่งนี้สามารถทำได้อย่างน่าเชื่อถือ?
บันทึก
ฉันได้อ่านคำถามอื่น ๆ เกี่ยวกับบัฟเฟอร์และมองไปที่pv
, และbuffer
mbuffer
ฉันจะได้รับหลังเพื่อทำงานกับขนาดบัฟเฟอร์ที่ต้องการ
การใช้ที่เก็บข้อมูลแบบ Intermetiate เป็นวิธีการแก้ปัญหาที่เห็นได้ชัดว่าใช้งานได้จริง แต่ก็ไม่สามารถใช้งานได้จริงหากไม่มีความจุสำรองเพียงพอ
ทดสอบแพลตฟอร์มที่ใช้ Arch Linux ด้วยmbuffer
เวอร์ชัน 20140302
mbuffer
จริงควรบังคับให้สองdd
ล้าหลังสำหรับครั้งแรกและคุณจะต้อง RAM พอที่จะ buffer ขนาดของการเปลี่ยนแปลงที่ น่าเสียดายที่dd
ไม่สนับสนุนการอ่านและการเขียนบล็อกตามลำดับย้อนหลังเนื่องจากจะช่วยขจัดปัญหาได้!
-H
อาร์กิวเมนต์เปิดใช้งานคุณลักษณะนี้)
mbuffer
ที่ทั้งหมดหรือไม่ ทำไมไม่ลองdd
อ่านเนื้อหาทั้งหมดของอุปกรณ์บล็อกในคราวเดียวdd bs=102760448
? แน่นอนไม่ทางใดก็ทางหนึ่งมันบัฟเฟอร์ใน RAM