smartctl и новые диски

Когда в сервер устанавливаются новые диски, часто можно заметить что описания некоторых параметров S.M.A.R.T. регистров не соответствуют действительности либо вообще отствуют. Например так было после установки SSD Intel DC S3500 на сервер с “CentOS release 6.6 (Final)“:

170 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1


После очередного обновления сайта smartmontools сделан скрипт для автоматической настройки скрипта обновления базы. Подробнее здесь.
И если внимательно почитать заголовок выдачи утилиты с опцией -a или -i то можно заметить такю строку:

Device is:        Not in smartctl database [for details use: -P showall]

Это значит что в базе описаний дисков утилиты systemctl отсутствует необходимый. И разрабочики утилиты smartctl предусмотрели сравнительно простой способ обновления базы дисков при помощи скрипта update-smart-drivedb. Этот скрипт “полезет” на сайт S.M.A.R.T. Monitoring Tools и из вашей ветки или из trunk возьмёт последний вариант файла и проверив его на соответствие ожиданиям утилиты скопирует в вашу базу. Если диск не совсем-совсем свежий то он скорее всего будет в базе и после этого вывод утилиты будет соответствовать действительности.
Однако на “CentOS release 6.6 (Final)” я столкнулся с тем что скрипт не сработал как положено, и выдал ошибку:

# /usr/sbin/update-smart-drivedb -v
Download from branches/RELEASE_5_43_DRIVEDB
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
109   329  109   329    0     0     62      0  0:00:05  0:00:05 --:--:--  2419
/usr/share/smartmontools/drivedb.h.error: rejected by /usr/sbin/smartctl, probably no longer compatible

Я начал разбираться с самим скриптом и выяснил что файл который он стягивает имеет такое содержимое:

# cat /usr/share/smartmontools/drivedb.h.error
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://sourceforge.net/p/smartmontools/code/">here</a>.</p>
<hr>
<address>Apache/2.2.3 (CentOS) Server at smartmontools.svn.sourceforge.net Port 50043</address>
</body></html>

Как видно это содержимое html страницы с редиректом в другое место который выполнен обычной ссылкой по которой нужно перейти кликом. Очевидно хостинг sourceforge не позволяет сделать редирект директивой так чтобы curl или wget смогли перейти автоматически.

Кажется что достаточно обновить пакет smartmontools. Но под Centos 6.6 обновления небыло. Да и простое отсутствие данных о диске в базе проще решить обновлением базы чем сборкой более свежего пакета или поиска неизвестно кем собранного на просторах интернет.
В этом случае есть два способа решения проблемы:

  • стянуть файл с базой к нужной версии вручную
  • взять свежий скрипт и обновить его у себя

Для тех кто решил стянуть файл drivedb.h вручную хочу напомнить что перед тем как скопировать его на место старого его нужно будет проверить такой командой:

# smartctl -B drivedb.h -P showall >/dev/null && echo "OK" || echo "FAIL"

Для тех кто хочет изменить скрипт исходник находится по адресу:
http://sourceforge.net/p/smartmontools/code/HEAD/tree/trunk/smartmontools/update-smart-drivedb.in
Следует соблюдать меры предосторожности и проверить скрипт на отсутствие всевозможных сюрпризов. Самый простой и удобный на мой взгляд способ это сравнение текстов скачанного скрипта со скриптом который находится в вашем дистрибутиве linux. Например gui утилитой kdiff3 которая отобразит оба текста и пометит различия, что несколько удобнее обычного текстового diff. Также можно воспользоваться возможностью запустить скрипт из окружения пользователя, а не рута но файл положить в место доступное пользователю для записи.

$ ./update-smart-drivedb -v ./aa.txt
Download from branches/RELEASE_5_43_DRIVEDB
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  136k    0  136k    0     0   120k      0 --:--:--  0:00:01 --:--:--  120k
./aa.txt updated from branches/RELEASE_5_43_DRIVEDB

В новый скрипт стоит перенести значения переменных которые отвечают за версию вашего smartctl. Для этого мне вместо этого:

# Set by config.status
PACKAGE="@PACKAGE@"
VERSION="@VERSION@"
prefix="@prefix@"
exec_prefix="@exec_prefix@"
sbindir="@sbindir@"
datarootdir="@datarootdir@"
datadir="@datadir@"
drivedbdir="@drivedbdir@"

# Download tools
os_dltools="@os_dltools@"

# drivedb.h update branch
BRANCH="@DRIVEDB_BRANCH@"

потребовалось вставить это:

# Set by config.status
PACKAGE="smartmontools"
VERSION="5.43"
prefix="/usr"
exec_prefix="/usr"
sbindir="/usr/sbin"
datarootdir="${prefix}/share"
datadir="/usr/share"
drivedbdir="${datadir}/${PACKAGE}"

# Download tools
os_dltools="curl wget lynx"

# drivedb.h update branch
BRANCH="RELEASE_5_43_DRIVEDB"

А главное отличие в том как было:

SRCEXPR='http://smartmontools.svn.sourceforge.net/viewvc/smartmontools/$location/smartmontools/drivedb.h?revision=HEAD'

и как стало:

SRCEXPR='http://sourceforge.net/p/smartmontools/code/HEAD/tree/$location/smartmontools/drivedb.h?format=raw'

И теперь обновляем:

# update-smart-drivedb -v
Download from branches/RELEASE_5_43_DRIVEDB
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  136k    0  136k    0     0  23559      0 --:--:--  0:00:05 --:--:--  169k
/usr/share/smartmontools/drivedb.h updated from branches/RELEASE_5_43_DRIVEDB

И вот как результат выглядит после обновления

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       3173
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       3
170 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
171 Program_Fail_Count      0x0032   100   100   000    Old_age   Always       -       0
172 Erase_Fail_Count        0x0032   100   100   000    Old_age   Always       -       0
174 Unsafe_Shutdown_Count   0x0032   100   100   000    Old_age   Always       -       1
175 Power_Loss_Cap_Test     0x0033   100   100   010    Pre-fail  Always       -       651 (19 8989)
183 SATA_Downshift_Count    0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0033   100   100   090    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Temperature_Case        0x0022   082   072   000    Old_age   Always       -       18 (Min/Max 13/28)
192 Unsafe_Shutdown_Count   0x0032   100   100   000    Old_age   Always       -       1
194 Temperature_Internal    0x0022   100   100   000    Old_age   Always       -       25
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
199 CRC_Error_Count         0x003e   100   100   000    Old_age   Always       -       0
225 Host_Writes_32MiB       0x0032   100   100   000    Old_age   Always       -       302570
226 Workld_Media_Wear_Indic 0x0032   100   100   000    Old_age   Always       -       2252
227 Workld_Host_Reads_Perc  0x0032   100   100   000    Old_age   Always       -       51
228 Workload_Minutes        0x0032   100   100   000    Old_age   Always       -       190425
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   098   098   000    Old_age   Always       -       0
234 Thermal_Throttle        0x0032   100   100   000    Old_age   Always       -       0/0
241 Host_Writes_32MiB       0x0032   100   100   000    Old_age   Always       -       302570
242 Host_Reads_32MiB        0x0032   100   100   000    Old_age   Always       -       319767

Вот как выглядело до обновления:

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0032   100   100   000    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       3154
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       3
170 Unknown_Attribute       0x0033   100   100   010    Pre-fail  Always       -       0
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1
175 Program_Fail_Count_Chip 0x0033   100   100   010    Pre-fail  Always       -       82118705803
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0033   100   100   090    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   080   072   000    Old_age   Always       -       20 (Min/Max 13/28)
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       1
194 Temperature_Celsius     0x0022   100   100   000    Old_age   Always       -       27
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always       -       0
225 Load_Cycle_Count        0x0032   100   100   000    Old_age   Always       -       301436
226 Load-in_Time            0x0032   100   100   000    Old_age   Always       -       2252
227 Torq-amp_Count          0x0032   100   100   000    Old_age   Always       -       51
228 Power-off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       189284
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   098   098   000    Old_age   Always       -       0
234 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
241 Total_LBAs_Written      0x0032   100   100   000    Old_age   Always       -       301436
242 Total_LBAs_Read         0x0032   100   100   000    Old_age   Always       -       318063