UMGUM.COM (лучше) 

HDDTemp + shutdown ( Завершение работы Linux-сервера при перегреве дисковых носителей. )

10 апреля 2012  (обновлено 31 января 2015)

OS: Debian Linux Lenny/Squeeze.

Задача: своевременно отреагировать на критическую ситуацию перегрева оборудования.

Формально лето ещё не настало, а у нас уже имеются жертвы перегрева оборудования. Да, не всем в жизни можно управлять, не на всё воздействовать. Чем больше инфраструктура, тем больше в ней балласта, кантовать который нереально тяжело - порою проще закатать его поглубже и двигаться себе дальше. Вот например, как быть в том случае, если в "серверной" районного сегмента сети три года как не могут заправить кондиционер теплоносителем? Как быть, когда коммуникационно-серверный шкаф установлен в тесной угловой каморке без оконных проёмов, на южной стороне здания, через которую проходит отопительная магистраль и на каждой стене висит по гармонике батареи отопления звеньев эдак на двенадцать? Как быть, когда "куллеры" серверов надрываются непрерывно, на крышках дисковых носителей можно яйца жарить, а местные "специалисты" невозмутимо отвечают, разваливших в креслах, что работодатель не выделяет средства на проведение работ, необходимых для обеспечения требуемого температурного режима?

Будем автоматически выключать серверы по превышению установленного температурного лимита. Пусть объясняются со своим руководством сами, какого хрена сервисы постоянно недоступны. Минимум пять минут сервер останавливается, полчаса-час будет уходить на созвоны и "локализацию проблемы", минут десять сервисы будут стартовать и выходить на рабочий режим - вполне достаточно для создания небольшой волны, которая хоть чуть-чуть раскачает региональных бездельников.


Устанавливаем пакет утилиты "hddtemp" (The hddtemp program monitors and reports the temperature of PATA, SATA or SCSI hard drives by reading S.M.A.R.T.):

# aptitude install hddtemp

После загрузки дистрибутива инсталлятор спросит, стоит-ли запустить "hddtemp" в качестве непрерывно работающего сервиса. В нашем случае этого не требуется, проще отказаться:

The hddtemp program can be run as a daemon...

Should the hddtemp daemon be started at boot? No

Простой запрос с указанием целевого устройства выдаст нам небольшой отчёт, включающий адрес устройства, его название и текущую температуру, как таковую:

# hddtemp /dev/sda

/dev/sda: WDC XXXXX: 44°C

Дополним вызов парой ключей и получим вывод, более подходящий для дальнейшей обработки:

# hddtemp --unit=C --numeric /dev/sda

44

Для себя я вывожу примерно такие диапазоны работы HDD:

Рабочая температура - до 40 градусов Цельсия;
Критическая температура - выше 50 градусов Цельсия;
Неприемлемая температура - приближающаяся к 60 градусам Цельсия.

Пишем небольшой скриптик, регулярно отрабатываемый и завершающий работу системы в случае необходимости:

# mkdir -p touch /usr/local/etc/hddtemp
# touch /usr/local/etc/hddtemp/temperature_shutdown.sh
# chmod ugo+x /usr/local/etc/hddtemp/temperature_shutdown.sh

#!/bin/bash

# Получаем список идентификаторов всех интересующих нас дисковых устройств
HDDS=`ls /dev | grep '^sd[^0-9]$'`
# Задаём температурный порог, после превышения которого система должна быть остановлена
LEVEL="50"
# Определяем список получателей уведомления об остановке сервера
EMAIL="email0@example.net email1@example.net"
#
EXEC=/usr/sbin/hddtemp
DOWN=/sbin/shutdown
LOG="/var/log/hddtemp"
HOSTNAME=`cat /etc/hostname`
DATE=`date +"%Y-%m-%d %H:%M:%S"`

# Определяем функцию отправки электронного почтового сообщения
function send-report() {
  local LOCAL_REPORT=$1
  echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Warning server shutdown: ${HOSTNAME}\n${DATE}.\nServer host: ${HOSTNAME}.\n${LOCAL_REPORT}" | sendmail -F${HOSTNAME} ${EMAIL}
return ${?}
}

# Закручиваем цикл перебора идентификаторов целевых дисковых устройств
for HDD in ${HDDS}
do
  # Если идентификатор указывает на существующее блочное устройство, то продолжаем
  if [ -b /dev/${HDD} ]; then
    # Получаем чистое числовое значение температуры в градусах шкалы Цельсия
    TEMP=`${EXEC} --unit=C --numeric /dev/${HDD}`
    # Детектируем превышение установленного температурного лимита
    if [ "${TEMP}" -ge "${LEVEL}" ]; then
      # Записываем в журнал событий соответствующее уведомление
      echo "${DATE}: System going down as hot hard disk: /dev/${HDD} temperature ${TEMP} degrees Celsius crossed its limit in ${LEVEL}." >> $LOG
      # Засылаем на почту сообщение об остановке сервера
      send-report "System going down as hot hard disk: /dev/${HDD} temperature ${TEMP} degrees Celsius crossed its limit in ${LEVEL}."
      # Отдаём указание сбросить данные "дисковых кешей" на носители
      sync;sync
      # Останавливаем сервер
      ${DOWN} -h 0
    fi
  fi
done

exit 0

В таблице "crontab" описываем задание, исполняющееся каждые тридцать минут:

# cat /etc/crontab

....
*/30  *  *  *  *  root  /usr/local/etc/hddtemp/temperature_shutdown.sh &
....

Ждём писем и звонков.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )