¿Cómo ignorar los errores de escritura al poner a cero un disco?

19

Supongamos que desea poner a cero un disco duro defectuoso. Desea sobrescribir tanto como sea posible con ceros. Lo que no quiere es: el proceso se cancela en el primer error de escritura. ¿Como hacer eso?

AFAICS, plain ddsolo proporciona una opción para ignorar los errores de lectura. Por lo tanto, algo como

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

no es suficiente.

ddrescue parece ser mejor para ignorar los errores, pero ¿cuál sería la línea de comando óptima?

Mi intento con GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123
maxschlepzig
fuente
1
dd conv=noerrorpodría ser una extensión de GNU, no estoy seguro. En cualquier caso, debería hacer el truco. Sin embargo, vale la pena considerar la respuesta SATA para decirle a la unidad que se borre por sí misma para borrar unidades enteras.
Peter Cordes
1
@PeterCordes, la página del manual de dddocumentos GNU noerrorcomo 'continuar después de leer errores' ...
maxschlepzig
1
dd conv=noerrores el estándar POSIX, pero puede ser muy lento
astucia el
2
dd conv=noerrordebe ser para leer errores (de acuerdo con la página de manual), no para escribir errores. No hay nada malo en combinarlo conv=notrunc, lo que hizo el truco al ignorar los errores de escritura para mí. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev
Una operación de escritura simple en un HDD, como usar dd if=/dev/zero of=/dev/sdX, no realizaría ninguna lectura de disco. ¿Por qué crees que el comando dd "no es suficiente" ? ¿Qué "errores" estás experimentando?
aserrín

Respuestas:

12

Prefiero badblocksen modo de escritura destructiva para esto. Escribe, continúa haciéndolo cuando encuentra errores, y finalmente le dice dónde estaban esos errores, y esta información puede ayudarlo a decidir qué hacer a continuación (¿se combinará?).

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

Y la lista de bloqueo:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

Y lo que queda en el disco después:

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

Tenga en cuenta que no se trata realmente de datos aleatorios: el patrón es repetitivo, por lo que si omite 1MiB, volverá a ver la misma salida.

También intentará verificar leyendo los datos nuevamente, por lo que si tiene un disco que dice estar escribiendo correctamente pero devuelve datos incorrectos en la lectura, también encontrará esos errores. (Asegúrese de que ningún otro proceso escriba en el disco mientras se ejecutan bloques defectuosos para evitar falsos positivos).

Por supuesto, con un disco mal roto, esto puede llevar demasiado tiempo: no hay un código que lo haga saltar por completo las áreas defectuosas. La única forma de lograrlo badblockssería usando un tamaño de bloque mucho más grande.

No estoy seguro de si ddrescueesto mejora; se supone que debe hacerlo en la otra dirección (recuperar la mayor cantidad de datos lo más rápido posible). Puede hacerlo manualmente para dd / ddrescue / badblocks especificando el primer / último bloque ...

Frostschutz
fuente
1
Si utilizo -t randomo -t 0, ¿tiene badblocks, solo hago un pase de escritura? Mirando la página del manual, parece que sin -tella pasa 4 pases (para '0xaa, 0x55, 0xff, 0x00').
maxschlepzig
2
Realiza una pasada por cada uno -tque proporcione en la línea de comando. El valor predeterminado es 4 pases como usted dice.
frostschutz
13

Si el disco no está conectado por USB, considere usar hdparm(versión> 9.31) para realizar un borrado seguro ATA del disco. Este comando hace que el firmware de la unidad borre el contenido del disco, incluidos los bloques defectuosos.

Advertencia: utilice la letra de unidad correcta (lo he mostrado /dev/sdXcomo ejemplo), no solo copie / pegue.

Primero, compruebe que comprende los comandos ATA (la mayoría de las unidades fabricadas en esta última década o más deberían):

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

Las dos últimas líneas del extracto muestran que es compatible.

Por lo tanto, agregue una contraseña a la unidad (un requisito aparentemente):

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

y borrar:

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

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

Más información sobre este procedimiento está disponible aquí .

garethTheRed
fuente
Esto puede funcionar a través de USB si tiene suerte, y su puente USB <-> SATA puede pasar a través de comandos SATA no estándar (y el controlador de Linux + hdparm sabe cómo hacerlo en ese modelo). Además, para escribir ejemplos, /dev/sdXes bueno, porque si alguien se olvida de ello al pegar y personalizar, no habrá ningún problema.
Peter Cordes
@ Peter Cordes - A menos que tengas 24 discos ... ¡No, tonto! Gracias, lo he cambiado a sdX, ¡eso me enseñará a apresurar una respuesta!
garethTheRed
2
La página vinculada enumera tantas advertencias relacionadas con el hardware / firmware con este método ... un poco aterrador
maxschlepzig
¡De hecho, muestra bastantes advertencias! Todo lo que puedo decir es que funcionó para mí sin ningún problema.
garethTheRed
2

Veo cuatro respuestas viables aquí:

  1. El hdparmmétodo publicado por garethTheRed es probablemente mejor si está conectado directamente a su computadora. Aparentemente, sin embargo, si lo prueba conectado a través de USB, puede bloquear su unidad. Si está haciendo esto para una unidad que está a punto de desechar, entonces eso puede ser algo bueno. Sin embargo, probablemente desee asegurar el borrado antes de descartarlo.

  2. La técnica informada por imz - Ivan Zakharyaschev funcionará, pero puede ser muy lenta. Sugeriría que si no desea que los datos sean recuperables, use en /dev/urandomlugar de /dev/zero; p.ej,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Yo aconsejaría lo siguiente. Para algo más rápido que haga lo mismo, use la técnica informada por maxschlepzig (en la pregunta):

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

    Esto será más rápido que el ddcomando, pero no tan rápido como el hdparmcomando. Vea a continuación por qué no recomiendo esto ...

  4. los badblocks comando también funcionará, pero no puede aleatorizar los datos de esa manera, y nuevamente será muy lento.

