จะเกิดอะไรขึ้นถ้าฉัน dd เป็นศูนย์ของไดรฟ์ที่มี dd อยู่


10

คำสั่งนี้จะdd if=/dev/zero of=/dev/sda bs=1Mประสบความสำเร็จหรือไม่หากคำสั่ง dd เดิมอยู่บน / dev / sda จะเสร็จสมบูรณ์หรือไม่เนื่องจาก dd อยู่ในหน่วยความจำในเวลานั้น

คำตอบ:


40

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

  1. คำสั่งเริ่มต้นทำงานจนกว่าจะเสร็จสมบูรณ์และคุณกลับไปที่พรอมต์ เนื่องจากดิสก์ถูกลบอย่างมีประสิทธิภาพที่คุณไม่สามารถทำอะไรได้มากหลังจากนั้นแม้ว่าคุณอาจโชคดีที่มีคำสั่งในตัวเชลล์
  2. คำสั่งเริ่มต้น ในบางจุดมันได้รับการเพจออกเนื่องจากแรงกดดันหน่วยความจำ โดยปกตินี่ไม่ใช่ปัญหาเพราะบางส่วนของมันสามารถโหลดใหม่จากดิสก์ (ข้อมูลที่ไม่เปลี่ยนแปลง) ของจาก swap อย่างไรก็ตามหากคุณเพิ่งลบสิ่งเหล่านี้ดังนั้นคำสั่ง dd จะล้มเหลวบางส่วนแม้ว่าจะเติมดิสก์
  3. ตัวเลือกที่สามคือบางสิ่งบางอย่างจาก BSD MBR บนดิสก์ที่ติดตั้งได้รับการปกป้องจากการเขียนทับ แม้ว่าคุณจะรันคำสั่งในฐานะรูทก็ตาม ลีนุกซ์มีลีนุกซ์จำนวนมาก, ซึ่งต่างกันเพียงเล็กน้อยเท่านั้น. เป็นไปได้ค่อนข้างที่บางคนเลียนแบบสิ่งนี้


จนถึงตอนนี้สำหรับทฤษฎี ตอนนี้สำหรับการทดสอบภาคปฏิบัติ

ฉันติดตั้ง Ubuntu 12.10 ใหม่บน VM (VMware เวิร์กสเตชันบน win7-x64 โดยใช้ตัวเลือกเริ่มต้นและดิสก์เสมือน 10 GB)

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

สกรีนช็อตของ Ubuntu VM หลังจากเช็ดดิสก์


9
ใหญ่ +1 สำหรับการทดสอบภาคปฏิบัติ!
Doug Harris

10
ฉันเห็นSegmentation faultและคุณอ้างว่ามันสำเร็จแล้ว ... ?
Alvin Wong

1
ใช่ ทำให้ดิสก์ไม่สามารถอ่านได้ ฉันคิดว่านั่นคือเป้าหมาย สำหรับการลบที่ปลอดภัยคุณควรลองทำอย่างอื่น (เช่นคำสั่งลบปลอดภัย)
Hennes

หนึ่งในคำตอบที่ดีที่สุดที่ฉันเคยได้รับ ขอบคุณ!
agz

6

การทดสอบอย่างรวดเร็วในเครื่องเสมือนโดยใช้ Damn Small Linux บ่งชี้ว่าคำสั่ง dd เสร็จสมบูรณ์ตามที่คาดไว้ โปรแกรมถูกโหลดครั้งแรกในหน่วยความจำเพื่อให้ทำงานและมีความรู้สึกน้อยมากในการโหลดโปรแกรมที่เรียกใช้ซ้ำแล้วซ้ำอีกในระหว่างกระบวนการ ในที่สุด dd จะออกและรายงาน 'ไม่มีพื้นที่เหลือบนอุปกรณ์'

หลังจากนั้นระบบปฏิบัติการดูเหมือนว่าจะทำงานได้ตามปกติตั้งแต่แรกเห็น แต่หยุดทำงานหลังจากคำสั่งแรกมันไม่สามารถดำเนินการได้ด้วยเหตุผลที่ชัดเจนและไม่ตอบสนอง การตรวจสอบเนื้อหาฮาร์ดไดรฟ์อย่างย่อ ๆ แสดงว่าพาร์ติชั่นนั้นเป็นศูนย์จริง ๆ


4

จากmmapหน้าบน Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

ไฟล์ที่เรียกทำงานนั้นถูกแมปกับหน่วยความจำโดยเคอร์เนลผ่านการโทรภายในไปยังmmapฟังก์ชัน MAP_PRIVATEแผนที่ชนิดมีการร้องขอ (มองในfs/binfmt_elf.cของต้นไม้มาเคอร์เนล)

