รอให้คำสั่ง dd เขียนไปยังดิสก์อย่างสมบูรณ์


13

ฉันใช้คำสั่ง dd เพื่อสร้าง usb ที่สามารถบู๊ตได้จากไฟล์ iso:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M

หลังจากกดเข้าก็จะออกและให้ฉัน:

915+0 records in 915+0 records out 959447040 bytes (959 MB) copied,
0.539375 s, 1.8 GB/s

มันเหมือนกับการทำงานในพื้นหลังเพราะฉันเห็นว่าแฟลชไดรฟ์ทำงานได้ ในที่สุดมันจะหยุดการคัดลอกและฉันสามารถลบไดรฟ์ได้สำเร็จ แต่คำถามคือทำไมคำสั่ง dd ไม่รอให้การคัดลอกเสร็จสิ้น ทำไมมันทำงานในพื้นหลัง และฉันจะรอได้อย่างไร


4
คุณเคยลองsyncไหม
choroba

1
@choroba การเรียกใช้ 'ทำข้อมูลให้ตรงกัน' ถ้าระบบเขียนข้อมูลไปยังแฟลชไดรฟ์อยู่แล้ว
Kirill Ivlev

ฉันไม่แน่ใจว่า byt syncอาจรอ
choroba

2
ddconv=fsyncนอกจากนี้ยังมีตัวเลือกการซิงค์บางอย่างเช่น ที่กล่าวว่าฉันไม่เคยใช้กับ/dev/sd*ไดรฟ์ตัวเอง หากคุณใช้ตัวอักษร/dev/sdxคาดเดาของฉันจะได้รับคุณมีไฟล์ที่ไร้ประโยชน์ใน 959MB /dev(ramdisk) ตอนนี้ ...
frostschutz

1
@frostschutz ฉันใช้ / sdc สำหรับแฟลชไดรฟ์ของฉัน
Kirill Ivlev

คำตอบ:


21

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

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

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx bs=1M; sync

ส่วนใหญ่แล้วคุณไม่จำเป็นต้องโทรออกsyncเพราะการ unmounting ระบบไฟล์จะทำงานเหมือนกัน เมื่อumountคำสั่งส่งคืนหรือเมื่อคุณได้รับข้อความยืนยันหลังจากคลิก "นำออก" บัฟเฟอร์จะถูกเขียนไปยังดิสก์ ที่นี่คุณเขียนไปยังดิสก์โดยตรงโดยไม่ต้องผ่านระบบไฟล์ที่เมาท์ดังนั้นคุณต้องล้างบัฟเฟอร์อย่างชัดเจน

โปรดทราบว่าแทนคุณสามารถใช้dd teeนี้มีสองข้อดี: มีความเสี่ยงน้อยกว่า inverting ต้นทางและปลายทางเนื่องจากการพิมพ์ผิดและก็อาจจะเร็วขึ้นเล็กน้อย

<~/Desktop/ubuntu.iso sudo tee /dev/sdx >/dev/null; sync

1
วิธีการเกี่ยวกับปุ่ม / ไอคอน "นำออก" หรือ "นำออกอย่างปลอดภัย" พวกเขาจะไม่เรียกการซิงค์ก่อนที่จะให้การแจ้งเตือน "ตกลงเพื่อลบ" หรือไม่
user68186

1
คุณอาจต้องการใช้sudo tee /dev/sdx >/dev/nullมิฉะนั้นกระบวนการคัดลอกจะยังช้ามากเนื่องจากข้อมูลถูกเขียนไปยังเอาต์พุตคอนโซล
Lekensteyn

1
@ user68186 พวกเขาไม่เรียกsyncคำสั่ง แต่พวกเขาทำงานเดียวกันภายใต้ประทุน
Gilles 'หยุดความชั่วร้าย'

5
คำตอบนี้ผิด โดยไม่ต้องconv=fdatasyncของddคำสั่งไม่รอที่จะเสร็จสิ้นจนกว่าข้อมูลจะถูกเขียนไปยังดิสก์ที่เป็น OP ที่มีการร้องขอ นอกจากนี้syncคำสั่งกำหนดเวลาการดำเนินการซิงค์ แต่จะส่งกลับทันที มันไม่รอที่จะกลับมาจนกว่าจะมีการเขียนข้อมูลลงดิสก์
vy32

1
@ vy32 คุณถูกต้องddจะไม่รอให้ล้างแคชโดยไม่ต้องconv=fdatasyncเป็นต้น แต่บน Linux ที่ไม่ใช่ของโบราณคุณไม่ถูกต้องเกี่ยวกับการsyncไม่รอ ท่านสามารถเข้าดูcoreutils' sync(8)ทำให้sync(2) syscall sync(2)คนหน้ากล่าวว่า "ก่อนที่รุ่น 1.3.20 ลินุกซ์ไม่รอสำหรับ I / O ให้เสร็จสมบูรณ์ก่อนที่จะกลับ." ดังนั้นsync(8)จะไม่ส่งคืนจนกว่าดิสก์จะยอมรับการเขียน (หรือมีข้อผิดพลาดเกิดขึ้น)
Anon

13

ลองสิ่งนี้:

sudo dd if=~/Desktop/ubuntu.iso of=/dev/sdx conv=fdatasync bs=1m

การconv=fdatasyncบอกddให้ใช้ตัวเลือกพิเศษเพื่อให้แน่ใจว่าข้อมูลถูกเขียนไปยังอุปกรณ์ทางกายภาพ

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