ทำไมบางครั้ง dd ไม่รอจนกว่าจะมีการเขียนข้อมูล


20

บางครั้งเมื่อฉันเขียนภาพไปยังแฟลชไดรฟ์สิ่งนี้เกิดขึ้น:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

โดยพื้นฐานแล้ว Linux จะแคชทุกอย่างเขียนอะไรและddออก หลังจากฉันพิมพ์syncจะเริ่มเขียนข้อมูล (LED แฟลชไดรฟ์เริ่มกะพริบ)

ทำไมสิ่งนี้ถึงเกิดขึ้น


3
คุณแน่ใจหรือว่า/dev/sdcเป็นอุปกรณ์ที่เกิดขึ้นจริงในระบบของคุณและคุณจะไม่ได้เขียนไปยังแฟ้ม/dev/sdc? ทำls --color /dev- /dev/sdcควรเป็นสีเหลืองหากเป็นอุปกรณ์
LawrenceC

คำตอบ:


21

ใช้สิ่งนี้แทน:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

สิ่งนี้เรียกfsync()หลังทุกการwrite()เรียกของระบบ สิ่งนี้บังคับddไม่ให้แคชอะไรเลย ดูส่วนนี้ของ manpage ของ fsync ( man 2 fsync):

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

นี่คือพฤติกรรมเริ่มต้นของเมล็ด เคอร์เนล Linux จัดการการเขียนและอ่านแคชดังนี้: เมื่อwrite()ออก syscall ข้อมูลจะถูกเขียนไปยังแคชอย่างรวดเร็วและสถานะการเขียนเสร็จสมบูรณ์จะถูกส่งไปยังกระบวนการ เมื่อต้องการบัฟเฟอร์หรือเมื่อมีเวลาว่างบนบัสข้อมูลจะถูกเขียนจากแคชไปยังฮาร์ดดิสก์


1
ฉันชอบที่คำตอบของคุณและฉันครอบคลุมวิธีที่แตกต่างกันเกือบทั้งหมด ดี +1
ChrisInEdmonton

1
@ChrisInEdmonton dito +1
chaos

คำตอบทั้งหมดเป็นสิ่งที่ดีในคำถามนี้
Francisco Tapia

@chaos เพียงชี้แจง: นี่คือพฤติกรรมเริ่มต้นของเมล็ด - คุณหมายความว่าconv=fsyncเป็นค่าเริ่มต้นเมื่อเขียนไปยังบล็อกอุปกรณ์ดังกล่าวที่ddไม่ได้แคชอะไร? กำลังมองหาคำตอบที่ดีสำหรับสิ่งนี้: unix.stackexchange.com/questions/312687/ …
โจนาธานโคมาร์

10

สิ่งนี้เกิดขึ้นเนื่องจาก Linux และระบบปฏิบัติการอื่น ๆ ส่วนใหญ่แคชทั้งอ่านและเขียน ในกรณีส่วนใหญ่สิ่งนี้ทำให้ระบบปฏิบัติการของคุณตอบสนองได้ดีขึ้น

หากคุณต้องการให้แน่ใจว่าข้อมูลแคชถูกเขียนขึ้นคุณต้องการใช้syncตามที่คุณรู้ Linux แสดงการตั้งค่าจำนวนมากที่คุณสามารถปรับได้เช่นกัน บทความนี้ให้ภาพรวมที่ดีของการตั้งค่าบางอย่าง ตัวอย่างเช่นคุณสามารถตั้งค่า vm.dirty_background_bytes เป็น 0 เพื่อให้แน่ใจว่าเคอร์เนลเตะออกจากเธรด flusher ทันที


7

sync (8) - หน้าลินุกซ์ :

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

หมายเหตุ: unmount(หรือนำออก) เรียกโดยอัตโนมัติว่าsync"ซ่อน" สิ่งนี้ในการใช้ระบบไฟล์ปกติ

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