Инструменты пользователя

Инструменты сайта


blog:2020:0813_smart_overheat

Перегрев диска и S.M.A.R.T.

Во всех современных жёстких дисках есть система наблюдения за параметрами здоровья - S.M.A.R.T. Эту технологию используют для мониторинга состояния дисков и предсказания их поломки. В некоторых моделях дисков из-за логических ошибок в прошивке бывают ложные срабатывания тревоги. В других случаях информации о температуре бывает слишком много. Разбираемся как избавиться от неудобств в мониторинге дисков через S.M.A.R.T.

Введение в S.M.A.R.T.

Стандартная программа для наблюдения за S.M.A.R.T. 1) в Linux - это smartctl из набора утилит smartmontools 2). Обычно вывод утилиты для нормального жёсткого диска выглядит так (сокращён):

root@gw:~# smartctl -A /dev/sdb
=== START OF READ SMART DATA SECTION ===
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       4
  5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   082   082   000    Old_age   Always       -       13472
193 Load_Cycle_Count        0x0032   200   200   000    Old_age   Always       -       221
194 Temperature_Celsius     0x0022   103   093   000    Old_age   Always       -       40
196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
...

Программа выводит список параметров (атрибутов), у каждого атрибута выводится сырое значение RAW value, нормализованное значение Value и установленная граница Threshold (порог). Если значение некоего наблюдаемого параметра выйдет за допустимую границу, то сработает предупреждение от программы smartctl о возможно приближающемся выходе из строя диска.

Дело Seagate

Список атрибутов за которыми наблюдает система S.M.A.R.T. и допустимые границы их значений отличаются у разных производителей. На некоторых дисках Seagate есть атрибут максимальной температуры №190 Airflow_Temperature_Cel. Этот атрибут отображает значение внешней температуры зафиксированное датчиком на плате диска. S.M.A.R.T. хранит максимальное и минимальное значение этого атрибута.

Беда в том, что программисты Seagate установили в прошивках к своим жёстким дискам значение порога Threshold для этого атрибута. Обычно порог устанавливают для Prefail атрибутов, увеличение значения в которых фатальны (например, Reallocated_Sector_Ct, Spin_Retry_Count и т.д.). Или для атрибутов, неминуемо увеличивающихся со временем и однозначно указывающих на «старение» диска (например, Start_Stop_Count, Power_Cycle_Count и т.д.).

А когда установлен порог для такого параметра, как температура, то даже однажды нагревшийся диск, породит в S.M.A.R.T. запись в журнале и программа smartctl начнёт всегда выдавать предупреждение при проверке этого диска. Программисты Seagate, видимо, просто погорячились 3). Возможно, мотивация разработчиков из Seagate была вполне правильной, ведь перегрев ведёт к ускоренному выходу из строя электроники, хотя именно для жёстких дисков не всё так однозначно.

Проявление проблемы

Как же проявляет себя эта ошибка в прошивке дисков Seagate? Посмотрим на вывод программы smartctl для одного из таких дисков:

root@gw:~# smartctl -A /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   117   099   006    Pre-fail  Always       -       123328160
  3 Spin_Up_Time            0x0003   100   100   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       958
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       475664707
  9 Power_On_Hours          0x0032   030   030   000    Old_age   Always       -       61421
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       115
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   087   087   000    Old_age   Always       -       13
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0 0 1
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   064   044   045    Old_age   Always   In_the_past 36 (Min/Max 34/41 #50)
...

Видно, что в столбце When_Failed у атрибута №190 состояние In_the_past. Текущая температура 36°C 4), но однажды температура поднималась до 56°C 5). Что выше порогового значения в 55°C 6). Краткий вывод о суммарном здоровье диска:

root@gw:~# smartctl -H /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Please note the following marginal Attributes:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
190 Airflow_Temperature_Cel 0x0022   064   044   045    Old_age   Always   In_the_past 36 (Min/Max 34/41 #50)

Эта ошибка приводит к тому, что программы мониторинга, использующие вывод smartctl (Nagios, Icinga, Zabbix) начинают бить тревогу, хотя этому диску ничего не угрожает и перегрева на данный момент нет (был когда-то однажды в прошлом).

Решение проблемы

Первый способ, который приходит на ум: обновить прошивку контроллера диска. Не для всех моделей выпускают обновлённую прошивку, но некоторым везёт 7). Также, не факт, что в новой прошивке исправят этот недочёт. И, конечно, есть вероятность «окирпичить» диск в процессе прошивки.

Второй способ менее инвазивный и более гибкий: можно исключить пороговые значения для атрибута 190 в программе smartctl и использовать только RAW value. Для этого нужно использовать параметр -v 190,raw48:v 8):

root@gw:~# smartctl -A -v 190,raw48:v /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   117   099   006    Pre-fail  Always       -       123408784
  3 Spin_Up_Time            0x0003   100   100   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       958
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       475681597
  9 Power_On_Hours          0x0032   030   030   000    Old_age   Always       -       61422
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   020    Old_age   Always       -       115
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   087   087   000    Old_age   Always       -       13
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       1
189 High_Fly_Writes         0x003a   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   ---   ---   ---    Old_age   Always       -       64
...

Теперь пороговые значения игнорируются, значение Value переехало в RAW_Value. И в кратком выводе тревога пропала тоже:

root@gw:~# smartctl -H -v 190,raw48:v /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Чтобы использовать этот «хак» при каждом вызове smartctl, но только для нужных дисков, надо создать файл /etc/smart_drivedb.h и добавить туда шаблон модели диска 9). Например, для моих дисков файл имеет такой вид:

smart_drivedb.h
/*
const drive_settings builtin_knowndrives[] = {
 */
  { "Seagate Barracuda 7200.14 (AF)",
    "ST250DM000-1BD141",
    "", "",
    "-v 190,raw48:v" // Airflow_Temperature_Cel
  },
  { "Seagate Constellation ES (SATA)",
    "ST32000644NS",
    "", "",
    "-v 190,raw48:v" // Airflow_Temperature_Cel
  },
/*
}; // builtin_knowndrives[]
 */

Температура и smartd

Также для мониторинга за состоянием здоровья жёстких дисков используется сервис smartd из набороа утилит smartmontools. Чтобы сервис сообщал только о действительно важных изменениях в S.M.A.R.T., а не о каждом изменении температуры на 1 градус, изменения показателей температуры можно игнорировать. Для этого нужно использовать параметр -I ###. Он указывает smartd игнорировать изменения значений атрибута с номером ###.

Чтобы всё-таки получать оповещения, но при сильных изменениях температуры (например, на 10 и более градусов), нужно использовать параметр -W 10, . Параметры прописываются в файле /etc/smartd.conf:

smartd.conf
...
DEVICESCAN -I 9 -I 190 -I 194 -I 231 -W 10 -d removable -n standby -m robot@kasatkin.org -M exec /usr/share/smartmontools/smartd-runner
...
3)
Любое предупреждение от S.M.A.R.T. - это, возможно, близкая поломка диска. Не удивительно, что к продавцам и производителю посыпались жалобы от владельцев дисков Seagate. Менеджеры Seagate не нашли ничего лучше, как обратиться к разработчикам smartmontools с просьбой убрать предупреждение в программе smartctl. На что авторы smartctl резонно возразили: вы идиоты This is not a smartctl bug. Исправлять надо прошивку, а не симптомы.
4)
RAW_Value
5)
100 - 044 = 56°C
6)
100 - 045 = 55°C
9)
см. опцию -B в man smartctl
blog/2020/0813_smart_overheat.txt · Последнее изменение: 2022-02-19 18:16 — 127.0.0.1