Нет ничего вечного - это аксиома, многократно подтверждённая и ни разу не опровергнутая.
Соответственно, наше оборудование сломается; рассмотрим способы приглядывания за аппаратным обеспечением в ожидании неминуемого сбоя и методы заблаговременного обнаружения устройств нуждающихся в замене.
Анализ технического состояния дисковых устройств будем производить с помощью утилит, обращающихся к устройствам используя технологию S.M.A.R.T (Self Monitoring Analysing and Reporting Technology).
Указанная технология позволит нам с долей вероятности не менее 50% выявить проблемы аппаратной составляющей дисковых устройств:
Проблемы блока магнитных головок;
Повреждения дисков;
Проблемы механики;
Проблемы электроники.
Повреждения дисков;
Проблемы механики;
Проблемы электроники.
Устанавливаем пакет S.M.A.R.T:
# aptitude install smartmontools
Инсталлятор потянет за собой кучку пакетов почтового сервиса для обеспечения работы сервиса smartd, который висит фоновой задачей, периодически проводит тесты оборудования и высылает на почтовый ящик администратора уведомления о состоянии. На самом деле я не планирую использовать сервис smartd, ограничившись утилитой smatrctl, но пакет идёт "как есть" и придётся смириться с волей его создателей.
По умолчанию smartd не запускается автоматически при старте системы, и это хорошо. Для разрешения запуска нужно прямо указать это в файле "/etc/default/smartmontools" опцией "start_smartd=yes", но я делать этого не буду, ограничившись использованием утилиты smartctl.
Выясняем, поддерживает ли дисковое устройство технологию S.M.A.R.T:
# smartctl -i /dev/sda
=== START OF INFORMATION SECTION ===
Device Model: ST31000528AS
Serial Number: 9VP2A1PZ
Firmware Version: CC37
User Capacity: 1,000,203,804,160 bytes
ATA Version is: 8
ATA Standard is: ATA-8-ACS revision 4
Local Time is: Wed May 12 13:05:27 2010 ALMT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
Device Model: ST31000528AS
Serial Number: 9VP2A1PZ
Firmware Version: CC37
User Capacity: 1,000,203,804,160 bytes
ATA Version is: 8
ATA Standard is: ATA-8-ACS revision 4
Local Time is: Wed May 12 13:05:27 2010 ALMT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
В случае, если S.M.A.R.T для устройства выключен - включаем его (или smartctl -s off /dev/sda - для отключения S.M.A.R.T):
# smartctl -s on /dev/sda
Полный вывод состояния устройства:
# smartctl --all /dev/sda
В полном выводе на предмет анализа состояния нас будут интересовать значения атрибутов обозначенные ключём "Pre-fail"; насколько я понимаю, это критические параметры устройства, с помощью которых можно судить о его перспективах.
У атрибутов есть значения выстроенные в колонки, которые мы будем анализировать:
RAW_VALUE - непосредственное значение атрибута текущего состояния устройства;
VALUE - "нормализованное" условное значение текущего состояния устройства (от 0 до 255);
WORST - минимальное условное значение состояния устройства, установленное производителем;
THRESH - условное значение - нет шансов на дальнейшую работу.
VALUE - "нормализованное" условное значение текущего состояния устройства (от 0 до 255);
WORST - минимальное условное значение состояния устройства, установленное производителем;
THRESH - условное значение - нет шансов на дальнейшую работу.
В случае анализа состояния температуры или скорости вращения удобно оперировать непосредственными значениями из колонки "RAW_VALUE", а вот для оценки состояния в зависимости от количества ошибок проще положиться на значения "нормализованные" производителем и их отношением к рекомендуемым значениям.
Примерный вывод:
# smartctl --all /dev/sda | grep Pre-fail
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE
....
1 Raw_Read_Error_Rate 0x000f 115 100 006 Pre-fail
3 Spin_Up_Time 0x0003 095 095 000 Pre-fail
5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail
....
10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail
....
....
1 Raw_Read_Error_Rate 0x000f 115 100 006 Pre-fail
3 Spin_Up_Time 0x0003 095 095 000 Pre-fail
5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail
....
10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail
....
Видно, что параметры атрибутов вполне укладываются в рамки допустимых.
Для примера, напишем скрипт, который будет с определённой периодичностью проверять состояние S.M.A.R.T всех имеющихся дисков SATA по списку параметров контролируемых атрибутов и сигнализировать отправлением письма на электронный почтовый ящик об обнаруженных проблемах.
Для простоты, обнаружение первой же неисправности примем за повод поднять панику - сразу же будем отсылать письмо.
# mkdir -p /etc/custom/hdd/smart
# touch /etc/custom/hdd/smart/check-smart.sh
# chmod ugo+x /etc/custom/hdd/smart/check-smart.sh
# touch /etc/custom/hdd/smart/check-smart.sh
# chmod ugo+x /etc/custom/hdd/smart/check-smart.sh
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
OBJECTS=`ls /dev | grep -i "^sd[a-z]$"`
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
# Перебираем в цикле все обнаруженные дисковые устройства по наименованию
for OBJECT in ${OBJECTS}; do
HEALTH=""
ATTRIBUTES=""
PROBLEM=""
# Проводим общий тест средствами S.M.A.R.T
HEALTH=`smartctl --health /dev/$OBJECT | grep PASSED`
if [ "$HEALTH" != "" ]
then
# Получаем таблицу атрибутов S.M.A.R.T поддерживаемых устройством
ATTRIBUTES=`smartctl --attributes /dev/$OBJECT | grep Pre-fail`
# Выбираем для анализа четыре атрибута, обозначенные как критичные
RRER=`echo $ATTRIBUTES | awk -F Raw_Read_Error_Rate '{print $2}' | awk '{result=$2-$3; print (result)}'`
SUT=`echo $ATTRIBUTES | awk -F Spin_Up_Time '{print $2}' | awk '{result=$2-$3; print (result)}'`
RSC=`echo $ATTRIBUTES | awk -F Reallocated_Sector_Ct '{print $2}' | awk '{result=$2-$3; print (result)}'`
SRC=`echo $ATTRIBUTES | awk -F Spin_Retry_Count '{print $2}' | awk '{result=$2-$3; print (result)}'`
# Проверяем, не выходят ли значения за пределы рекомендованных
if [ $RRER -lt 0 ] || [ $SUT -lt 0 ] || [ $RSC -lt 0 ] || [ $SRC -lt 0 ]
then
PROBLEM="wrong-attributes-test"
fi
else
PROBLEM="wrong-health-test"
fi
# Отрабатываем сообщения о найденных проблемах
if [ "$PROBLEM" = "wrong-health-test" ] || [ "$PROBLEM" = "wrong-attributes-test" ]
then
# Извлекаем серийный номер тестируемого устройства
SERIAL=`smartctl --info /dev/$OBJECT | grep -i "Serial Number" | awk '{print $3}'`
# Посылаем письмо с уведомлением о проблеме на электронный почтовый ящик
echo -e "Subject: Warning S.M.A.R.T: $HOSTNAME:/dev/$OBJECT\n$DATE. Host: $HOSTNAME. Device: /dev/$OBJECT. SN: $SERIAL. Have problem with checking S.M.A.R.T: $PROBLEM" | sendmail -F$HOSTNAME $EMAIL
fi
done
exit 0
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
HOSTNAME=`cat /etc/hostname`
OBJECTS=`ls /dev | grep -i "^sd[a-z]$"`
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL=`cat /etc/custom/hdd/email`
# Перебираем в цикле все обнаруженные дисковые устройства по наименованию
for OBJECT in ${OBJECTS}; do
HEALTH=""
ATTRIBUTES=""
PROBLEM=""
# Проводим общий тест средствами S.M.A.R.T
HEALTH=`smartctl --health /dev/$OBJECT | grep PASSED`
if [ "$HEALTH" != "" ]
then
# Получаем таблицу атрибутов S.M.A.R.T поддерживаемых устройством
ATTRIBUTES=`smartctl --attributes /dev/$OBJECT | grep Pre-fail`
# Выбираем для анализа четыре атрибута, обозначенные как критичные
RRER=`echo $ATTRIBUTES | awk -F Raw_Read_Error_Rate '{print $2}' | awk '{result=$2-$3; print (result)}'`
SUT=`echo $ATTRIBUTES | awk -F Spin_Up_Time '{print $2}' | awk '{result=$2-$3; print (result)}'`
RSC=`echo $ATTRIBUTES | awk -F Reallocated_Sector_Ct '{print $2}' | awk '{result=$2-$3; print (result)}'`
SRC=`echo $ATTRIBUTES | awk -F Spin_Retry_Count '{print $2}' | awk '{result=$2-$3; print (result)}'`
# Проверяем, не выходят ли значения за пределы рекомендованных
if [ $RRER -lt 0 ] || [ $SUT -lt 0 ] || [ $RSC -lt 0 ] || [ $SRC -lt 0 ]
then
PROBLEM="wrong-attributes-test"
fi
else
PROBLEM="wrong-health-test"
fi
# Отрабатываем сообщения о найденных проблемах
if [ "$PROBLEM" = "wrong-health-test" ] || [ "$PROBLEM" = "wrong-attributes-test" ]
then
# Извлекаем серийный номер тестируемого устройства
SERIAL=`smartctl --info /dev/$OBJECT | grep -i "Serial Number" | awk '{print $3}'`
# Посылаем письмо с уведомлением о проблеме на электронный почтовый ящик
echo -e "Subject: Warning S.M.A.R.T: $HOSTNAME:/dev/$OBJECT\n$DATE. Host: $HOSTNAME. Device: /dev/$OBJECT. SN: $SERIAL. Have problem with checking S.M.A.R.T: $PROBLEM" | sendmail -F$HOSTNAME $EMAIL
fi
done
exit 0
Периодический запуск скрипта реализуем с помощью утилиты cron.
Думаю, что промежуток между запусками в пять часов будет оптимальным; достаточно часто и, с учётом того, что число нечётно по отношению к количеству часов в сутках, скрипт будет отрабатывать по скользящему графику.
# cat /etc/crontab
....
0 */5 * * * root /etc/custom/hdd/smart/check-smart.sh &
....
0 */5 * * * root /etc/custom/hdd/smart/check-smart.sh &
....
Приведённый выше скрипт тестирования не претендует на звание рабочего, скорее - это демонстрация. Технология S.M.A.R.T имеет весьма богатые возможности как для прямого интерактивного тестирования оборудования, так и для изменения параметров до удобных нам.
С помощью анализа состояния параметров списка атрибутов можно многое узнать о дисковых устройствах; для примера, привожу расшифровку часто применяемых атрибутов и их значений:
Критичные атрибуты:
Raw_Read_Error_Rate - частота ошибок при чтении данных с дискового устройства, происхождение которых обусловлено аппаратной частью устройства. Низкое нормализованное значение параметра указывает на неисправность поверхности пластин дискового пакета;
Spin_Up_Time - время раскрутки пакета дискового устройства из состояния покоя до рабочей скорости. При расчёте нормализованного значения (Value) практическое время сравнивается с некоторой эталонной величиной, установленной производителем. Не ухудшающееся не максимальное значение при Spin_Up_Retry_Count_Value = max (Raw равном 0) не говорит ни о чем плохом. Отличие времени от эталонного может быть вызвано рядом причин, например, недостаточный уровень напряжения блока питания;
Spin_Up_Retry_Count - число повторных попыток раскрутки дискового устройства до рабочей скорости, в случае если первая попытка была неудачной. Ненулевое значение Raw (соответственно не максимальное Value) свидетельствует о проблемах в механической части устройства;
Seek_Error_Rate - частота ошибок при позиционировании блока головок. Высокое значение Raw свидетельствует о наличии проблем, которыми могут являться повреждение серво-меток, чрезмерное термическое расширение дисковых пластин, механические проблемы в блоке позиционирования и другое. Постоянное высокое значение Value не говорит ни о чем плохом;
Reallocated_Sector_Count - число операций переназначения секторов. S.M.A.R.T в современных дисковых устройствах способен произвести анализ сектора на стабильность работы "на лету" и в случае признания его сбойным, произвести его переназначение.
Spin_Up_Time - время раскрутки пакета дискового устройства из состояния покоя до рабочей скорости. При расчёте нормализованного значения (Value) практическое время сравнивается с некоторой эталонной величиной, установленной производителем. Не ухудшающееся не максимальное значение при Spin_Up_Retry_Count_Value = max (Raw равном 0) не говорит ни о чем плохом. Отличие времени от эталонного может быть вызвано рядом причин, например, недостаточный уровень напряжения блока питания;
Spin_Up_Retry_Count - число повторных попыток раскрутки дискового устройства до рабочей скорости, в случае если первая попытка была неудачной. Ненулевое значение Raw (соответственно не максимальное Value) свидетельствует о проблемах в механической части устройства;
Seek_Error_Rate - частота ошибок при позиционировании блока головок. Высокое значение Raw свидетельствует о наличии проблем, которыми могут являться повреждение серво-меток, чрезмерное термическое расширение дисковых пластин, механические проблемы в блоке позиционирования и другое. Постоянное высокое значение Value не говорит ни о чем плохом;
Reallocated_Sector_Count - число операций переназначения секторов. S.M.A.R.T в современных дисковых устройствах способен произвести анализ сектора на стабильность работы "на лету" и в случае признания его сбойным, произвести его переназначение.
Некритичные атрибуты:
Start_Stop_Count - полное число запусков/остановок шпинделя. Гарантировано мотор дискового устройства способен перенести лишь определённое число включений/выключений. Это значение выбирается в качестве Treshold. Первые модели дисков со скоростью вращения 7200 оборотов/мин имели ненадёжный двигатель, могли перенести лишь небольшое их число и быстро выходили из строя;
Power_On_Hours - число часов проведённых дисковым устройством во включённом состоянии. В качестве порогового значения для него выбирается паспортное время наработки на отказ (MTBF). Обычно величина MTBF огромна, и маловероятно, что этот параметр достигнет критического порога. Но даже в этом случае выход из строя устройства совершенно не обязателен;
Drive_Power_Cycle_Count - количество полных циклов включения-выключения дискового устройства. По этому и предыдущему атрибуту можно оценить, например, сколько использовалось устройство до покупки;
Temperatue - показания встроенного температурного датчика. Температура имеет огромное влияние на срок службы дискового устройства (даже если она находится в допустимых пределах). Вернее имеет влияние не на срок службы устройства, а на частоту возникновения некоторых типов ошибок, которые влияют на срок службы;
Current_Pending_Sector_Count - число секторов, являющихся кандидатами на замену. Они не были ещё определены как плохие, но считывание их отличается от чтения стабильного сектора, так называемые подозрительные или нестабильные сектора;
Uncorrectable_Sector_Count - число ошибок при обращении к сектору, которые не были скорректированы. Возможными причинами возникновения могут быть сбои механики дискового устройства или порча поверхности дисковых пластин;
UDMA_CRC_Error_Rate - число ошибок, возникающих при передаче данных по внешнему интерфейсу. Могут быть вызваны некачественными кабелями, нештатными режимами работы;
Write_Error_Rate - показывает частоту ошибок происходящих при записи на дисковое устройство. Может служить показателем качества поверхности и механики устройства;
Seek_Time_Perfomance - время в миллисекундах, которое требуется считывающей головке для позиционирования. Низкое нормализованное значение параметра может означать дефект механики.
Power_On_Hours - число часов проведённых дисковым устройством во включённом состоянии. В качестве порогового значения для него выбирается паспортное время наработки на отказ (MTBF). Обычно величина MTBF огромна, и маловероятно, что этот параметр достигнет критического порога. Но даже в этом случае выход из строя устройства совершенно не обязателен;
Drive_Power_Cycle_Count - количество полных циклов включения-выключения дискового устройства. По этому и предыдущему атрибуту можно оценить, например, сколько использовалось устройство до покупки;
Temperatue - показания встроенного температурного датчика. Температура имеет огромное влияние на срок службы дискового устройства (даже если она находится в допустимых пределах). Вернее имеет влияние не на срок службы устройства, а на частоту возникновения некоторых типов ошибок, которые влияют на срок службы;
Current_Pending_Sector_Count - число секторов, являющихся кандидатами на замену. Они не были ещё определены как плохие, но считывание их отличается от чтения стабильного сектора, так называемые подозрительные или нестабильные сектора;
Uncorrectable_Sector_Count - число ошибок при обращении к сектору, которые не были скорректированы. Возможными причинами возникновения могут быть сбои механики дискового устройства или порча поверхности дисковых пластин;
UDMA_CRC_Error_Rate - число ошибок, возникающих при передаче данных по внешнему интерфейсу. Могут быть вызваны некачественными кабелями, нештатными режимами работы;
Write_Error_Rate - показывает частоту ошибок происходящих при записи на дисковое устройство. Может служить показателем качества поверхности и механики устройства;
Seek_Time_Perfomance - время в миллисекундах, которое требуется считывающей головке для позиционирования. Низкое нормализованное значение параметра может означать дефект механики.
Переход к настройке прослойки абстракции в области именования устройств файловой системы.