Come ignorare gli errori di scrittura durante l'azzeramento di un disco?


19

Supponi di voler azzerare un disco rigido guasto. Vuoi sovrascrivere il più possibile con zeri. Quello che non vuoi è: il processo si interrompe al primo errore di scrittura. Come farlo?

AFAICS, plain ddoffre solo un'opzione per ignorare gli errori di lettura. Quindi, qualcosa del genere

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

non è abbastanza.

ddrescue sembra essere migliore nell'ignorare gli errori, ma quale sarebbe la riga di comando ottimale con esso?

Il mio tentativo con GNU ddrescue:

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

1
dd conv=noerrorpotrebbe essere un'estensione GNU, non sono sicuro. In ogni caso, dovrebbe fare il trucco. Tuttavia, vale la pena cercare la risposta SATA che dice all'unità di cancellare se stessa.
Peter Cordes,

1
@PeterCordes, la pagina man dei dddocumenti GNU noerrorcome 'continua dopo errori di lettura' ...
maxschlepzig

1
dd conv=noerrorè lo standard POSIX ma potrebbe essere molto lento
schily

2
dd conv=noerrordeve essere per errori di lettura (secondo la manpage), non per errori di scrittura. Non c'è niente di male nel combinarlo con conv=notrunc, che ha fatto il trucco ignorando gli errori di scrittura per me. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev

Una semplice operazione di scrittura su un HDD, come l'utilizzo dd if=/dev/zero of=/dev/sdX, non eseguirà alcuna lettura del disco. Perché pensi che il comando dd "non sia abbastanza" ? Quali "errori" stai riscontrando?
segatura,

Risposte:


12

Preferisco badblocksin modalità di scrittura distruttiva per questo. Scrive, continua a farlo quando rileva errori, e infine ti dice dove erano quegli errori, e queste informazioni potrebbero aiutarti a decidere cosa fare dopo (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)

E l'elenco dei blocchi:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

E ciò che rimane sul disco dopo:

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

Nota che non sono dati realmente casuali: il pattern è ripetitivo, quindi se salti 1MiBvedresti di nuovo lo stesso output.

Tenterà inoltre di verificare leggendo nuovamente i dati, quindi se si dispone di un disco che afferma di scrivere correttamente ma restituisce dati errati in lettura, troverà anche questi errori. (Assicurarsi che nessun altro processo scriva sul disco mentre i badblock sono in esecuzione per evitare falsi positivi.)

Naturalmente con un disco gravemente rotto questo potrebbe richiedere troppo tempo: non esiste un codice che lo salti completamente sulle aree difettose. L'unico modo per raggiungere questo obiettivo badblockssarebbe usare una dimensione di blocco molto più grande.

Non sono sicuro se ddrescuelo fa meglio; dovrebbe farlo nell'altra direzione (recuperare quanti più dati il ​​più velocemente possibile). Puoi farlo manualmente per dd / ddrescue / badblocks specificando il primo / ultimo blocco ...


1
Se uso -t randomo -t 0- i badblock eseguono un solo passaggio di scrittura? Guardando la pagina man - sembra che senza di -tessa faccia 4 passaggi (per '0xaa, 0x55, 0xff, 0x00').
maxschlepzig,

2
Fa un passaggio per ciascuno di essi -tfornito sulla riga di comando. L'impostazione predefinita è 4 passaggi, come dici tu.
frostschutz,

13

Se il disco non è collegato tramite USB, è consigliabile utilizzare hdparm(versione> 9.31) per eseguire una cancellazione sicura ATA del disco. Questo comando fa cancellare il contenuto del disco dal firmware dell'unità, inclusi i blocchi danneggiati.

Avvertenza: utilizzare la lettera di unità corretta - ho mostrato /dev/sdXcome esempio - non solo copiare / incollare.

