วิธีการละเว้นข้อผิดพลาดการเขียนในขณะที่เป็นศูนย์ดิสก์?


19

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

AFAICS ธรรมดาddเท่านั้นมีตัวเลือกสำหรับละเว้นข้อผิดพลาดในการอ่าน ดังนั้นสิ่งที่ชอบ

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

ไม่พอ.

ddrescue ดูเหมือนว่าจะดีกว่าที่ละเว้นข้อผิดพลาด - แต่สิ่งที่จะเป็นบรรทัดคำสั่งที่ดีที่สุดกับมัน?

ความพยายามของฉันกับ GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123

1
dd conv=noerrorอาจเป็นส่วนขยายของ GNU ฉันไม่แน่ใจ ไม่ว่าในกรณีใดก็ควรจะทำการหลอกลวง คำตอบของ SATA-to-drive-to-erase นั้นคุ้มค่าที่จะมองหาเพื่อลบไดรฟ์ทั้งหมด
Peter Cordes

1
@PeterCordes หน้า man ของddเอกสารGNU noerrorเป็น 'ดำเนินการต่อหลังจากอ่านข้อผิดพลาด' ...
maxschlepzig

1
dd conv=noerrorist POSIX มาตรฐาน แต่มันอาจจะช้าจริงๆ
schily

2
dd conv=noerrorจะต้องเป็นข้อผิดพลาดในการอ่าน ไม่มีอะไรเลวร้ายในการรวมเข้ากับconv=notruncซึ่งทำเคล็ดลับโดยไม่สนใจข้อผิดพลาดในการเขียนสำหรับฉัน unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

การเขียนอย่างง่าย ๆ ไปยัง HDD เช่นการใช้dd if=/dev/zero of=/dev/sdXงานจะไม่อ่านดิสก์ใด ๆ ทำไมคุณถึงคิดว่าคำสั่งdd "ไม่เพียงพอ" ? คุณกำลังประสบกับข้อผิดพลาดอะไร
ขี้เลื่อย

คำตอบ:


12

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

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

และรายการบล็อก:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

และสิ่งที่เหลืออยู่บนดิสก์หลังจากนั้น:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

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

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

แน่นอนว่าดิสก์ที่ใช้งานไม่ได้อาจใช้เวลานานเกินไป: ไม่มีรหัสที่จะทำให้ข้ามพื้นที่ที่มีข้อบกพร่องทั้งหมด วิธีเดียวที่คุณจะประสบความสำเร็จด้วยการbadblocksใช้บล็อคขนาดใหญ่ขึ้น

ฉันไม่แน่ใจว่าddrescueจะทำได้ดีกว่านี้หรือไม่ มันควรจะทำอย่างนั้นในอีกทางหนึ่ง (กู้คืนข้อมูลให้เร็วที่สุดเท่าที่จะทำได้) คุณสามารถทำได้ด้วยตนเองสำหรับ dd / ddrescue / badblocks โดยระบุบล็อกแรก / บล็อกสุดท้าย ...


1
ถ้าฉันใช้-t randomหรือ-t 0- badblocks ทำเพียงแค่เขียนผ่านหนึ่ง? ดูหน้า man - ดูเหมือนว่า-tจะไม่มี 4 รอบ (สำหรับ '0xaa, 0x55, 0xff, 0x00')
maxschlepzig

2
มันผ่านหนึ่งสำหรับแต่ละ-tคุณให้ในบรรทัดคำสั่ง ค่าเริ่มต้นคือ 4 รอบตามที่คุณพูด
frostschutz

13

หากดิสก์ไม่ได้เชื่อมต่อด้วย USB ให้ลองใช้hdparm(รุ่น> 9.31) เพื่อดำเนินการลบ ATA Secureของดิสก์ คำสั่งนี้ทำให้เฟิร์มแวร์ของไดรฟ์เพื่อล้างเนื้อหาของดิสก์รวมถึงบล็อกที่ไม่ดี

คำเตือน:ใช้อักษรระบุไดรฟ์ที่ถูกต้อง - ฉันได้แสดง/dev/sdXเป็นตัวอย่าง - ไม่เพียง แต่คัดลอก / วาง

