22/09/2010 22:29:19
Сервер для домашней автоматизации на базе ОС Linux является в целом зверушкой неприхотливой, но, в то же время, достаточно важной, когда речь заходит об управлении отоплением или электричеством. Кроме того, необходимо постараться обеспечить сохранность данных, хранимых на сервере, например, в медиа-архиве, таких как личное видео или фото. В этом смысле, контроль за температурой элементов сервера является одной из приоритетных задач.
В предыдущих своих статьях я рассказывал о средствах, помогающих осуществить контроль за температурой любых объектов с помощью компонента DS18B20. Для решения этой задачи, мы обойдемся без них, так как в современных компьютерных системах все необходимые средства уже встроены. Вопрос лишь в том, как получить доступ к этим системным ресурсам и каким образом эти данные отобразить пользователю.
Когда я установил на сервер новый жесткий диск Seagate ST31500341AS объемом 1,5Тб для хранения личного фото-архива, я обнаружил, что этот диск прилично греется. Давно известно, что продолжительность жизни жестких дисков во многом зависит от температурного режима работы. Для снижения температурной нагрузки я установил на диск дешевый вентилятор Coolcox HD8015-12 за 58 руб. Вопреки моим скептическим ожиданиям это решение значительно снизило температуру жесткого диска, не увеличив при этом общий уровень шума. Осталось только наладить температурный контроль за работой жестких дисков. Для этого в Linux'е есть пакет hddtemp.
Для установки его на Debian Linux необходимо выполнить команду:
apt-get install hddtemp
Использование программы очень простое
hddtemp /dev/sda
Вывод
/dev/sda: ST31500341AS: 32°C
Но у меня два жестких диска и мне бы хотелось вывести эту информацию в Web-интерфейс Умного Дома. Была бы задача, а решение в среде Linux всегда найдется.
При установке hddtemp по умолчанию запускается tcp-сервис hddtemp, доступ к которому осуществляется через порт 7634. Таким образом информацию о температуре дисков можно получить, например, с помощью программы telnet
telnet localhost 7634
Вывод
|/dev/hda|WDC WD800JB-32JJC0|39|C||/dev/sda|ST31500341AS|32|C|
А раз так, то можно написать простенькую программу на PHP для вывода этой информации в табличном HTML виде на Web-сервер.
<?
$host="localhost";
$h=fsockopen($host, 7634);
while(!feof($h) )
$http_response.=fgets($h, 4096);
$hdd_list = explode("||", preg_replace("/^|||$/", "", $http_response));
echo "<table border=1>";
for ( $i = 0; $i < count($hdd_list); $i++ )
{
$hdd_fields = explode("|", $hdd_list[$i]);
echo "<tr>";
for ( $j = 0; $j < count($hdd_fields); $j++ )
echo "<td>$hdd_fields[$j]</td>";
echo "</tr>";
}
echo "</table>";
fclose($h);
?>
В результате получаем что-то вроде этого...

Нетрудно модифицировать скрипт для записи данных в MySQL базу с последующим построением графиков или создания контролирующих программ, уведомляющих тем или иным способом о перегреве.
Важно иметь представление о температуре жестких дисков, но не менее важно мониторить температуру других частей компьютера, к которым, прежде всего, относятся процессор и чипсет. Для этого нам потребуется пакет lm_sensors.
apt-get install lm-sensors
После установки пакета необходимо произвести поиск поддерживаемого оборудования.
sensors-detect
Для моей материнской платы P4P800 был найден чип Winbond W83627HF, модуль которого был прописан в "автозагрузку" /etc/modules
Но можно вызвать его и в ручном режиме
modprobe w83627hf
Далее нужно только выполнить команду
sensors
Вывод
w83627thf-isa-0290
Adapter: ISA adapter
VCore: +1.58 V (min = +0.00 V, max = +3.84 V)
+12V: +12.28 V (min = +9.18 V, max = +7.30 V) ALARM
+3.3V: +3.36 V (min = +1.18 V, max = +2.93 V) ALARM
+5V: +5.07 V (min = +3.41 V, max = +0.00 V) ALARM
-12V: +6.06 V (min = -14.91 V, max = -0.11 V) ALARM
V5SB: +4.97 V (min = +1.72 V, max = +0.46 V) ALARM
VBat: +3.20 V (min = +0.27 V, max = +0.19 V) ALARM
fan1: 0 RPM (min = -1 RPM, div = 128) ALARM
CPU Fan: 2789 RPM (min = -1 RPM, div = 4) ALARM
fan3: 0 RPM (min = 251 RPM, div = 128) ALARM
M/B Temp: +36.0°C (high = +81.0°C, hyst = +0.0°C) sensor = thermistor
CPU Temp: +44.0°C (high = +80.0°C, hyst = +75.0°C) sensor = diode
temp3: -48.0°C (high = +80.0°C, hyst = +75.0°C) sensor = thermistor
cpu0_vid: +1.525 V
beep_enable:enabled
Вытащить эти данные в Web-интерфейс можно аналогично предыдущему способу. А можно и гораздо проще. Например, таким образом:
<?
echo "<pre>";
passthru("sensors");
echo "</pre>";
?>
Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.
2012-02-19 22:31:18 | aurodionov
спасибо, Андрей ,заработало
2012-02-18 15:46:18 | Andrey_B
aurodionov, Добавил ссылку на архив в статье.
2012-02-17 12:26:11 | aurodionov
Andrey_B, если не затрудрит прикрепите первый .php скрипт вложением
при копировании со станицы отображает при обращении пустую страницу ,
демон работает ,на команды отвечает ,сам к сожалению не силён в php.
с уважением, aurodionov
2010-09-24 21:54:13 | Nick
Спасибо, Андрей!
С вашей подачи все получилось. После запуска hddtemp в режиме демона:
hddtemp -d -l 127.0.0.1 -p 7634 /dev/sda -s :
telnet говорит:
:/dev/sda:WDC WD10EADS-00P8B0:28:C:Connection closed by foreign host.
А дальше дело техники...
2010-09-23 23:28:03 | Andrey_B
Nick, нужно убедится, что запущен процесс hddtemp в режиме демона:
ps ax | grep hddtemp
Например, у меня этот процесс запущен так:
/usr/sbin/hddtemp -d -l 127.0.0.1 -p 7634 -s | /dev/hda /dev/sda
2010-09-23 23:11:03 | Nick
Здравствуйте!
Спасибо за статью.
Столкнулся с такой проблемой - в ответ на комманду:
telnet localhost 7634
Получаю следующее сообщение:
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
Пакет hddtemp стоит и отлично работает...
В чем может быть проблема?
PS Дистрибутив Debian Etch.