Innanzitutto, controlla che capisca i comandi ATA (la maggior parte delle unità prodotte nell'ultimo decennio o più dovrebbe):

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

Le ultime due righe dell'estratto mostrano che è supportato.

Pertanto aggiungi una password all'unità (un requisito apparentemente):

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

e cancella:

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

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

Maggiori informazioni su questa procedura sono disponibili qui .


Questo può funzionare su USB se sei fortunato e il tuo bridge USB <-> SATA può passare attraverso comandi SATA non standard (e il driver Linux + hdparm sa come farlo su quel modello). Inoltre, per scrivere esempi, /dev/sdXè un bene, perché se qualcuno ne perde un'occorrenza durante l'incollaggio e la personalizzazione, non ci sarà alcun problema.
Peter Cordes,

@Peter Cordes - A meno che tu non abbia 24 dischi ... No, sciocco me! Grazie, l'ho cambiato in sdX, questo mi insegnerà a rispondere in fretta!
garethTheRed,

2
La pagina collegata elenca così tanti avvertimenti relativi all'hardware / firmware con questo metodo ... un po 'spaventoso
maxschlepzig

Mostra davvero parecchi avvertimenti! Tutto quello che posso dire è che ha funzionato per me senza alcun problema.
garethTheRed,

2

Vedo quattro risposte realizzabili qui:

  1. Il hdparmmetodo pubblicato da garethTheRed è probabilmente il migliore se sei collegato direttamente al tuo computer. Apparentemente, tuttavia, se lo provi collegato tramite USB, puoi bloccare l'unità. Se lo stai facendo per un disco che stai per smaltire, allora potrebbe essere una buona cosa. Tuttavia, probabilmente si desidera proteggere con sicurezza prima di scartarlo.

  2. La tecnica riportata da imz - Ivan Zakharyaschev funzionerà, ma potrebbe essere molto lenta. Vorrei suggerire se non si desidera che i dati siano recuperabili, utilizzare al /dev/urandomposto di /dev/zero; per esempio,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Vorrei sconsigliare quanto segue. Per qualcosa di più veloce che fa la stessa cosa, usa la tecnica riportata da maxschlepzig (nella domanda):

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

    Questo sarà più veloce del ddcomando, ma non così veloce come il hdparmcomando. Vedi sotto perché non lo consiglio ...

  4. Anche il badblockscomando funzionerà, ma non puoi randomizzare i dati in quel modo, e di nuovo sarà molto lento.

Infine, sarei negligente se non indicassi il numero uno dei motivi per cui le persone vogliono cancellare completamente un disco se stanno per smaltirlo. In tal caso, se non lo hai già fatto, potresti provare a ripristinare prima il disco. Se leggi un blocco e restituisce l'errore I / O, la prossima volta che scrivi nello stesso blocco il disco proverà a riallocare un blocco diverso da un elenco di riserva. Una volta che l'elenco di riserva è pieno, verranno visualizzati errori I / O nelle scritture. Questo è quando dovresti davvero scartare l'unità.

Quindi puoi fare qualcosa di semplice come:

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

E, quindi, per riscrivere i blocchi danneggiati, solo qualcosa del tipo:

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

Se questo comando funziona, se sei coraggioso, puoi riformattare il disco e riutilizzarlo.

In alternativa, è possibile eseguire il badblockscomando sul disco due volte. La seconda volta non dovrebbe segnalare blocchi danneggiati ...

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

Questo richiederà più tempo, ma è più affidabile.

Vale anche la pena notare che nessuna delle tecniche esegue una cancellazione sicura, tranne il hdparmcomando. Ricordi tutti quei brutti blocchi? Quelli hanno ancora alcuni dei tuoi dati originali per lo più intatti. Un esperto di recupero dati potrebbe accedervi per vedere una piccola quantità di ciò che era precedentemente sul tuo disco rigido.

Per quanto riguarda ddrescue e perché sconsiglio, ho il seguente antidoto:

Il problema è che ddrescure sarà TROPPO bravo a ignorare gli errori. Ho avuto un disco rigido che coerentemente con dd ha ridotto la velocità di scrittura a circa 102 GB e ho iniziato a produrre errori di scrittura a 238 GB. Sono rimasto piuttosto impressionato dal fatto che ddrescue abbia continuato a sfogliare il disco a velocità costante, anche senza segnalare errori. 17 ore dopo, quando era a 1300 GB, quando mi è capitato di notare che la stessa luce dell'unità ha smesso di lampeggiare. Un rapido controllo ha rivelato che l'intero contenitore USB era offline. Ho estratto il disco dalla base. Ho notato che ddrescue ha appena riferito felicemente che stava ancora copiando senza errori, anche con il disco in mano. Ho collegato il disco a un'altra macchina e ho scoperto che ora era un mattone.

Non do la colpa a ddrescue per aver reso l'unità un mattone. Il disco non funzionava e sarebbe diventato un mattone. Trovo che disturbare ddrescue non dia nemmeno un conteggio degli errori di quanti errori di scrittura sta ignorando. In questo utilizzo, ddrescue ti lascia pensare che abbia avuto completamente successo, indipendentemente da tutti gli errori di scrittura. Il fatto è che non avrebbe dovuto essere in grado di continuare a tutta velocità nella sezione con il rallentamento. Il motivo per cui la sezione era lenta è che molti blocchi sono stati trasferiti dall'unità, causando molte ricerche quando si accede a quella sezione. Quindi questo è probabilmente il punto in cui l'output di ddrescue è diventato fittizio.


1
"Per cancellare in modo sicuro è necessario sovrascrivere lo stesso blocco più volte con dati casuali." - puoi comprovare il tuo reclamo con un riferimento (ad esempio un articolo con peer review che mostra il recupero di dati azzerati su hard disk moderni)? Inoltre, il firmware del disco rigido è una scatola nera. Come fai a sapere che il comando di eliminazione sicura ATA non è solo implementato come modello zero-scrittura per ogni settore?
maxschlepzig,

Solo il contrario. Sembra che nel 2006 ci siano stati diversi studi che hanno dimostrato che le scritture della vecchia scuola non sono più necessarie con le unità moderne, poiché le unità moderne archiviano i dati in modo così denso che una sola scrittura è altrettanto efficace.
user6856

1
dd conv=notrunc

probabilmente ha fatto il trucco per me.

Il citato

dd conv=noerror

deve essere per errori di lettura (secondo la manpage). Non c'è niente di male nel combinare i due.

Il mio comando completo per azzerare un disco sembrava:

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

L'aggiunta di un'abitudine bs=può anche essere desiderata per alcuni casi.


1

È necessario utilizzare un metodo rapido e maturo sdd.

Se desideri semplicemente distruggere tutti i contenuti, chiama:

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

Utilizzare sempre l'interfaccia del driver del disco "raw".

Se ti piace riparare un disco e conservare quanto più vecchio contenuto possibile, chiama:

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

Ciò sostituirà tutti i blocchi illeggibili con zero a livello di 512 byte. È possibile che si desideri modificare il conteggio dei tentativi tramite try=#, il valore predefinito è 2.

Si noti che sddè più veloce che ddin caso di errori in quanto tenta di leggere per la prima volta con il blocco fornito e in caso di errori, legge con 512 byte. In caso di errori di lettura, sdd esegue ricerche casuali e letture fittizie per calmare il firmware dell'unità.

Le funzionalità avanzate di recupero degli errori sono state sviluppate negli anni '80 mentre lavoravo per il secondo OEM Sun-Microsystems.

Il codice sorgente Sdd è incluso negli strumenti schily:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.