จากสเป็ค :
- หาก
bs=
expr
ดำเนินการระบุและไม่มีการแปลงอื่น ๆ กว่าsync
, noerror
หรือnotrunc
มีการขอข้อมูลกลับมาจากบล็อกการป้อนข้อมูลแต่ละจะต้องจารึกไว้เป็นบล็อกแยกออก; หากread()
ผลตอบแทนน้อยกว่าบล็อกเต็มและsync
ไม่ได้ระบุการแปลงบล็อกผลลัพธ์ที่ได้จะต้องมีขนาดเท่ากับบล็อกอินพุต
ดังนั้นนี่อาจเป็นสิ่งที่ทำให้คุณสับสน ใช่เพราะdd
ถูกออกแบบมาสำหรับการปิดกั้นโดยค่าเริ่มต้นบางส่วนread()
s จะถูกแมป 1: 1 ถึงบางส่วนwrite()
ของหรืออื่น ๆsync
วันที่ออกบนหาง padding NUL หรือตัวอักษรพื้นที่ในการbs=
ขนาดเมื่อconv=sync
มีการระบุ
ซึ่งหมายความว่าdd
เป็นที่ปลอดภัยที่จะใช้สำหรับการคัดลอกข้อมูล (w / ความเสี่ยงของการทุจริตไม่มีเนื่องจากการอ่านบางส่วนหรือเขียน)ในทุกกรณี แต่อย่างหนึ่งที่มันจะถูก จำกัด โดยพลการโดยcount=
โต้แย้งเพราะมิฉะนั้นdd
จะมีความสุขwrite()
ผลผลิตของตนในบล็อกขนาดเหมือนกัน สำหรับผู้ที่มีการป้อนข้อมูลread()
จนกว่าจะread()
ผ่านอย่างสมบูรณ์ และแม้กระทั่งข้อแม้นี้เป็นจริงเท่านั้นเมื่อbs=
มีการระบุหรือobs=
จะไม่ได้ระบุว่าเป็นประโยคถัดไปมากในสเป็ฯ :
- ถ้า
bs=
expr
ตัวถูกดำเนินการไม่ได้ระบุหรือแปลงอื่น ๆ กว่าsync
, noerror
หรือnotrunc
มีการร้องขอการป้อนข้อมูลจะถูกประมวลผลและเก็บรวบรวมลงในบล็อกเอาท์พุทขนาดเต็มจนกว่าจะสิ้นสุดของการป้อนข้อมูลที่จะถึง
หากไม่มีibs=
และ / หรือมีobs=
ข้อโต้แย้งสิ่งนี้ไม่สำคัญ - เพราะibs
และobs
มีขนาดเท่ากันตามค่าเริ่มต้น แต่คุณจะได้รับอย่างชัดเจนเกี่ยวกับการกำหนดบัฟเฟอร์อินพุตโดยการระบุขนาดที่แตกต่างกันอย่างใดอย่างหนึ่งและไม่ระบุ(เพราะมันจะมีความสำคัญ)bs=
ตัวอย่างเช่นหากคุณ:
IN| dd ibs=1| OUT
... จากนั้น POSIX dd
จะมีwrite()
หน่วยเป็น 512 ไบต์โดยรวบรวมทุกread()
ไบต์เดี่ยว ๆลงในบล็อกเอาต์พุตเดี่ยว
มิฉะนั้นถ้าคุณทำ ...
IN| dd obs=1kx1k| OUT
ที่ ... POSIX dd
จะread()
ได้สูงสุด 512 ไบต์ในเวลา แต่write()
ทุกเมกะไบต์ขนาดเอาท์พุทบล็อก(เคอร์เนลอนุญาตและการยกเว้นอาจจะเป็นครั้งสุดท้าย - เพราะนั่นคือ EOF)ในเต็มรูปแบบโดยการเก็บรวบรวมใส่ลงในบล็อกเอาท์พุทขนาดเต็ม
นอกจากนี้จากสเป็คแล้ว:
count=n
- คัดลอกเฉพาะบล็อกอินพุตnเท่านั้น
count=
แผนที่ไปยังi?bs=
บล็อกและอื่น ๆ เพื่อจัดการขีด จำกัด โดยพลการในcount=
พอร์ตคุณจะต้องมีสองdd
ตัว วิธีปฏิบัติที่เป็นไปได้มากที่สุดในการทำสองdd
s คือการส่งออกไปยังอินพุตของอีกอันหนึ่งซึ่งทำให้เราอยู่ในขอบเขตของการอ่าน / เขียนไฟล์พิเศษโดยไม่คำนึงถึงชนิดอินพุตต้นฉบับ
ไปป์ IPC หมายความว่าเมื่อระบุ[io]bs=
args ที่จะทำอย่างปลอดภัยคุณต้องเก็บค่าดังกล่าวภายในPIPE_BUF
ขีด จำกัด ที่กำหนดของระบบ POSIX ระบุว่าเคอร์เนลระบบจะต้องรับประกันอะตอมread()
และwrite()
s ภายในขอบเขตของตามที่กำหนดในPIPE_BUF
limits.h
POSIX รับประกันว่าPIPE_BUF
จะเป็นอย่างน้อย ...
{_POSIX_PIPE_BUF}
- จำนวนไบต์สูงสุดที่รับประกันว่าเป็นแบบปรมาณูเมื่อเขียนไปยังไพพ์
- ค่า: 512
... (ซึ่งเกิดขึ้นเป็นค่าเริ่มต้นdd
บล็อก i / o)แต่ค่าจริงมักจะเป็นอย่างน้อย 4k บนระบบ Linux ที่ทันสมัยคือ 64k โดยค่าเริ่มต้น
ดังนั้นเมื่อคุณตั้งค่าโปรเซสของdd
คุณคุณควรทำในบล็อคแฟคเตอร์ตามค่าสามค่า:
- bs = (obs =
PIPE_BUF
หรือน้อยกว่า)
- n = จำนวนไบต์ที่ต้องการอ่านทั้งหมด
- count = n / bs
ชอบ:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
คุณต้องซิงโครไนซ์ i / ow / dd
เพื่อจัดการอินพุตที่ไม่สามารถค้นหาได้ กล่าวอีกนัยหนึ่งทำให้ไปป์ไลน์บัฟเฟอร์อย่างชัดเจนและพวกเขาจะหยุดเป็นปัญหา นั่นคือสิ่งที่dd
มีไว้เพื่อ ปริมาณที่ไม่รู้จักที่นี่คือyes
's ขนาดบัฟเฟอร์ - แต่ถ้าคุณปิดกั้นออกไปเป็นที่รู้จักในปริมาณอีกdd
แล้วคูณมีข้อมูลเล็ก ๆ น้อย ๆ สามารถทำให้dd
ปลอดภัยที่จะใช้สำหรับการคัดลอกข้อมูล (w / ความเสี่ยงของการทุจริตไม่มีเนื่องจากการอ่านบางส่วนหรือเขียน)แม้ว่าจะ จำกัด อินพุตโดยไม่ จำกัด ชนิด w / count=
w / อินพุตใดก็ได้บนระบบ POSIX และไม่ขาดไบต์เดียว
นี่เป็นตัวอย่างข้อมูลจากPOSIX spec :
ibs=
expr
- ระบุขนาดบล็อกใส่ไบต์โดย(ค่าปกติคือ 512)
expr
obs=
expr
- ระบุขนาดของบล็อกการส่งออกในไบต์โดย(ค่าปกติคือ 512)
expr
bs=
expr
- ตั้งค่าทั้งอินพุทและเอาท์พุทบล็อกขนาด
expr
ไบต์แทนและibs=
obs=
หากไม่มีการแปลงนอกเหนือจากsync
, noerror
และnotrunc
ระบุไว้แต่ละบล็อคอินพุตจะถูกคัดลอกไปยังเอาต์พุตเป็นบล็อกเดียวโดยไม่มีการรวมบล็อกสั้น ๆ
นอกจากนี้คุณยังจะได้พบกับบางนี้อธิบายที่ดีกว่าที่นี่