เหตุใดตัวเลือกการซิงค์จึงถูกใช้กับคำสั่ง `dd '


13

ทำตามคำแนะนำในหน้านี้หน้าแสดงddคำสั่งและsyncตัวเลือกในตอนท้าย คำสั่งดังต่อไปนี้:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M sync

ฉันรู้ว่ามันคืออะไรddและมันทำงานอย่างไร แต่ฉันไม่เคยได้ยินหรือใช้syncตัวเลือกกับมันและรายการหน้าคู่มือของมันเป็นเหมือน:

sync   pad every input block with NULs to  ibs-size;  when  used  with
       block or unblock, pad with spaces rather than NULs

มันคืออะไรNULและทำไมมันถึงเบาะibs-sizeและทำไมต้อง padding บล็อคข้อมูลและใช้syncตัวเลือกด้วยddคำสั่ง? ทำไมไม่ทำให้มันง่ายและสะดวก

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

dd: unrecognized operand ‘sync’
Try 'dd --help' for more information. 

คำตอบ:


21

คุณกำลังอ่านคำสั่งผิด มันเป็น:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M 
sync

syncเป็นคำสั่งแยกต่างหากที่นี่ ดูman 1 sync:

NAME
       sync - flush file system buffers

SYNOPSIS
       sync [OPTION]

DESCRIPTION
       Force changed blocks to disk, update the super block.

ค่อนข้างชัดเจนว่าทำไมมันถูกใช้เมื่อคุณคิดว่าแคช

สำหรับddตัวเลือกที่คุณอ่านมันเป็นค่าสำหรับตัวเลือก :conv

Each CONV symbol may be:
   ascii  from EBCDIC to ASCII
   ...
   sync   pad every input block with NULs  to  ibs-size;  when  used  with
          block or unblock, pad with spaces rather than NULs

หากมีการใช้งาน (ซึ่งไม่ใช่) จะใช้ดังนี้:

dd ... conv=sync

3
คำตอบที่ดีมีรายละเอียดมาก ยินดีที่คุณยังอธิบายถึงการdd ... conv=syncโต้แย้ง
ผู้บัญชาการไบต์

อย่าปล่อยให้พวกเขายั่วยุคุณ! ;-)คำตอบที่ดี: คุณเห็นปัญหาที่ฉันไม่ได้เห็น > :-) +1
Fabby

1
นอกจากนี้จากคำอธิบายของconv=syncตัวเลือกที่ดูเหมือนว่าค่อนข้างชัดเจนว่าทำไมมันไม่ได้ใช้สำหรับการนี้ อย่างดีที่สุดมันจะไม่ทำอะไรเลยที่แย่ที่สุดมันจะทำให้รูปภาพเสียหายระหว่างการคัดลอก
kasperd

5
คำแนะนำจริง ๆ ควรเรียกใช้ตัวเลือก dd oflag=fsync(ซึ่ง flushes เอาต์พุต dd ที่เขียน) แทนที่จะเป็นsyncคำสั่ง (ซึ่งจะ
ล้างข้อมูล

คำตอบนี้ทำให้เข้าใจผิด ด้วย dd syncเป็นข้อโต้แย้งทั้งconvและiflagหรือoflagตัวเลือก
Dan Loewenherz

3

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

Dd จะทำซ้ำจนกว่าจะถึงจำนวนที่ระบุหรือเห็น eof ในอินพุตหรือมีข้อผิดพลาดในอินพุตหรือเอาต์พุต เมื่อเสร็จสิ้น dd จะรายงานจำนวนระเบียนทั้งหมดและบางส่วนที่อ่านและเขียน

ลักษณะการทำงานนี้ใช้ได้สำหรับการคัดลอกไฟล์ธรรมดาภายในระบบไฟล์หรือผ่านการเชื่อมต่อเครือข่าย TCP เนื่องจากถือว่าเป็นสตรีมไบต์ แต่วัตถุระบบไฟล์อื่น ๆ เช่นดีวีดีดิบและเทปแม่เหล็กต้องใช้ขนาดการเขียนที่อยู่ในช่วงที่กำหนดและมีจำนวนรอบเป็นจำนวนเท่ากัน (เช่น 512 หรือ 2048 ไบต์) ตัวอย่างเช่นถ้าคุณมีดิสก์อิมเมจที่เป็น 255 แทร็กของเซกเตอร์ 512 512 ไบต์และต้องการเขียนลงในเทปที่ต้องมีขนาดบล็อก 1024 ไบต์คุณต้องทำอะไรบางอย่างเช่น

dd if=disk.img of=/dev/rmt0 bs=1k conv=sync

เพื่อให้แน่ใจว่า dd จะไม่พยายามเขียนบล็อกขนาด 512 ไบต์ในตอนท้าย บล็อกที่สั้นกว่าในตอนท้ายจะถูกเติมด้วยศูนย์หรือช่องว่าง การซ้อนทับด้วยศูนย์เป็นตัวเลือกที่ปลอดภัยและเป็นเรื่องธรรมดา ตัวเลือกสำหรับ dd to pad ด้วยช่องว่างนั้นมีประโยชน์ในสถานการณ์ที่แตกต่างกัน - การแปลงไฟล์ที่มีความยาวผันแปรได้ถึงหนึ่งในนั้นด้วยความยาวคงที่


0

ฉันพบว่าระบบ linux ไม่ใช่ dd แคชบัฟเฟอร์ ดังนั้นเมื่อคำสั่ง dd เสร็จสิ้นฉันจะซิงค์ตาม

sudo dd if=my.downloaded.iso of=/dev/sd(?) bs=1M && sync

ฉันไม่ได้ใช้ตัวเลือก dd ภายในใด ๆ เพื่อทำให้การลบบัฟเฟอร์ แม้ว่าโดยทั่วไปแล้วเมื่อฉันสร้างการแจกจ่ายรุ่น USB ฉันเป็นคนเดียวในคอมพิวเตอร์ดังนั้นฉันจึงไม่มีความรู้เกี่ยวกับคำสั่งที่โพสต์ของฉันทำอันตราย เมื่อฉันเรียกใช้การซิงค์เป็น && การซิงค์จะทำโดยใช้สิทธิ์ sudo และฉันมั่นใจว่า USB ที่ฉันสร้างเสร็จสมบูรณ์


0

คุณสามารถใช้syncตัวเลือกสำหรับการส่งออกซึ่งรวมอยู่ในddcomand โดยoflagสัญลักษณ์:

xzcat ~/ubuntu.img.xz | sudo dd of=/dev/sdX bs=32M oflag=sync
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.