`dd if = / dev / zero of = / dev / sda` ทำอะไร


19

แก้ไข: อย่าเรียกใช้สิ่งนี้เพื่อทดสอบเว้นแต่ว่าคุณต้องการทำลายข้อมูล

มีคนช่วยฉันเข้าใจสิ่งที่ฉันได้หรือไม่

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    Q: ทำไมเฉพาะสำหรับ 4096 count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    ถาม: สิ่งนี้ทำอะไรกันแน่


4
คุณไม่พบโค้ดที่เป็นอันตรายนี้อยู่ที่ไหน
Suici Doga

10
นี่ไม่ใช่รหัสที่เป็นอันตราย
Michael Hampton

12
@MichaelHampton: s / เป็นอันตราย / ทำลาย / ในขณะที่โพสต์รหัสการทำลายล้างไม่เป็นอันตรายต่อ se โพสต์โดยไม่มีการเตือนชัดเจนว่ามันสามารถทำลายข้อมูล IS
Ben Voigt

1
เป็นการดีที่สุดที่จะคิดว่า DD เป็น 'ตัวทำลายดิสก์' เมื่อมีคนบนอินเทอร์เน็ตบอกให้คุณเรียกใช้คำสั่งเช่นนี้
Bobby Sacamano

3
จริงๆแล้ว DD หมายถึงคำอธิบายข้อมูล
Suici Doga

คำตอบ:


43

วววววววววววววววววววววววววววววววววววววววววววววววววววววววววววยวยยเหอเหมิในการที่จะ

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

dd if = / dev / zero of = / dev / sda bs = 512 count = 4096 แสวงหา = $ (expr blockdev --getsz / dev / sda - 4096)

ถาม: นี่มันอะไรกันแน่?

blockdev --getszรับขนาดของอุปกรณ์บล็อกใน "เซกเตอร์ 512 ไบต์" ดังนั้นคำสั่งนี้ดูเหมือนว่ามันตั้งใจจะให้ศูนย์ 2 MiB สุดท้ายของไดรฟ์

น่าเสียดายที่คำสั่งนี้ใช้ไวยากรณ์ผิดพลาด ฉันคาดว่าคำสั่งเดิมตั้งใจจะเป็น

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

และ backticks ก็หายไปที่ไหนสักแห่งตามแนวคนคัดลอก / วางระหว่างสภาพแวดล้อมที่แตกต่างกัน

ตารางพาร์ติชันเก่า, ข้อมูลเมตา LVM, ข้อมูลเมตาการโจมตี ฯลฯ อาจทำให้เกิดปัญหาเมื่อนำไดรฟ์กลับมาใช้ใหม่ ส่วนที่ไม่มีการใช้การ zeroing out ในตอนเริ่มต้นและตอนท้ายของไดรฟ์จะหลีกเลี่ยงปัญหาเหล่านี้ในขณะที่เร็วกว่าการทำไดรฟ์ทั้งหมดให้เป็นศูนย์


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

expr blockdev --getsz /dev/sda - 4096exprจะเป็นความผิดพลาดทางไวยากรณ์ของ ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)"ผมคิดว่าคำสั่งที่ตั้งใจไว้คือ หรือดีกว่า:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas

1
ฉันเดาว่าน่าจะมี backticks เดิมในคำสั่งและพวกเขาได้กินในบางจุด
plugwash

16

วิธีนี้จะลบฮาร์ดไดรฟ์ตัวแรก4096*4096=16MBและตัวสุดท้าย512*4096=2MBซึ่งมีโครงสร้างสำคัญที่เป็นประโยชน์สำหรับการกู้คืน ฉันคิดว่ารหัสนี้โพสต์ประสงค์ร้าย

ฉันไม่เคยเจอสถานการณ์ที่ระบุคนcountอื่นอย่างชัดเจนกว่า1มีประโยชน์ ฉันได้ลบบล็อกแรกถ้าฉันต้องการให้แน่ใจว่าฉันไม่ทิ้งร่องรอย MBR ไว้เบื้องหลัง ...


8
สิ่งนี้ไม่เป็นอันตรายโดยไม่ตั้งใจฉันมีโปรแกรมการจัดรูปแบบที่ไม่ดีบางอย่างที่ปฏิเสธที่จะเขียนป้ายกำกับใหม่หากรายการปัจจุบันได้รับความเสียหาย
Shelvacu