ก่อนอื่นให้ตรวจสอบว่าเข้าใจคำสั่ง ATA (ไดรฟ์ส่วนใหญ่ที่ผลิตในทศวรรษที่ผ่านมาหรือมากกว่านี้):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

แยกสองบรรทัดสุดท้ายแสดงว่าได้รับการสนับสนุน

ดังนั้นจึงต้องเพิ่มรหัสผ่านให้กับไดรฟ์

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

และลบ:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

ข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนนี้สามารถใช้ได้ที่นี่


สิ่งนี้สามารถทำงานผ่าน USB ได้หากคุณโชคดีและ USB <-> SATA bridge ของคุณสามารถส่งผ่านคำสั่ง SATA ที่ไม่ได้มาตรฐาน (และไดรเวอร์ Linux + hdparm รู้วิธีการทำเช่นนั้นกับรุ่นนั้น) นอกจากนี้สำหรับการเขียนตัวอย่าง/dev/sdXก็ดีเพราะถ้ามีใครคิดถึงมันเกิดขึ้นเมื่อวางและปรับแต่งมันจะไม่มีปัญหา
Peter Cordes

@Peter Cordes - ถ้าคุณไม่มีดิสก์ 24 แผ่น ... ไม่นะฉันสิ! ขอบคุณฉันเปลี่ยนมันเป็น sdX ที่จะสอนให้ฉันรีบเร่งคำตอบ!
garethTheRed

2
หน้าที่เชื่อมโยงจะแสดงรายการคำเตือนเกี่ยวกับฮาร์ดแวร์ / เฟิร์มแวร์มากมายด้วยวิธีนี้ ... น่ากลัวมาก
maxschlepzig

มันแสดงให้เห็นไม่กี่ข้อแน่นอน! ทั้งหมดที่ฉันสามารถพูดได้คือมันใช้งานได้สำหรับฉันโดยไม่มีปัญหาใด ๆ
garethTheRed

2

ฉันเห็นคำตอบที่ใช้การได้สี่ข้อที่นี่:

  1. hdparmวิธีการโพสต์โดยgarethTheRedน่าจะดีที่สุดถ้าคุณมีการเชื่อมต่อโดยตรงไปยังเครื่องคอมพิวเตอร์ของคุณ เห็นได้ชัดว่าหากคุณลองเชื่อมต่อผ่าน USB คุณสามารถสร้างไดรฟ์ของคุณ หากคุณกำลังทำสิ่งนี้เพื่อขับรถที่คุณกำลังจะกำจัดนั่นอาจเป็นสิ่งที่ดี อย่างไรก็ตามคุณอาจต้องการลบการรักษาความปลอดภัยก่อนที่จะทิ้ง

  2. เทคนิคที่รายงานโดยimz - Ivan Zakharyaschevจะทำงานได้ แต่อาจช้ามาก ฉันจะแนะนำถ้าคุณไม่ต้องการกู้คืนข้อมูลใช้/dev/urandomแทน/dev/zero; เช่น,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. ฉันจะแนะนำต่อไปนี้ สำหรับสิ่งที่เร็วกว่าที่ทำสิ่งเดียวกันให้ใช้เทคนิคที่รายงานโดย maxschlepzig (ตามคำถาม):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    สิ่งนี้จะเร็วกว่าddคำสั่ง แต่ไม่เร็วเท่าhdparmคำสั่ง ดูด้านล่างทำไมฉันไม่แนะนำสิ่งนี้ ...

  4. badblocksคำสั่งก็จะทำงาน แต่คุณไม่สามารถสุ่มข้อมูลที่ทางและอีกครั้งมันจะช้ามาก

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

ดังนั้นคุณสามารถทำสิ่งที่ง่าย ๆ เช่น:

dd if=/dev/sdX of=/dev/null conv=noerror

จากนั้นในการเขียนบล็อกที่ไม่ดีใหม่ให้ทำดังนี้:

dd if=/dev/zero of=/dev/sdX bs=128k

หากคำสั่งนี้ใช้งานได้หากคุณกล้าคุณสามารถฟอร์แมตดิสก์ใหม่และใช้งานได้อีกครั้ง

