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 dd
solo 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
dd conv=noerror
podrí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.dd
documentos GNUnoerror
como 'continuar después de leer errores' ...dd conv=noerror
es el estándar POSIX, pero puede ser muy lentodd conv=noerror
debe ser para leer errores (de acuerdo con la página de manual), no para escribir errores. No hay nada malo en combinarloconv=notrunc
, lo que hizo el truco al ignorar los errores de escritura para mí. unix.stackexchange.com/a/229379/4319dd 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?Respuestas:
Prefiero
badblocks
en 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á?).Y la lista de bloqueo:
Y lo que queda en el disco después:
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
badblocks
sería usando un tamaño de bloque mucho más grande.No estoy seguro de si
ddrescue
esto 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 ...fuente
-t random
o-t 0
, ¿tiene badblocks, solo hago un pase de escritura? Mirando la página del manual, parece que sin-t
ella pasa 4 pases (para '0xaa, 0x55, 0xff, 0x00').-t
que proporcione en la línea de comando. El valor predeterminado es 4 pases como usted dice.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/sdX
como 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):
Las dos últimas líneas del extracto muestran que es compatible.
Por lo tanto, agregue una contraseña a la unidad (un requisito aparentemente):
y borrar:
Más información sobre este procedimiento está disponible aquí .
fuente
/dev/sdX
es bueno, porque si alguien se olvida de ello al pegar y personalizar, no habrá ningún problema.Veo cuatro respuestas viables aquí:
El
hdparm
mé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.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/urandom
lugar de/dev/zero
; p.ej,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):
Esto será más rápido que el
dd
comando, pero no tan rápido como elhdparm
comando. Vea a continuación por qué no recomiendo esto ...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:
Y, luego, para reescribir los bloques defectuosos, algo así como:
Si este comando funciona, si eres valiente, puedes formatear tu disco y usarlo nuevamente.
Alternativamente, puede ejecutar el
badblocks
comando en el disco dos veces. La segunda vez no debería informar de bloques defectuosos ...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.
fuente
probablemente hizo el truco para mí.
El mencionado
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í:
bs=
También puede querer agregar una costumbre para algún caso.fuente
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 de
try=#
, el valor predeterminado es 2.Tenga en cuenta que
sdd
es 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/
fuente