1
@shelvacu sdaฉันจะต้องแปลกใจหากไดรฟ์จัดการด้วยวิธีนี้คือ มีโอกาสมากขึ้นหรือsdb sdcแต่ฉันอาจจะผิดแน่นอน ...
yo '

7
สิ่งนี้ไม่เป็นอันตราย มันจะลบ GPT ที่จุดเริ่มต้นของดิสก์และ GPT สำรองที่ท้ายดิสก์
Michael Hampton

2
@shelvacu: มันทำลายล้าง หากคำสั่งการทำลายถูกโพสต์โดยไม่มีคำอธิบายว่ามันทำอะไรมันเป็นอันตราย หากพวกเขามาพร้อมกับคำอธิบายทำไม OP ถึงถามเกี่ยวกับที่นี่?
Ben Voigt

2
ดังนั้นใครในใจที่สมบูรณ์แบบจะคัดลอก / วางรหัสพบที่ใดก็ได้โดยไม่ทราบวัตถุประสงค์ของมัน ไม่เป็นอันตรายเพราะฉันจะไม่เขย่าอุปกรณ์แปลก ๆ ที่ฉันพบที่สถานีรถไฟใต้ดิน
Magno C

4

คำสั่งเหล่านั้นจะเขียนทับอุปกรณ์ sda ของคุณด้วยเลขศูนย์ - อันแรกจะทำ 16MB แรก (ขนาดบล็อก 4096 และนับ 4096 บล็อก) และอันที่สองจะเขียนทับ 2MB ล่าสุด (ขนาดบล็อก 512 กับ 4096 บล็อก) ด้วยศูนย์ (ไม่ได้ลบทางเทคนิคและเกี่ยวข้องกับจุดแรกของฉันด้านล่าง)

(นั่นคือส่วนที่กล่าวถึงแล้วในคำตอบอื่น ๆ รวมถึงที่นี่เพื่อความสมบูรณ์)

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

หากคุณสนใจคุณสามารถลองสร้างไฟล์ที่มีบล็อก 1 ล้านบล็อกและไฟล์ที่มีบล็อก 1 ล้านบล็อกและดูความแตกต่าง:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

อย่างที่คุณเห็น Blockize มีผลกระทบอย่างมากต่อประสิทธิภาพ อาจเป็นแถบด้านข้างของ OP แต่ฉันรู้สึกว่ามันยังเกี่ยวข้อง

TL; DR: อย่าเรียกใช้รหัสโดยอำเภอใจที่คุณพบบนเน็ตหรือว่าคนที่คุณไม่ไว้ใจให้คุณ มันจะทำลายวันของคุณ


7
+1 สำหรับDon't execute arbitrary code you find on the netสาย
Sergiy Kolodyazhnyy

7
"โปรดทราบว่ากระบวนการนี้น่าเบื่ออย่างยิ่งและ / หรือมีราคาแพงและต้องใช้อุปกรณ์เฉพาะอย่างยิ่ง" หยุดเผยแพร่ข้อมูลที่ไม่ถูกต้องนี้ ครั้งสุดท้ายที่เรื่องนี้เป็นไปได้ในทางทฤษฎีก็คือทศวรรษที่ผ่านมาเกี่ยวกับเทคโนโลยีที่มีมาหลายชั่วอายุแล้ว ไม่มีใครแสดงให้เห็นถึงการกู้คืนแบบนี้บนไดรฟ์ที่ทันสมัยแม้จะตอบสนองต่อความท้าทายสาธารณะด้วยเงินรางวัลเช่นhostjury.com/blog/view/195/…
Andrew Medico

ฉันลบหัวข้อนั้น - เดาว่ามันนานแล้วตั้งแต่ฉันได้ยินเรื่องนี้ครั้งแรก ฉันจะบอกว่า "ในทางทฤษฎี" เป็นคำผ่าตัด แต่ฉันพูดนอกเรื่อง
ทิมเอส

2

คนอื่น ๆ ได้อธิบายสิ่งที่พวกเขาทำดังนั้นฉันจะข้ามไป

