ทำไมต้องระบุขนาดบล็อกเมื่อทำการคัดลอกอุปกรณ์ที่มีขนาด จำกัด ?


14

ในบทเรียนออนไลน์มักแนะนำให้ใช้คำสั่งต่อไปนี้เพื่อคัดลอก CDROM ไปยังอิมเมจ iso:

$ dd if=/dev/dvd of=foobar.iso bs=2048

เหตุใดจึงต้องระบุขนาดไบต์ ฉันสังเกตเห็นว่าในความเป็นจริง 2048 เป็นขนาดไบต์มาตรฐานสำหรับภาพ CDROMแต่ดูเหมือนว่าจะddไม่มีการระบุbs=หรือcount=ทำงานเช่นกัน

ในกรณีใดบ้างที่เป็นปัญหาที่จะไม่ระบุbs=หรือcount=เมื่อคัดลอกจากอุปกรณ์ที่มีขนาด จำกัด ?

คำตอบ:


12

เมื่อไหร่ที่เหมาะสำหรับการคัดลอกข้อมูล (หรือเมื่อถูกอ่าน () และเขียน () บางส่วน)ชี้ให้เห็นข้อแม้สำคัญเมื่อใช้count: ddสามารถคัดลอกบล็อกบางส่วนดังนั้นเมื่อได้รับcountมันจะหยุดหลังจากจำนวนบล็อกที่กำหนดแม้ว่าบางส่วนของบล็อกไม่สมบูรณ์ คุณจึงอาจจะจบลงที่มีน้อยกว่าไบต์คัดลอกเว้นแต่คุณจะระบุbs * countiflag=fullblock

ขนาดบล็อกเริ่มต้นสำหรับddคือ 512 ไบต์ countมีขีด จำกัด ; ตามคำถามของคุณบอกเป็นนัย ๆ ว่าไม่จำเป็นเมื่อทำการคัดลอกอุปกรณ์ที่มีขนาด จำกัด และมีจุดประสงค์เพื่อคัดลอกเฉพาะส่วนของอุปกรณ์

ฉันคิดว่ามีสองด้านที่ควรพิจารณา: ประสิทธิภาพและการกู้คืนข้อมูล

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

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


2
ประสิทธิภาพโดยเฉพาะ เขียนอิมเมจพาร์ติชันไปยังการ์ด SD ตัวอย่างเช่นการใช้dd bs=4m iflag=fullblockvs dd bs=1111และสังเกตว่าอัตราการส่งข้อมูลที่สูงขึ้นอย่างมากในอดีตจะทำให้คุณ นี่เป็นเพราะอดีตปรับขนาดบล็อกตามธรรมชาติบนการ์ด SD ในขณะที่หลังต้องการคอนโทรลเลอร์ SD เพื่อทำการอ่านคัดลอกและ reflashing เพื่อเขียนบล็อกทางกายภาพบางส่วน ความสำคัญของการfullblockไม่ควรมองข้ามต่ำไปbsแต่อย่างใดการอ่านสูงสุดและการอ่านเพียงบางส่วนอาจนำไปสู่การเยื้องแนวที่ไม่เหมาะสม
Jason C

6

ddมีบิตของการขนส่งสินค้าทางศาสนาเป็นรอบ ๆ เริ่มแรกมีข้อผิดพลาดสองข้อcpที่ทำให้เกิดปัญหา: มันจะตรวจพบไฟล์ที่กระจัดกระจายเมื่อรายงานด้วยขนาดบล็อกอื่นที่ไม่ใช่ 512 (Linux ใช้ขนาดบล็อก 1024) และมันไม่ได้ล้างบล็อคว่างเปล่าจากปลายทางเมื่อคัดลอกจาก ไฟล์กระจัดกระจายไปยังอุปกรณ์บล็อก

คุณสามารถค้นหาการอ้างอิงบางส่วนถึงสิ่งนี้ได้ในรายการจัดส่งจดหมายข่าวทาง Linuxล่วงหน้า

