Вопрос: Как использовать hdparm для фиксации ожидающего сектора?


SMART указывает на один ожидающий сектор на hdd моего сервера. Я прочитал статьи статей, рекомендующих использовать hdparm для «легко» заставить диск переместить плохой сектор, но я не могу найти правильный способ его использования.

Некоторая информация из моего «smartctl»:

Error 95 occurred at disk power-on lifetime: 20184 hours (841 days + 0 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 d7 55 dd 02  Error: UNC at LBA = 0x02dd55d7 = 48059863

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 08 d6 55 dd e2 00  18d+05:13:42.421  READ DMA
  27 00 00 00 00 00 e0 00  18d+05:13:42.392  READ NATIVE MAX ADDRESS EXT
  ec 00 00 00 00 00 a0 02  18d+05:13:42.378  IDENTIFY DEVICE
  ef 03 46 00 00 00 a0 02  18d+05:13:42.355  SET FEATURES [Set transfer mode]
  27 00 00 00 00 00 e0 00  18d+05:13:42.327  READ NATIVE MAX ADDRESS EXT

 SMART Self-test log structure revision number 1
 Num  Test_Description    Status                  Remaining  LifeTime(hours)        LBA_of_first_error
 # 1  Extended offline    Completed: read failure       90%     20194         48059863
 # 2  Short offline       Completed without error       00%     15161         -

С этим «плохим LBA» (48059863) в руке, как мне использовать hdparm? Какой тип адреса должны иметь параметры «--read-sector» и «--write-sector»?

Если я выдаю команду hdparm --read-сектор 48095863 / dev / sda он считывает и сбрасывает данные. Если эта команда была права, я должен ожидать ошибку ввода-вывода, не так ли?

Вместо этого он удаляет данные:

$ ./hdparm --read-sector 48059863 /dev/sda

/dev/sda:
reading sector 48059863: succeeded
4b50 5d1b 7563 a932 618d 1f81 4514 2343
8a16 3342 5e36 2591 3b4e 762a 4dd7 037f
6a32 6996 816f 573f eee1 bc24 eed4 206e
(...)

5
2017-12-27 16:33


Источник


Правильное дело - отправить диск обратно своему производителю и получить гарантийную замену. - Michael Hampton♦


Ответы:


Если по какой-либо причине вы предпочитаете пытаться очистить эти поврежденные сектора, и вам не важно существующее содержимое диска, это может помочь приведенный ниже фрагмент оболочки. Я протестировал это на старом диске Seagate Barracuda, который все равно прошел свою гарантию. Это может не сработать с другими моделями или производителями дисков, но это должно привести вас к правильному пути, если вы должен скрипт что-то. Это будем уничтожить любой контент, который у вас есть на диске.

Вы можете предпочесть просто запустить badblocks, hdparm Secure Erase (SE) (https://wiki.archlinux.org/index.php/Securely_wipe_disk) или какой-либо другой инструмент, который на самом деле предназначен для этого. Или даже производитель предоставил такие инструменты, как SeaTools (есть 32-разрядная версия Linux, версия для Google).

Перед выполнением этого действия убедитесь, что данный диск полностью не используется / отключен. Кроме того, я знаю, в то время как цикл, никаких оправданий. Это взломать, вы можете сделать это лучше ...

baddrive=/dev/sdb
badsect=1
while true; do
  echo Testing from LBA $badsect
  smartctl -t select,${badsect}-max ${baddrive} 2>&1 >> /dev/null

  echo "Waiting for test to stop (each dot is 5 sec)"
  while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print substr($4,1,9)}')" != "Completed" ]; do
    echo -n .
    sleep 5
  done
  echo

  badsect=$(smartctl -l selective ${baddrive} | awk '/# 1  Selective offline   Completed: read failure/ {print $10}')
  [ $badsect = "-" ] && exit 0

  echo Attempting to fix sector $badsect on $baddrive
  hdparm --repair-sector ${badsect} --yes-i-know-what-i-am-doing $baddrive
  echo Continuning test
done

Одним из преимуществ использования метода «selftest» является то, что нагрузка обрабатывается прошивкой накопителя, поэтому ПК, к которому он подключен, не загружен, как это было бы с dd или badblocks.

ПРИМЕЧАНИЕ. Извините, я допустил ошибку. Правильное условие выглядит так:

while [ "$(smartctl -l selective ${baddrive} | awk '/^ *1/{print $4}')" = "Self_test_in_progess" ]; do

И условие выхода скрипта становится:

[ $badsect = "-" ] || [ "$badsect" = "" ] && exit 0

4
2017-10-31 13:00



Мой опыт показывает, что часто недостаточно переписывать только неисправный сектор - он все равно не сможет прочитать после этого. Вам необходимо перезаписать $count последовательных секторов от $((badsect/count*count)) где $count является степенью двух (для диска, который я сейчас восстанавливаю, count это как 16384). Причина заключается в том, что сектор неисправен, потому что жесткий диск не может найти маркер позиционирования (он же преамбула или какой-либо знак, указывающий начало данных сектора), а перезапись большого фрагмента секторов также восстанавливает все маркеры позиционирования. - ivan_pozdeev


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

Я обнаружил некоторые плохие сектора, и если я исправляю единственный, который нечитаем с помощью «hdparm --read-sector», другие «плохие» сектора внезапно перестают быть нечитаемыми с такими вещами, как dd. И, что интересно, при просмотре вывода «dmesg» всегда сообщаются только hdparm-нечитаемые.

например. У меня были сектора 36589320 до 36589327 и 36589344 до 36589351, нечитаемые с помощью dd, но только 36589326 и 36589345 были нечитабельны с hdparm --read-сектором. Затем я использовал hdparm --write-сектор для этих 2, а затем все 16 секторов были снова прочитаны.

Вот небольшая часть вывода dmesg:

[30152036.527940] end_request: I/O error, dev sda, sector 36589326
[30152077.363710] end_request: I/O error, dev sda, sector 36589345

И информация о диске:

# smartctl -i /dev/sda
...
=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA MK2002TSKB
...
Firmware Version: MT2A
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Size:      512 bytes logical/physical
...

И, по-видимому, прошивка этого диска либо неправильно записывает перераспределенные сектора, либо они действительно не перераспределены, а просто повреждены (например, неустранимая ошибка ECC, но поверхность все еще работает, как будто это было вызвано бит-гнилью, а не неисправной электроникой или плохие СМИ):

# smartctl -A /dev/sda | egrep "Reallocated|Pending|Uncorrectable"
  5 Reallocated_Sector_Ct   0x0033   100   100   050    Pre-fail  Always       -       0
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0

# smartctl -l error /dev/sda
...
SMART Error Log Version: 1
No Errors Logged

Обратите внимание, что я запустил: -read-сектор и -write-сектор. Может потребоваться чтение для правильного перераспределения сектора, а не просто записи. Если вы не читаете в первую очередь, это может не знать, что сектор плох.


3
2018-06-18 13:41



Да, ты прав. Это связано с тем, что ядро ​​читает «страницы» не секторы. Страница 4096 байтов = 8 секторов. Они также совпадают с границами (4096 байт). - dmansfield