จุดในddการมีแยกbsและcountการโต้แย้งคือbsการควบคุมวิธีการมากที่จะถูกเขียนในเวลา การระบุค่าที่มีขนาดใหญ่มากสำหรับbsจะต้องใช้บัฟเฟอร์ที่มีขนาดใหญ่จริงๆในโปรแกรมและการระบุค่าที่น้อยกว่าขนาดบล็อกของอุปกรณ์จะช้าลงเนื่องจากเคอร์เนลต้องสร้างทั้งบล็อกเพื่อเขียนไปยังอุปกรณ์ (ในกรณีเช่นนี้ อาจบัฟเฟอร์การเขียนจนกว่าจะมีบล็อกที่สมบูรณ์ในกรณีอื่นอาจต้องอ่านสิ่งที่มีอยู่แล้วในแผ่นดิสก์) เนื่องจากทั้งสองคำสั่งใช้ค่าที่แตกต่างกันbsนั่นทำให้ฉันคิดว่าคุณอาจพบมันในสองไซต์ที่ต่างกัน ฮาร์ดดิสก์เคยมีขนาดบล็อก 512 ไบต์ซึ่งสอดคล้องกับbs=512ของคำสั่งหลัง แต่บางคน (6-8 ฉันคิดว่า) ปีที่แล้วพวกเขาเริ่มทำแผ่นดิสก์ที่มีขนาดบล็อก 4096 ไบต์ทำให้bs=4096เป็นทางเลือกที่ดีกว่าสำหรับแผ่นดิสก์ที่ทันสมัย


1
จุดหวานสำหรับbsนั้นสูงกว่านั้นมาก คำสั่ง SATA เดียวสามารถอ่านหรือเขียนหลายเซกเตอร์ได้ดังนั้นเคอร์เนลจะรวม I / O ก่อนที่จะส่งออก ทุกที่จากbs=64kถึงbs=1024kเหมาะสม (ขนาดแคช L3 มัก 4-8MiB) ฉันมักจะใช้bs=128kซึ่งเป็นครึ่งหนึ่งของขนาดแคช L2 บน CPU ของ Intel ที่ทันสมัย ( ddรวมถึงการดำเนินการ memcpy สองรายการ: ในread(2)จากแหล่งที่มา (แม้ว่าจะเป็น / dev / ศูนย์) และwrite(2). IIRC sddมีตัวเลือกในการเขียนเลขศูนย์ซึ่งจะช่วยประหยัดเวลาของ CPU เพียงเล็กน้อยที่เกี่ยวข้องถ้าปลายทางเป็นสิ่ง นอกเหนือจากดิสก์)
Peter Cordes

หากต้องการดูคำขอการรวม I / O ที่เกิดขึ้นให้ดูที่เอาต์พุตiostat -x 4หรือบางสิ่งและจดบันทึกคอลัมน์ rrqm / s (การร้องขอการรวมการอ่านต่อวินาที) และ wrqm / s
Peter Cordes

1

คำเตือน: dd if=/dev/zero of=/dev/ใช้สำหรับทำความสะอาดไดรฟ์หรืออุปกรณ์ก่อนการคัดลอกข้อมูลทางนิติวิทยาศาสตร์ ไดรฟ์หรืออุปกรณ์จะต้องได้รับการฆ่าเชื้อก่อนที่จะคัดลอกข้อมูลจากระบบภายใต้การตรวจสอบทางนิติวิทยาศาสตร์เพื่อลดการปนเปื้อนข้าม ดังนั้นจึงไม่ใช่คำสั่งที่ไม่ดีผู้ใช้จะต้องเข้าใจสิ่งที่มันใช้สำหรับหรือพวกเขาจะทำลายข้อมูลของพวกเขา dd if=/dev/sda | hexdump -C | headถ้านี่คือสิ่งที่คุณต้องการแล้วเพื่อตรวจสอบการดำเนินงานศูนย์การเขียนสิ่งที่ต้องทำ

ที่มา: คู่มือปฏิบัติเพื่อการสืบสวนทางนิติวิทยาศาสตร์คอมพิวเตอร์โดยดร. ดาร์เรนเฮย์ส


1

ฉันใช้dd if=/dev/zero of=/dev/sdX oflag=syncเพื่อทดสอบคุณภาพของไดรฟ์ USB หรือการ์ด MicroSD ก่อนที่ฉันจะใช้กับ gparted, fdisk หรือ dd กับดิสก์อิมเมจ ฉันคิดว่านี่เป็นความคิดที่ชาญฉลาดโดยเฉพาะอย่างยิ่งกับสื่อ MicroSD ซึ่งมีคุณภาพไม่ดี

แน่นอนระวังด้วย = sdX เพราะไม่มีการให้อภัยเมื่อมีการลบดิสก์โดยไม่ตั้งใจ ตรวจสอบว่า X = อักษรชื่อไดรฟ์ของเป้าหมายที่ต้องการ

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