ดังนั้นผู้คนจึงชินกับการเป็นวิธีที่ถูกต้องในการจัดการกับอิมเมจของดิสก์และ cp ก็ล้มลงข้างทาง และเนื่องจาก dd ใช้ขนาดบล็อกเริ่มต้นที่ 512 จึงช้า (ช้ากว่า cp ในระบบที่ทันสมัย) แต่ไม่ชัดเจนว่าคุณควรใช้ขนาดบล็อกใด ในกรณีของคุณอาจมีคนอ่านว่า 2048 เป็นขนาดบล็อก "ธรรมชาติ" สำหรับซีดีรอม (คือซีดีรอมแบ่งออกเป็นเซ็กเตอร์ 2,352 ไบต์ที่ประกอบด้วยข้อมูล 2,048 ไบต์พร้อมกับข้อมูลการแก้ไขข้อผิดพลาด) และได้ตัดสินใจว่าสิ่งนี้ คือขนาด "ถูกต้อง" ที่จะใช้กับ dd ในความเป็นจริงแล้วคุณอาจได้รับผลลัพธ์เร็วขึ้นหากคุณใช้ขนาดบล็อกที่ใหญ่กว่า (ปานกลาง) ในความเป็นจริง GNU cp ใช้ขนาดบล็อกเริ่มต้นที่ 64k ด้วยเหตุนี้

tl; dr: cp /dev/dvd foobar.isoควรทำงานได้ดี ขนาดบล็อกเริ่มต้นสำหรับdd512 ผลกระทบอย่างเดียวที่เหลืออยู่เพียงอย่างเดียวในสถานการณ์ส่วนใหญ่คือการทำให้กระบวนการคัดลอกช้าลง


มันอาจมีการเปลี่ยนแปลง แต่อย่างใด GNU cp ใช้ขนาดบล็อก 128k เป็นค่าเริ่มต้น (ไม่ใช่ 64k) ดูeklitzke.org/efficient-file-copying-on-linux
apurkrt

5

การเปลี่ยนขนาดบล็อกเป็นวิธีที่ดีในการเปลี่ยนจำนวนบัฟเฟอร์หรืออ่าน / เขียนในแต่ละครั้ง

ไม่เกี่ยวข้องกับว่าเป็นอุปกรณ์บล็อกจริงหรืออุปกรณ์เสมือน / ไม่สิ้นสุด มันเกี่ยวกับจำนวนที่คุณต้องการเก็บไว้ในหน่วยความจำก่อนที่ddจะเขียนออกมา bs=ตั้งค่าทั้งสองibs=(จำนวนข้อมูลที่อ่านในแต่ละครั้ง) และobs=(จำนวนข้อมูลที่ถูกเขียนในแต่ละครั้ง) สูงกว่าobs=ซ้ำมากขึ้นของibs=จะต้องก่อนที่จะมีข้อมูลที่เพียงพอสำหรับการddเริ่มต้นการเขียนไปยังปลายทาง

count=ยังไม่ได้ขึ้นอยู่กับสิ่งอื่นใดนอกจากสิ่งที่คุณต้องการจะทำ มันจะควบคุมจำนวนที่ต้องใช้ "บล็อก" (ตามที่วัดโดยibs=) ddเพื่อพิจารณางานของมันว่ากำลังทำอยู่


หมายเหตุจุดสตีเฟนส์ของddการคัดลอกบล็อกบางส่วน - มันไม่เสมอbs * countไป
Drav Sloan

โปรดทราบว่าในระบบยูนิกซ์บางระบบคุณต้องอ่านขนาดบล็อกเนทีฟหลายขนาด ddโดยไม่มีbs=2048หรือหลาย ๆ มันจะให้ข้อผิดพลาดเมื่ออ่านจากไดรฟ์ซีดีรอมอุปกรณ์บล็อก
wurtel

2

การใช้ตัวเลือก blocksize เพื่อddระบุจำนวนข้อมูลที่จะถูกคัดลอกไปยังหน่วยความจำจากระบบย่อยอินพุต I / O ก่อนที่จะพยายามเขียนกลับไปยังระบบย่อยเอาท์พุท I / O เอาต์พุตเหมือนกัน (ขณะที่กำลังคัดลอกดิสก์ทั้งหมด) ชิ้นกำลังอ่านที่ขนาดต่าง ๆ ที่คุณระบุ ( ddการนำไปใช้งานส่วนใหญ่จะมีขนาดบล็อกเริ่มต้นที่ 512 ไบต์)

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

ระยะของคุณอาจแตกต่างกันไปขึ้นอยู่กับว่าคุณอยู่ที่ไหนif=และof=ตั้งค่าไว้และฮาร์ดแวร์ใดที่คุณกำลังประสบหากคุณมีหน่วยความจำเหลือน้อยและอื่น ๆ


1

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

  • มีไฟล์ 1000000000000000 ไฟล์โดยแต่ละไฟล์มีเพียง 1 ~ 10 kb
  • มีไฟล์เดียวสำหรับ 10 gb

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

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