Невозможно записать нули в поврежденные сектора / жесткий диск без учета перераспределенных секторов
У меня есть диск, который сообщает, что текущие ожидающие секторы "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
опция, которая относится к устройству ввода).
Недавно мне пришлось это сделать, и я обнаружил, что работа с клочками на всем диске работает очень хорошо. Хотя крошка бесполезна по своему прямому назначению, кроме как на дискетах, она делает только то, что требуется для самовосстановления плохих блоков.