Bagaimana cara mengabaikan kesalahan tulis saat memusatkan perhatian pada disk?


19

Katakanlah Anda ingin menghapus hard disk yang gagal. Anda ingin menimpa sebanyak mungkin dengan nol. Yang tidak Anda inginkan adalah: proses batal pada kesalahan tulis pertama. Bagaimana cara melakukannya?

AFAICS, polos ddhanya menyediakan opsi untuk mengabaikan kesalahan baca. Jadi, kira-kira seperti itu

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

tidak cukup.

ddrescue tampaknya lebih baik dalam mengabaikan kesalahan - tetapi apa yang akan menjadi baris perintah optimal dengannya?

Percobaan saya dengan GNU ddrescue:

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

1
dd conv=noerrormungkin ekstensi GNU, saya tidak yakin. Bagaimanapun, itu harus melakukan trik. Namun, jawaban SATA tell-the-drive-to-erase itu sendiri layak untuk dihapus seluruh drive.
Peter Cordes

1
@PeterCordes, halaman manual dddokumen GNU noerrorsebagai 'lanjutkan setelah membaca kesalahan' ...
maxschlepzig

1
dd conv=noerrorPOSIX standar tetapi mungkin benar-benar lambat
schily

2
dd conv=noerrorharus untuk kesalahan membaca (menurut halaman manual), bukan kesalahan penulisan. Tidak ada yang buruk dalam menggabungkannya conv=notrunc, yang melakukan trik dengan mengabaikan kesalahan tulis untuk saya. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Operasi tulis sederhana ke HDD, seperti menggunakan dd if=/dev/zero of=/dev/sdX, tidak akan melakukan pembacaan disk. Menurut Anda mengapa perintah dd "tidak cukup" ? "Kesalahan" apa yang Anda alami?
serbuk gergaji

Jawaban:


12

Saya lebih suka badblocksdalam mode penulisan destruktif untuk ini. Itu menulis, itu terus melakukannya ketika hits kesalahan, dan akhirnya memberitahu Anda di mana kesalahan itu, dan informasi ini dapat membantu Anda memutuskan apa yang harus dilakukan selanjutnya (Will It 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)

Dan daftar blokir:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Dan apa yang tersisa di disk setelahnya:

# 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.|

Perhatikan itu bukan data yang benar-benar acak - polanya berulang-ulang, jadi jika Anda melewatkan 1MiBAnda akan melihat output yang sama lagi.

Ini juga akan mencoba memverifikasi dengan membaca kembali data, jadi jika Anda memiliki disk yang mengklaim berhasil menulis tetapi mengembalikan data yang salah pada readback, ia akan menemukan kesalahan itu juga. (Pastikan tidak ada proses lain menulis ke disk saat badblock berjalan untuk menghindari kesalahan positif.)

Tentu saja dengan disk yang rusak parah, ini mungkin memakan waktu terlalu lama: tidak ada kode yang akan melompati seluruh area yang rusak. Satu-satunya cara Anda dapat mencapainya adalah dengan badblocksmenggunakan ukuran blok yang jauh lebih besar.

Saya tidak yakin apakah ddrescueini lebih baik; itu seharusnya melakukan itu ke arah lain (pulihkan data secepat mungkin). Anda dapat melakukannya secara manual untuk dd / ddrescue / badblocks dengan menentukan blok pertama / terakhir ...


1
Jika saya menggunakan -t randomatau -t 0- tidak badblock maka hanya melakukan satu tulis pass? Melihat halaman manual - tampaknya tanpa -titu melewati 4 (untuk '0xaa, 0x55, 0xff, 0x00').
maxschlepzig

2
Itu satu lulus untuk setiap yang -tAnda berikan pada baris perintah. Standarnya adalah 4 berlalu seperti yang Anda katakan.
frostschutz

13

Jika disk tidak terhubung oleh USB, maka pertimbangkan untuk menggunakan hdparm(versi> 9.31) untuk melakukan ATA Secure Erase pada disk. Perintah ini menyebabkan firmware drive untuk menghapus isi disk, termasuk blok yang buruk.

Peringatan: Gunakan huruf drive yang benar - saya telah tunjukkan /dev/sdXsebagai contoh - jangan hanya menyalin / menempel.

