Содержание
Перегрев диска и 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 ...