Precaución: la solución descrita en este artículo no es profesional, puede haberse creado sobre la base de un malentendido de la estructura y los principios de funcionamiento de los discos duros. La repetición de los pasos anteriores puede dañar el equipo.
Recientemente me encontré con un artículo sobre el uso de discos duros viejos con bloques defectuosos y pensé que mi experiencia también podría ser interesante para alguien.
Una vez, algunos conocidos me pidieron que ayudara a manejar una computadora portátil en la que no podían reinstalar Windows. La computadora portátil, a juzgar por la apariencia, tuvo una vida difícil: grietas en el estuche, esquinas abolladas, bastidores rotos. Está claro que el problema es el daño en el disco duro como resultado de numerosos golpes, lo que también fue confirmado por smart: más de 200 operaciones de sensores G, 500 recuentos de sectores reasignados y todavía hay en curso pendiente. Bueno, la gente, por supuesto, instalé el SSD y copié la información de su tornillo en la imagen con el comando:
dd if=/dev/sdb of=/media/hddimages/ht320.img bs=409600 conv=noerror,notrunc,sync
Los parámetros "conv = noerror, notrunc, sync" son necesarios para que en caso de errores en la lectura de ciertos sectores, los ceros se escriban en estas direcciones en el archivo de salida, y los datos se escriban en su lugar sin sesgo.
Sucede que cuando se lee en bloques grandes (400 kb), el disco no lee todo el bloque, y los más pequeños no leen solo 1 sector. Los sectores aquí son de 4kb, así que después de la primera pasada de dd, si hubo errores de lectura, intento leer estas secciones nuevamente en bloques de 4kb:
n=<>;dd if=/dev/sdb of=/media/hddimages/ht320.img bs=4096 conv=noerror,notrunc,sync skip=$n seek=$n count=100
Los parámetros de salto y búsqueda son necesarios para que la lectura y la escritura comiencen con la misma sangría desde el comienzo del disco. La sangría en sí se toma de la salida de la primera ejecución dd, solo para que coincida con el tamaño del bloque, multiplique el número por 100.
A veces, cuando se accede a sectores defectuosos, los discos se congelan durante mucho tiempo, tanto que solo la reconexión a la alimentación eléctrica ayuda y hace unos 5 años se creó un complejo de hardware y software (incluso con un microcontrolador) para automatizar la lectura de los discos duros defectuosos con reconexión automática de energía en caso de que también Una larga falta de respuesta. Fue interesante y permitido, al conectar el disco duro e ingresar el comando, después de 10 días para obtener la imagen más completa. Pero el héroe experimental del artículo no se aferró, por lo que no hubo necesidad de obtener la muleta pesada descrita.
Por lo tanto, se consideró el disco, monté todas las secciones de la imagen a través de la configuración con desplazamiento del comienzo de las particiones desde fdisk, multiplicado por el tamaño del bloque lógico en mbr - 512 bytes, copio todos los datos a las personas en un nuevo SSD. Si el disco no estuviera montado o no se pudieran leer muchos archivos, abriría la imagen con R-Studio y la restauraría a través de él, pero desde la imagen misma.
Pero lo difícil, aunque es derrotado, es una pena tirarlo, así que decidí reanimarlo de alguna manera. Teóricamente, el controlador de disco marca los sectores como dañados y reasigna los sectores de respaldo a sus direcciones en caso de repetidos intentos fallidos de escritura o errores de lectura irrecuperables (usando ECC).
Primero trato de borrar el disco (dd if = / dev / zero ...) y leer después de eso: la velocidad también es inestable, el disco se congela y a veces se produce un error de entrada / salida, pero en el sistema inteligente aumenta el número de reenganches y pendientes. Después de varios ciclos, el inteligente no cambió mucho, los pendientes no se reubicaron y los errores se cuelgan cada vez en los mismos lugares o muy cerca. Intento reasignar a la fuerza manualmente con el comando "hdparm --make-bad-sector", pero esto no funciona en este modelo y me doy cuenta de que solo borrar-leer, así como escribir-leer, no podrá mostrar todas las áreas problemáticas. De hecho, si un bit dañado, independientemente de lo que intentaron escribirle, es más probable que se lea como "1", entonces, al escribirlo, "1", la lectura posterior tendrá lugar sin errores, pero al escribir un patrón diferente, puede existen suficientes inconsistencias para que el ECC falle y se produzca un error de lectura irreparable, y después de varios de estos casos, el sector recibió el estado de "Malo". Por cierto, el valor registrado puede superponerse tanto en la distribución de bits dañados que un valor incorrecto de lectura incluso satisfará el ECC. Por lo tanto, para maximizar la identificación de todos los sectores defectuosos, debe generar un patrón relativamente aleatorio, escribirlo en el disco, leer y comparar el valor. También hay sectores inestables, que cambian sus valores gradualmente con el tiempo o después de procesar a sus vecinos.
Dado todo lo anterior, decidí implementar la siguiente estrategia en un script bash:
- generamos un patrón aleatorio y consideramos la suma de comprobación para ello;
- nosotros leemos de manera inteligente;
- escribe un disco en ceros;
- lee el disco;
- escribimos un disco en un patrón aleatorio con la lectura del bloque recién registrado y la comparación de su suma de verificación;
- leemos el disco después de la grabación completa, verificando las sumas de verificación de cada bloque;
- nosotros leemos de manera inteligente;
- autocomprobación;
- ir a 1.
Continuamos de esta manera hasta que los sectores incorrectamente leídos y los errores de E / S dejen de ocurrir o hasta que el tornillo esté completamente cubierto. Por cierto, no puedo imaginar cómo funciona la autocomprobación para este modelo de disco; No sé cuánto tiempo difiere de short'a (aunque probablemente el largo funciona con toda la superficie y breve, centrándome en las estadísticas recopiladas anteriormente, como con el formato: completo y rápido). Espero que esto aliente al tornillo a tener en cuenta la experiencia reciente y reasignar los sectores defectuosos.
Cuando terminé de escribir el script bash, lo ejecuté y verifiqué los resultados al día siguiente: vi que la verificación es muy lenta, mientras que la carga del procesador no alcanza el 60% en ningún núcleo. Esto me hizo jugar con el tamaño del bloque, probar diferentes algoritmos hash para sumas de verificación, probar la verificación directa de diferencias y no comparar las sumas de verificación, pero no pude alcanzar velocidades de procesamiento superiores a 12 megabytes por segundo. Como resultado, me detuve al comparar bloques de 400 kb con diff, y calculo las sumas de verificación solo si hay una falta de coincidencia solo para el análisis posterior del registro.
Como mostraron los registros después de la ejecución repetida del guión, todos los sectores defectuosos estaban en los primeros 13 GB del disco, hubo varios "focos" de derrota (probablemente, cuando la cabeza golpeó, la superficie estaba rayada y rayada). Durante las últimas 15 ejecuciones, el disco no ha visto ningún sector pendiente, todo ya fue reasignado, pero en algún lugar en el medio del 13 Gigabyte, un bloque o bloques no muy lejos de él se leyeron incorrectamente a diferentes direcciones. Además, un bloque podría considerarse incorrecto durante 2 ciclos seguidos, luego 2 veces correctamente y nuevamente incorrectamente. Así que atrapar los últimos 10 sectores defectuosos fue una operación larga. ¡Un total de 1268 sectores fueron reasignados! Y al final, me esperaba una sorpresa: cuando todo ya funcionaba de manera estable, después de la siguiente autocomprobación, el parámetro Recuento de sector reasignado se convirtió en "0" y solo el Recuento de eventos reasignado y los registros de los últimos 5 errores (con dirección y hora de comenzar a trabajar) almacenado en el diario.
A pesar de la operación estable, decidí minimizar la interacción con el área dañada para no dañar la cabeza por posibles irregularidades en lugares con superficie dañada de las placas, y no quería confiar en los sectores locales a largo plazo. Simplemente retrocedí un poco con un margen y creé una partición comenzando con el 15 Gigabyte. Y, como lo ha demostrado el tiempo, el disco se siente bastante bien y ha estado funcionando de manera estable en una computadora portátil portátil durante 10 meses.
Aunque es imposible confiar plenamente en el disco restaurado y la viabilidad económica de la empresa es dudosa, a veces el resultado es solo una adición agradable a la buena manera.