Pertama, periksa apakah ia memahami perintah ATA (sebagian besar drive yang diproduksi dekade terakhir ini atau lebih seharusnya):

$ 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.

Dua baris terakhir dari ekstrak menunjukkan bahwa itu didukung.

Oleh karena itu tambahkan kata sandi ke drive (tampaknya persyaratan):

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

dan hapus:

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

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

Info lebih lanjut tentang prosedur ini tersedia di sini .


Ini dapat bekerja melalui USB jika Anda beruntung, dan USB Anda <-> jembatan SATA dapat melewati perintah SATA non-standar (dan driver Linux + hdparm tahu bagaimana melakukannya pada model itu). Juga, untuk menulis contoh, /dev/sdXadalah baik, karena jika seseorang melewatkan kejadian ketika menempel dan menyesuaikan, tidak akan ada masalah.
Peter Cordes

@Peter Cordes - Kecuali Anda memiliki 24 disk ... Tidak, konyol saya! Terima kasih, saya telah mengubahnya ke sdX, yang akan mengajarkan saya untuk segera menjawab!
garethTheRed

2
Halaman yang ditautkan mencantumkan begitu banyak peringatan terkait perangkat keras / firmware dengan metode ini ... agak menakutkan
maxschlepzig

Itu memang menunjukkan beberapa peringatan! Yang bisa saya katakan adalah itu bekerja untuk saya tanpa masalah.
garethTheRed

2

Saya melihat empat jawaban yang bisa diterapkan di sini:

  1. The hdparmMetode diposting oleh garethTheRed mungkin terbaik jika Anda terhubung langsung ke komputer Anda. Namun, tampaknya, jika Anda mencobanya terhubung melalui USB, Anda dapat merusak drive Anda. Jika Anda melakukan ini untuk drive yang akan Anda buang, maka itu mungkin hal yang baik. Namun, Anda mungkin ingin mengamankan penghapusan sebelum membuangnya.

  2. Teknik yang dilaporkan oleh imz - Ivan Zakharyaschev akan berhasil, tetapi mungkin sangat lambat. Saya sarankan jika Anda tidak ingin data dapat dipulihkan, gunakan /dev/urandomsebagai ganti /dev/zero; misalnya,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Saya akan menyarankan saran berikut. Untuk sesuatu yang lebih cepat yang melakukan hal yang sama, gunakan teknik yang dilaporkan oleh maxschlepzig (dalam pertanyaan):

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

    Ini akan lebih cepat dari ddperintah, tetapi tidak secepat hdparmperintah. Lihat di bawah mengapa saya tidak merekomendasikan ini ...

  4. The badblocksperintah akan juga bekerja, tetapi Anda tidak dapat mengacak data seperti itu, dan lagi itu akan sangat lambat.

Akhirnya, saya akan lalai jika saya tidak menunjukkan nomor satu alasan orang ingin menghapus disk adalah karena mereka akan membuangnya. Dalam hal ini, jika Anda belum melakukannya, Anda mungkin ingin mencoba dan memulihkan disk terlebih dahulu. Jika Anda membaca blok dan mengembalikan kesalahan I / O, maka lain kali Anda menulis ke blok yang sama, disk akan mencoba merealokasi blok yang berbeda dari daftar cadangan. Setelah daftar cadangan penuh maka Anda akan mendapatkan kesalahan I / O pada penulisan. Saat itulah Anda benar-benar harus membuang drive.

Jadi Anda dapat melakukan sesuatu yang sederhana seperti:

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

Dan, kemudian, untuk menulis ulang blok buruk, hanya sesuatu seperti:

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

Jika perintah ini berhasil, jika Anda berani, Anda dapat memformat ulang disk Anda dan menggunakannya lagi.

Atau, Anda dapat menjalankan badblocksperintah pada disk dua kali. Kedua kalinya harus melaporkan tidak ada blok buruk ...

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

Ini akan memakan waktu lebih lama, tetapi lebih dapat diandalkan.

Perlu juga dicatat bahwa tidak ada teknik yang benar-benar melakukan penghapusan aman, kecuali hdparmperintah. Ingat semua blok buruk itu? Sebagian besar data asli Anda masih utuh. Pakar pemulihan data dapat mengaksesnya untuk melihat sedikit dari apa yang sebelumnya ada di hard drive Anda.