ดังนั้นจึงทำให้พฤติกรรมของmmap: ไม่ว่าจะเป็นการเปลี่ยนแปลงในไฟล์หรืออุปกรณ์บล็อกที่อ้างอิงไฟล์นั้นจะถูกแพร่กระจายกลับไปยังหน้าของการทำแผนที่ซึ่งได้รับการเพจและมีอยู่แล้ว

หน้านั้นเป็นไปตามมาตรฐาน API มากกว่าการทำงานของเคอร์เนลดังนั้น "ไม่ได้ระบุ" พฤติกรรมที่แท้จริงคือการเปลี่ยนแปลงไฟล์จะไม่แพร่กระจายกลับไปยังหน้าปัจจุบัน แน่นอนหากโปรแกรมข้ามไปยังหน้าของรหัสที่ไม่ได้รับการเพจและการลบได้เกิดขึ้นแล้วมันจะได้รับหน้าของศูนย์ทั้งหมด

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

แต่หน้านั้นอาจถูกแคชจากการddเรียกใช้ครั้งก่อนหน้าเช่นกัน



0

ฉันทำผิดพลาดเร็ว ๆ นี้ ผมตั้งใจจะ dd กิกะไบต์ img 2 ลงบน SD Card แต่ไม่ได้ไป SDA dd if=rasberrypi.img of=/dev/sdaโดยไม่ได้ตั้งใจ ตระหนักถึงความผิดพลาดของฉันและยกเลิก dd แต่หลังจากนั้นมีการเขียน ~ 600MB (บนดิสก์ที่ใช้ ~ 500GB) ตารางฉากกั้นถูกทำลาย

เดสก์ท็อป (ที่มีหน่วยความจำ 10 GB ขึ้นไปเป็นเวลาหลายสัปดาห์) ยังคงทำงานต่อไปอีกสองสามชั่วโมงหากไม่มีอะไรเกิดขึ้น จัดการเพื่อให้ได้รับการเปลี่ยนแปลงไฟล์สำคัญเมื่อเร็ว ๆ นี้เป็นดรอปบ็อกซ์ซึ่งเรียกดูในโครเมียมตามปกติ ในความเป็นจริงฉันสามารถเรียกใช้ dd ไปยังการ์ด SD ตามที่ฉันต้องการได้ แต่ใช้งานได้ดี

หลังจากสองสามชั่วโมงระบบไฟล์ของฉันเข้าสู่โหมดอ่านอย่างเดียวและโปรแกรมสุ่มเริ่มตาย ฉันถูก sshed ในระบบอื่น ๆ อีกมากมายฉันสามารถใช้เซสชันเหล่านั้นต่อไปได้ แต่การสร้างเซสชันใหม่ทำให้เกิดข้อผิดพลาดว่าไม่พบโปรแกรม ssh ในเวลานี้ฉันสามารถสลับแท็บที่เปิดอยู่ในโครเมี่ยมได้ แต่เนื้อหาของแท็บดูเหมือนจะ "หยุด" ถ้าฉันรีเฟรชฉันจะได้รับหน้าจอสีขาวตลอดกาล rsyslogd ใช้ CPU 100% (1 คอร์) ด้วยเหตุผลบางอย่างอาจจะสับสนว่าทำไมมันไม่สามารถล้างบันทึกลงดิสก์ ... อาจจะ

ฉันเปิดวิดีโอ 350 MB (และหยุดชั่วคราว) ใน VLC ฉันยังคงสามารถเล่นได้และข้ามไปยังส่วนใด ๆ ของวิดีโอ อาจเป็นเพราะการดาวน์โหลดล่าสุด

ฉันสามารถปิดระบบได้ตามปกติโดยใช้ GUI ไม่มีข้อผิดพลาด

ดังนั้นนี่จะไม่ตอบคำถามของคุณอย่างแน่นอน แต่บอกว่าจะเกิดอะไรขึ้นถ้าหากคุณลบล้างจุดเริ่มต้นของดิสก์ ..

สิ่งต่าง ๆ บนดิสก์ส่วนใหญ่ยังคงสามารถกู้คืนได้ แต่ฉันจะไม่รำคาญเพราะทุกสิ่งที่ฉันสนใจมีการสำรองไว้ (หวังว่า)


-1

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


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

@DAvid Schwartz ถ้าเป็นเช่นนั้น #rm -rf / จะลบระบบไฟล์ทั้งหมด ฉันรู้จากการทดลองที่ไม่เป็นเช่นนั้น ระบบไม่สามารถทำงานต่อเนื่องได้นานจาก ram ยกเว้นว่ามีการใช้เทคโนโลยี ramdisk บางชนิดซึ่งไม่ได้มาตรฐาน
Frank Thomas

@FrankThomas: เคอร์เนลตื่นตกใจใช่ไหม
David Schwartz

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