Finalmente, sería negligente si no señalara la razón número uno por la que las personas quieren borrar completamente un disco es que están a punto de deshacerse de él. En ese caso, si aún no lo ha hecho, puede intentar primero recuperar el disco. Si lee un bloque y devuelve el error de E / S, la próxima vez que escriba en el mismo bloque, el disco intentará reasignar un bloque diferente de una lista de reserva. Una vez que la lista de reserva esté llena, obtendrá errores de E / S en las escrituras. Es entonces cuando realmente debe descartar la unidad.

Entonces puedes hacer algo simple como:

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

Y, luego, para reescribir los bloques defectuosos, algo así como:

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

Si este comando funciona, si eres valiente, puedes formatear tu disco y usarlo nuevamente.

Alternativamente, puede ejecutar el badblockscomando en el disco dos veces. La segunda vez no debería informar de bloques defectuosos ...

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

Esto llevará más tiempo, pero es más confiable.

También vale la pena señalar que ninguna de las técnicas realmente hace un borrado seguro, excepto el hdparm comando. ¿Recuerdas todos esos bloques malos? Esos todavía tienen algunos de sus datos originales casi intactos. Un experto en recuperación de datos podría acceder a estos para ver una pequeña cantidad de lo que estaba anteriormente en su disco duro.

En cuanto a ddrescue y por qué desaconsejo, tengo el siguiente antídoto:

El problema es que ddrescure será DEMASIADO bueno para ignorar los errores. Tenía un disco duro que constantemente con dd disminuía la velocidad de escritura en aproximadamente la marca de 102 GB y comencé a producir errores de escritura en la marca de 238 GB. Me impresionó bastante que ddrescue continuara revolviendo el disco a una velocidad constante, incluso sin informar errores. 17 horas después, cuando estaba en los 1300 GB cuando noté que la luz de la unidad dejó de parpadear. Una comprobación rápida reveló que todo el gabinete USB se había desconectado. Saqué el disco de la cuna. Me di cuenta de que ddrescue felizmente informó que todavía estaba copiando sin errores, incluso con el disco en mis manos. Conecté el disco a otra máquina y descubrí que ahora era un ladrillo.

No culpo a ddrescue por hacer que la unidad sea un ladrillo. La unidad fallaba y se convertiría en un ladrillo. Simplemente encuentro que ddrescue perturbador ni siquiera da un recuento de errores de cuántos errores de escritura está ignorando. En este uso, ddrescue te deja pensar que ha sido completamente exitoso, independientemente de todas las fallas de escritura. El hecho es que no debería haber podido continuar a toda velocidad en la sección con la desaceleración. La razón por la que la sección era lenta es que el disco había reubicado muchos bloques, lo que provocó muchas búsquedas al acceder a esa sección. Entonces ese es probablemente el punto cuando la producción de ddrescue se volvió ficticia.

usuario6856
fuente
1
"Para borrar de forma segura, debe sobrescribir el mismo bloque varias veces con datos aleatorios". - ¿Puede justificar su reclamo con una referencia (es decir, un artículo revisado por pares que muestre la recuperación de datos a cero en discos duros modernos)? Además, el firmware del disco duro es una caja negra. ¿Cómo sabe que el comando de eliminación segura de ATA no solo se implementa como escribir-cero-patrón-para-cada-sector?
maxschlepzig
Justo lo contrario. Parece que en 2006 hubo una serie de estudios que mostraron que las escrituras múltiples de la vieja escuela ya no son necesarias con las unidades modernas, ya que las unidades modernas almacenan los datos tan densos que una sola escritura es igual de efectiva.
usuario6856
1
dd conv=notrunc

probablemente hizo el truco para mí.

El mencionado

dd conv=noerror

debe ser para errores de lectura (de acuerdo con la página de manual). No hay nada malo en combinar los dos.

Mi comando completo para poner a cero un disco se veía así:

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

bs=También puede querer agregar una costumbre para algún caso.

imz - Ivan Zakharyaschev
fuente
1

Un método rápido y maduro es usar sdd .

Si solo desea destruir todo el contenido, llame al:

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

Utilice siempre la interfaz del controlador de disco "en bruto".

Si desea reparar un disco y conservar la mayor cantidad de contenido antiguo posible, llame al:

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

Esto reemplazará todos los bloques ilegibles con ceros a nivel de 512 bytes. Puede modificar el recuento de reintentos a través detry=# , el valor predeterminado es 2.

Tenga en cuenta que sddes más rápido quedd en caso de errores, ya que primero intenta leer con el tamaño de bloque suministrado y, en caso de errores, lee con 512 bytes. Si hay errores de lectura, sdd realiza búsquedas aleatorias y lecturas ficticias para calmar el firmware de la unidad.

Las funciones mejoradas de recuperación de errores se desarrollaron en la década de 1980 mientras trabajaba para el segundo mayor OEM de Sun-Microsystems.

El código fuente sdd está incluido en las herramientas schily:

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

astuto
fuente