Когда в сервер устанавливаются новые диски, часто можно заметить что описания некоторых параметров 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
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