Линуксовый градусник или измеряй температуру по модному!
В этой статье я хотел бы рассказать об утилитах, которые облегчат жизнь пользователю и админу крупного сервера на Linux. Мало кто знает
аналоги виндового HDDTemperature (эту софтину, кстати, очень любят юзать виндузятники), но это не означает что их нет ;). На самом деле, проблема перегрева девайсов намного серьезнее, чем кажется на первый взгляд. Полгода назад я лично потерял винт с ценной инфой из-за перегрева. Как оказалось, отказал кулер в блоке питания. Так вот, чтобы таких проблем было меньше, нужно установить и юзать полезный софт. Какой? Читай дальше!
HDDTemp
Ни для кого не секрет, что температура у винта определяется после обращения к SMART-датчику. Поддержка SMART появилась довольно давно, даже на 10Gb винчестерах ты ее можешь обнаружить (при загрузке компа, выдается системная инфа присутствует SMART или нет). Аналогом HDDTemperature под форточки является тулза hddtemp, которая умеет даже больше, чем измерять температуру твоего винчестера.
Итак, поехали. Грузим эту софтину с адреса http://coredump.free.fr/linux/hddtemp-0.3-beta7.tar.bz2. Затем распаковываем командой tar jxf hddtemp-0.3-beta7.tar.gz. После этого
говорим три заветных слова: ./configure, make и make install. Из депенденсов hddtemp нужен только bison, он устанавливается по дефолту на всех платформах Linux.
После установки, закинь в /etc файл данных hddtemp.db, который ты можешь скачать по адресу
http://coredump.free.fr/linux/hddtemp.db. В нем хранятся известные устройства жестких носителей.
А теперь про вкусности этой программы. Указав аргумент логического устройства (например, /dev/hda), ты получишь в ответ тип устройства и его текущую температуру. В моем случае прога показывала следующий результат:
[forbik@forbik forbik]$ hddtemp /dev/hda
/dev/hda: ST360021A: 37°C
[forbik@forbik forbik]$ id
uid=500(forbik) gid=500(forbik) группы=500(forbik)
Я не случайно набрал команду id,
исключительно для того, чтобы навести тебя на мысль. Дело в том, что обращение к SMART-датчику требует рутовых прав, поэтому для запуска проги под обычным юзером на нее необходимо поставить суид (ищи багу и пиши эксплойт для hddtemp, тогда сможешь порутать много серваков ;)). В противном случае
софтина откажется работать.
При добавлении ключика -d, программа уйдет в режим демона. По дефолту она будет следить порт 7634 на всех интерфейсах машины. Параметрами -l и -p можно задать их вручную. Вот как работает эта фича:
[forbik@forbik forbik]$ telnet localhost 7634
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
|/dev/hda|ST360021A|37|C|Connection closed by foreign host.
Таким образом, админ всегда будет знать какая температура у винта на его сервере, даже не используя ssh-доступ на него.
Украсим вывод?
Вывод hddtemp показался мне немного скучным, поэтому возникала необходимость приукрасить его ;). Через некоторое время был написан следующий скрипт:
#!/usr/bin/perl
chomp($info=`hddtemp /dev/hda|awk '{print(\$2,\$3)}'`);
$len=length($info)+16;
($model,$temp)=split(":", $info);
print "\033[01;33m"."-"x$len."\033[01;00m\n";
print "\033[01;33mHDD Temperature:\033[01;00m $model\033[01;31m$temp\033[01;00m\n";
print "\033[01;33m"."-"x$len."\033[01;00m\n";
Кратко опишу, что он делает. Первая строка кода выделяет вывод программы и фиксирует в себя только модель винта и его температуру. Затем идет
длинна украшающей полоски, а еще ниже информация разделяется на две переменные: модель и температуру.
После этого в красивых оттенках происходит вывод температуры девайса =). В цветастости вывода убедишься сам, если применишь этот скрипт на себе.
А теперь о главном. Что если твой винт перегрелся до критической температуры? Тогда сервер нужно автоматически выключить. В этом нам поможет скрипт, который мы будем запускать по крону каждые 15 мин. Точнее, это будет четвертая и пятая строки, добавочные к трем первым в скрипте.
$temp=~s/\L//g; ## Убираем нецифровые данные из температуры
if ($temp > 60) { `/sbin/poweroff` } ## Вырубаем комп, если температура слишком возросла.
После этого прописываем скрипт в crontab (crontab -e под рутом):
0,15,45 * * * /path/to/script >/dev/null 2>&1
После этого сервер будет в относительной безопасности.
HddTemp не использует модулей, поэтому может использоваться и на *BSD-системах.
lm_sensors
Следующая софтина определяет температуру материнской платы и процессора. Эти данные также немаловажно знать, потому как перегрев мамки или камня ни к чему хорошему не
приведет.
Программа лежит тут: http://www.lm-sensors.nu/archive/lm_sensors-2.8.0.tar.gz. Распаковав ее (командой tar zxf lm_sensors-2.8.0), ты будешь приятно удивлен отсутствием конфигуратора. Чтобы заинсталлить софтину достаточно набрать make. Перед тем как сделать install, запусти prog/detect/sensors-detect, которая будет спрашивать тебя, какие модули инсталлировать. Когда придет запрос на интерфейс сенсоров, выбирай вместо ISA (который по дефолту) smbus, иначе температуру тебе не покажут ;). В итоге пролистай файл /etc/sysconfig/lm_sensors, и кроме
комментариев там должно быть всего три строки, похожие на:
MODULE_0=i2c-viapro
MODULE_1=i2c-isa
MODULE_2=it87
Хотя название модулей могут быть разными.
Осталось скопировать init-файл, который находится в prog/init/lm_sensors.init (относительно установочной директории) и скомандовать make install. Затем командой:
# service lm_sensors start
и
# chkconfig –add sensors
Запусти сервис и пропиши его в автозапуск.
Далее идет то, ради чего мы устанавливали эту программу, команда sensors.
[forbik@forbik forbik]$ sensors
it87-isa-0290
Adapter: ISA adapter
Algorithm: ISA algorithm
VCore 1: +1.60 V (min = +1.53 V, max = +1.87 V)
VCore 2: +2.54 V (min = +2.25 V, max = +2.75 V)
+3.3V: +6.58 V (min = +2.96 V, max = +3.60 V) ALARM
+5V: +4.75 V (min = +4.50 V, max = +5.48 V)
+12V: +12.92 V (min = +11.36 V, max = +13.80 V)
-12V: -19.69 V (min = -15.86 V, max = -13.40 V) ALARM
-5V: -8.75 V (min = -10.13 V, max = -9.44 V) ALARM
Stdby: +3.23 V (min = +4.50 V, max = +5.48 V) ALARM
VBat: +2.03 V
fan1: 5973 RPM (min = 3000 RPM, div = 2)
fan2: 0 RPM (min = 3000 RPM, div = 2) ALARM
fan3: 0 RPM (min = 3000 RPM, div = 2) ALARM
Temp1/MB: +47°C (min = +20°C, max = +60°C)
Temp2/CPU: +46°C (min = +20°C, max = +60°C)
Temp3: +40°C (min = +20°C, max = +60°C)
Так как модули уже запущены из-под root, то сенсорам не требуются привилегированные права для запуска, что делает эту софтину удобной. Помимо мусора и кривого отображения скорости и вольтажа (обрати внимания на нулевые и отрицательные значения), прога покажет тебе вполне нормальную температуру мамки и проца, а также еще какую-то неизвестную температуру.
Кстати говоря, если нагрев девайсов ниже указанных минимальных (допустим при недавнем старте компа), то sensors скажет,
что проц у тебя охлажден до -127 градусов, либо перегрет до +128 =). Сразу ясно – бага в типах данных ;). После некоторого времени данные нормализуются.
Вот собственно и все... Теперь ты всегда будешь знать температуру своих девайсов даже сидя в
Linux, и, наконец, опровергнется мнение, что пингвин обделен хорошими и нужными софтинами =).