Sehubungan dengan ddrescue dan mengapa saya menasihatinya, saya memiliki penangkal berikut:

Masalahnya adalah ddrescure akan TERLALU baik dalam mengabaikan kesalahan. Saya memiliki hard drive yang secara konsisten dengan kecepatan tulis turun sekitar 102 GB dan mulai menghasilkan kesalahan tulis pada angka 238 GB. Saya cukup terkesan bahwa ddrescue terus berputar melalui disk dengan kecepatan konstan, bahkan melaporkan tidak ada kesalahan. 17 jam kemudian, ketika berada di 1300 GB ketika saya melihat lampu drive itu sendiri berhenti berkedip. Pemeriksaan cepat mengungkapkan seluruh penutup USB menjadi offline. Saya menarik drive keluar dari dudukan. Saya perhatikan ddrescue dengan senang hati melaporkannya masih menyalin tanpa kesalahan, bahkan dengan disk di tangan saya. Saya menancapkan disk ke komputer lain dan ternyata itu adalah batu bata.

Saya tidak menyalahkan ddrescue karena membuat drive menjadi batu bata. Drive itu gagal dan akan menjadi batu bata. Saya hanya menemukan ddrescue yang mengganggu bahkan tidak memberikan jumlah kesalahan berapa banyak kesalahan tulis yang diabaikannya. Dalam penggunaan ini, ddrescue membuat Anda berpikir itu telah sepenuhnya berhasil, terlepas dari semua kegagalan penulisan. Faktanya adalah ia seharusnya tidak dapat melanjutkan dengan kecepatan penuh di bagian dengan memperlambat. Alasan mengapa bagian itu lambat, adalah banyak blok telah dipindahkan oleh drive, menyebabkan banyak pencarian ketika mengakses bagian itu. Jadi itu mungkin titik ketika output ddrescue menjadi fiksi.


1
'Untuk menghapus dengan aman, kamu perlu menimpa blok yang sama beberapa kali dengan data acak.' - dapatkah Anda memperkuat klaim Anda dengan referensi (mis. artikel yang diulas sejawat yang menunjukkan pemulihan data yang di-nolkan pada hard disk modern)? Juga, firmware harddisk adalah kotak hitam. Bagaimana Anda tahu bahwa perintah penghapusan aman ATA tidak hanya diimplementasikan sebagai tulis-nol-pola-untuk-masing-masing sektor?
maxschlepzig

Justru sebaliknya. Sepertinya pada tahun 2006 ada sejumlah studi yang menunjukkan sekolah lama menulis banyak tidak lagi diperlukan dengan drive modern, seperti drive modern menyimpan data begitu padat sehingga satu tulisan sama efektifnya.
user6856

1
dd conv=notrunc

mungkin melakukan trik untuk saya.

Yang disebutkan

dd conv=noerror

harus untuk kesalahan membaca (sesuai dengan halaman manual). Tidak ada yang buruk dalam menggabungkan keduanya.

Perintah lengkap saya untuk memusatkan disk mirip dengan:

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

Menambahkan kustom bs=juga mungkin diinginkan untuk beberapa kasus.


1

Metode yang cepat dan matang adalah menggunakan sdd.

Jika Anda hanya ingin menghancurkan semua konten, hubungi:

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

Selalu gunakan antarmuka driver disk "mentah".

Jika Anda ingin memperbaiki disk dan menyimpan sebanyak mungkin konten lama, hubungi:

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

Ini akan mengganti semua blok yang tidak dapat dibaca dengan nol pada level 512 byte. Anda mungkin ingin memodifikasi jumlah coba lagi melalui try=#, standarnya adalah 2.

Perhatikan bahwa sddini lebih cepat daripada ddseandainya terjadi kesalahan saat pertama kali mencoba membaca dengan blocksize yang disediakan dan jika terjadi kesalahan, ia membaca dengan 512 byte. Jika ada kesalahan baca, sdd membuat pencarian acak dan membaca dummy untuk menenangkan firmware drive.

Fitur-fitur pemulihan kesalahan yang ditingkatkan telah dikembangkan pada 1980-an ketika saya bekerja untuk OEM Sun-Microsystems terbesar kedua.

Sumber kode SDD termasuk dalam alat schily:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.