Tengo una unidad que informa que los sectores pendientes actuales son "45". He usado bloques defectuosos para identificar los sectores y he estado tratando de escribirles ceros con dd .
Por lo que entiendo, cuando intento escribir datos directamente en los sectores defectuosos, debería desencadenar una reasignación, reduciendo los sectores pendientes actuales en uno y aumentando el recuento de sectores reasignados.
Sin embargo, en este disco, los valores brutos Reallocated_Sector_Ct y Reallocated_Event_Count son 0, y dd falla con errores de E / S cuando intento escribir ceros en los sectores defectuosos. dd funciona bien, sin embargo, cuando escribo a un buen sector.
# dd if=/dev/zero of=/dev/sdb bs=512 count=1 seek=217152
dd: error writing ‘/dev/sdb’: Input/output error
¿Significa esto que mi unidad, de alguna manera, no tiene sectores libres para ser reasignados? ¿Es mi unidad en general una persona terrible? (La unidad no es realmente mía, estoy ayudando a un amigo. Es posible que hayan obtenido una unidad barata o algo así).
En caso de que sea relevante, aquí está la salida de smartctl -i :
Model Family: Western Digital Caviar Green (AF)
Device Model: WDC WD15EARS-00Z5B1
Serial Number: WD-WMAVU3027748
LU WWN Device Id: 5 0014ee 25998d213
Firmware Version: 80.00A80
User Capacity: 1,500,301,910,016 bytes [1.50 TB]
Sector Size: 512 bytes logical/physical
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS (minor revision not indicated)
SATA Version is: SATA 2.6, 3.0 Gb/s
Local Time is: Fri Oct 18 17:47:29 2013 CDT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
ACTUALIZACIÓN:
me he ejecutado shred
en el disco, lo que ha provocado que Current_Pending_Sector vaya a cero. Sin embargo, Reallocated_Sector_Ct y Reallocated_Event_Count siguen siendo cero, y dd ahora puede escribir datos en los sectores que antes no podía. Esto me lleva a varias otras preguntas:
¿Por qué el disco no recupera las reasignaciones? Supongo que la reasignación se realizó ya que ahora puedo escribir datos directamente en el sector y no podía antes.
¿Por qué triturar causó la reasignación y no dd? ¿El hecho de que shred escribe datos aleatorios en lugar de solo ceros hace la diferencia?
fuente
Uncorrectable Sector Count
más que cero?Respuestas:
La unidad WD15EARS (y la mayoría de las unidades producidas recientemente) usa el formato avanzado , lo que significa que el tamaño real del sector físico de esta unidad es de 4 KiB, y el tamaño tradicional del sector de 512 bytes simplemente se emula. Debido a esto, si un solo sector físico de 4 KiB falla, los 8 sectores emulados de 512 bytes correspondientes se vuelven ilegibles a la vez.
(La
Sector Size: 512 bytes logical/physical
salida desmartctl
no es correcta, porque algunas unidades WD15EARS informan que el tamaño del sector físico es incorrecto ; aparentemente, su unidad tiene una versión de firmware que no funciona en ese sentido).Además, cuando se escribe un solo sector emulado de 512 bytes, la unidad de formato avanzado realmente necesita leer el sector físico completo de 4 KiB, cambiar la parte correspondiente de 512 bytes y luego escribir todo el sector físico en los medios. Si los medios son buenos, esta operación de lectura-modificación-escritura solo causa una desaceleración significativa en comparación con una unidad con sectores físicos reales de 512 bytes. Sin embargo, si el sector físico de 4 KiB es malo y no se puede leer, cualquier operación de escritura que no reescriba el sector por completo fallará. Debido a esto, no puede forzar la reasignación de sectores en tales unidades
dd
conbs=512 count=1
- debe usar al menosbs=512 count=8
y asegurarse de que el número de sector enseek=
la opción es un múltiplo de 8. (Esto supone que el puente "Compatible con Windows XP" no está instalado; de lo contrario, también se debe tener en cuenta el desplazamiento de alineación agregado por este puente).Otra razón por la que
dd
puede fallar el forzar la reasignación es que, de manera predeterminada, Linux usa un caché en la capa de bloque para acceder a los dispositivos de bloque, y esto puede causar operaciones de lectura-modificación-escritura en el software, que también fallarían cuando se encuentre un sector ilegible. Puede agregar laoflag=direct
opción para omitir esta caché para el dispositivo especificado porof=...
(también existe laiflag=direct
opción, que se aplica al dispositivo de entrada).fuente
Tuve que hacer esto recientemente y descubrí que ejecutar shred en todo el disco funcionó muy bien. Si bien la destrucción es inútil para su propósito previsto, excepto en disquetes, hace exactamente lo que se requiere para que la autocuración se ejecute en bloques defectuosos.
fuente