Невозможно записать нули в поврежденные сектора / жесткий диск без учета перераспределенных секторов

У меня есть диск, который сообщает, что текущие ожидающие секторы "45". Я использовал badblocks для идентификации секторов и пытался записать в них нули с помощью dd.

Из того, что я понимаю, когда я пытаюсь записать данные непосредственно в поврежденные сектора, это должно вызвать перераспределение, уменьшая текущие ожидающие сектора на один и увеличивая количество перераспределенных секторов.

Однако на этом диске необработанные значения Reallocated_Sector_Ct и Reallocated_Event_Count равны 0, и dd завершается ошибкой ввода-вывода, когда я пытаюсь записать нули в поврежденные сектора. Дд работает нормально, однако, когда я пишу в хороший сектор.

# dd if=/dev/zero of=/dev/sdb bs=512 count=1 seek=217152
dd: error writing ‘/dev/sdb’: Input/output error

Означает ли это, что на моем диске нет резервных секторов для перераспределения? Мой привод просто ужасный человек? (На самом деле диск не мой, я помогаю другу. Возможно, они только что получили дешевый диск или что-то в этом роде.)

В случае, если это уместно, вот вывод 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

ОБНОВИТЬ:
Я бегал shred на диске, из-за которого Current_Pending_Sector обнулялся. Однако Reallocated_Sector_Ct и Reallocated_Event_Count по-прежнему равны нулю, и теперь dd может записывать данные в сектора, которые ранее были недоступны. Это приводит меня к нескольким другим вопросам:

  • Почему перераспределения не записываются диском? Я предполагаю, что перераспределение произошло, поскольку теперь я могу записывать данные непосредственно в сектор, а раньше не мог.

  • Почему шред вызвал перераспределение, а не дд? Имеет ли значение тот факт, что shred записывает случайные данные, а не просто нули?

2 ответа

Решение

Диск WD15EARS (и большинство других недавно выпущенных дисков) использует расширенный формат, что означает, что реальный физический размер сектора этого диска составляет 4 КБ, а традиционный размер сектора 512 байт только эмулируется. Из-за этого, если один физический сектор размером 4 Кбайт выходит из строя, все 8 соответствующих эмулированных 512-байтовых секторов сразу становятся нечитаемыми.

(The Sector Size: 512 bytes logical/physical вывод из smartctl неверно, потому что некоторые диски WD15EARS сообщают о неправильном размере физического сектора - очевидно, на вашем диске установлена ​​версия микропрограммы, которая в этом отношении повреждена.)

Более того, когда записывается один эмулированный 512-байтовый сектор, накопителю расширенного формата фактически необходимо прочитать весь физический сектор размером 4 КБ, изменить соответствующую его 512-байтовую часть, а затем записать весь физический сектор на носитель. Если носитель исправен, эта операция чтения-изменения-записи просто вызывает значительное замедление по сравнению с диском с реальными 512-байтовыми физическими секторами. Однако, если физический сектор 4 КиБ неисправен и не может быть прочитан, любая операция записи, которая не переписывает сектор полностью, завершится неудачей. Из-за этого вы не можете принудительно перераспределить сектор на таких дисках, используя dd с bs=512 count=1 - вы должны использовать хотя бы bs=512 count=8 и убедитесь, что номер сектора в seek= параметр, кратный 8. (Предполагается, что перемычка "Windows XP Compatible" не установлена, в противном случае необходимо также учитывать смещение выравнивания, добавленное этой перемычкой.)

Еще одна причина, почему вынуждает перераспределение с dd может произойти сбой из-за того, что по умолчанию Linux использует кэш на уровне блоков для доступа к блочным устройствам, и это может привести к операциям чтения-изменения-записи в программном обеспечении, которые также могут завершиться ошибкой при обнаружении нечитаемого сектора. Вы можете добавить oflag=direct возможность обойти этот кеш для устройства, указанного of=... (есть также iflag=direct опция, которая относится к устройству ввода).

Недавно мне пришлось это сделать, и я обнаружил, что работа с клочками на всем диске работает очень хорошо. Хотя крошка бесполезна по своему прямому назначению, кроме как на дискетах, она делает только то, что требуется для самовосстановления плохих блоков.

Другие вопросы по тегам