หรือคุณสามารถเรียกใช้badblocksคำสั่งบนดิสก์สองครั้ง ครั้งที่สองที่ควรรายงานไม่มีบล็อกที่ไม่ดี ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

สิ่งนี้จะใช้เวลานานกว่า แต่มีความน่าเชื่อถือมากกว่า

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

ในเรื่องที่เกี่ยวกับ ddrescue และทำไมฉันถึงแนะนำฉันฉันมียาแก้พิษดังต่อไปนี้:

ปัญหาคือ ddrescure จะดีเกินไปที่ละเว้นข้อผิดพลาด ฉันมีฮาร์ดไดรฟ์ที่สอดคล้องกับ dd ความเร็วในการเขียนลดลงที่ประมาณ 102 GB และเริ่มผลิตข้อผิดพลาดในการเขียนที่ 238 GB ฉันประทับใจมากที่ ddrescue ยังคงปั่นผ่านดิสก์ด้วยความเร็วคงที่แม้รายงานว่าไม่มีข้อผิดพลาด 17 ชั่วโมงต่อมาเมื่อมันอยู่ที่ 1300 GB ในเมื่อฉันเกิดขึ้นสังเกตเห็นไฟไดรฟ์ตัวเองหยุดกระพริบ การตรวจสอบอย่างรวดเร็วเผยให้เห็นว่ากล่องหุ้ม USB ทั้งหมดออฟไลน์อยู่ ฉันดึงไดรฟ์ออกจากอู่ ฉันสังเกตเห็นว่า ddrescue เพียงแค่รายงานอย่างมีความสุขมันยังคงคัดลอกโดยไม่มีข้อผิดพลาดแม้จะมีดิสก์ในมือของฉัน ฉันเสียบดิสก์เข้ากับเครื่องอื่นและพบว่าตอนนี้กลายเป็นอิฐ

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


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

เพียงย้อนกลับ ดูเหมือนว่าในปี 2549 มีการศึกษาจำนวนหนึ่งที่แสดงให้เห็นว่าการเขียนหลายครั้งในโรงเรียนเก่านั้นไม่จำเป็นต้องใช้ไดรฟ์ที่ทันสมัยอีกต่อไปเนื่องจากไดรฟ์สมัยใหม่เก็บข้อมูลไว้อย่างแน่นหนาว่าการเขียนเพียงครั้งเดียว
user6856

1
dd conv=notrunc

อาจเป็นเคล็ดลับสำหรับฉัน

เรื่องที่กล่าวถึง

dd conv=noerror

ต้องเป็นข้อผิดพลาดในการอ่าน (ตาม manpage) ไม่มีอะไรเลวร้ายในการรวมทั้งสองเข้าด้วยกัน

คำสั่งที่สมบูรณ์ของฉันสำหรับ zeroing ดิสก์ดูเหมือนว่า:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

bs=อาจต้องการเพิ่มการกำหนดเองสำหรับบางกรณี


1

sddได้อย่างรวดเร็วและครบกำหนดวิธีการคือการใช้งาน

หากคุณต้องการทำลายเนื้อหาทั้งหมดให้โทร:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

ใช้อินเตอร์เฟสไดรเวอร์ดิสก์ "ดิบ" เสมอ

หากคุณต้องการซ่อมแซมดิสก์และเก็บเนื้อหาเก่าให้มากที่สุดให้โทร:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

สิ่งนี้จะแทนที่บล็อกที่ไม่สามารถอ่านได้ทั้งหมดด้วยค่าศูนย์ที่ระดับ 512 ไบต์ คุณอาจต้องการแก้ไขจำนวนการลองใหม่ผ่านทางtry=#ค่าเริ่มต้นคือ 2

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

คุณลักษณะการกู้คืนข้อผิดพลาดที่ได้รับการปรับปรุงได้รับการพัฒนาในปี 1980 ขณะที่ฉันทำงานให้กับ Sun-Microsystems OEM ที่ใหญ่เป็นอันดับสอง

Sdd sourcecode รวมอยู่ในเครื่องมือ schily:

http://sourceforge.net/projects/schilytools/files/

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