Проблема и решение: зачем нужен fan control в TrueNAS
Представь, что твой TrueNAS сервер работает как промышленный пылесос — вентиляторы крутятся на максимальных оборотах постоянно. Шум мешает спать, а энергопотребление зашкаливает. При этом температура компонентов остается низкой даже под нагрузкой. Это классическая ситуация, когда управление вентиляторами (fan control) вышло из-под контроля.
В этой статье мы разберем, как взять контроль над кулерами в свои руки: от базовой настройки через IPMI до продвинутых скриптов на Python, которые реагируют на температуру дисков и CPU.
Понимание архитектуры управления вентиляторами
Прежде чем лезть в настройки, давай разберемся, как вообще работает система охлаждения в серверном оборудовании. Обычно есть три уровня контроля:
| Уровень контроля | Что управляет | Гибкость | Сложность настройки |
|---|---|---|---|
| BMC/IPMI | Все вентиляторы через материнскую плату | Средняя | Низкая |
| Скрипты + IPMITOOL | Группы вентиляторов по датчикам | Высокая | Средняя |
| Кастомные контроллеры | Индивидуальные вентиляторы | Максимальная | Высокая |
Шаг 1: Проверка текущего состояния вентиляторов
Прежде чем что-то менять, нужно понять, что происходит сейчас. Подключись к TrueNAS по SSH и выполни:
# Установка ipmitool если его нет
pkg install ipmitool
# Проверка состояния вентиляторов
ipmitool sdr type fan
# Более подробная информация
ipmitool sdr list full | grep -i fan
# Текущая скорость вентиляторов в RPM
ipmitool sdr | grep -i fan
Ты увидишь что-то вроде:
FAN1 | 5800 RPM | ok
FAN2 | 5600 RPM | ok
FAN3 | 5400 RPM | ok
Шаг 2: Настройка профилей вентиляторов через IPMI
Современные BMC поддерживают несколько предустановленных профилей. Давай посмотрим, какие есть варианты:
# Проверка текущего режима работы вентиляторов
ipmitool raw 0x30 0x45 0x00
# Расшифровка ответа:
# 0x00 = Standard (полный контроль BMC)
# 0x01 = Full (100% скорость)
# 0x02 = Optimal (оптимальный режим)
# 0x04 = Heavy IO (режим для высокой нагрузки)
Чтобы установить оптимальный режим (обычно самый тихий):
# Установка оптимального режима
ipmitool raw 0x30 0x45 0x01 0x02
# Проверяем изменение
ipmitool sdr | grep -i fan
Шаг 3: Ручная настройка скорости вентиляторов
Если предустановленные профили не устраивают, можно задать фиксированную скорость. Но сначала нужно понять, какие зоны контроля есть в системе:
# Включение ручного режима
ipmitool raw 0x30 0x30 0x01 0x00
# Проверка зон контроля (обычно 0x00, 0x01, 0x02...)
ipmitool raw 0x30 0x70 0x66 0x00 0x00
# Установка скорости 30% для зоны 0
ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x1E
# Где 0x1E = 30 в hex (0-64 = 0-100%)
Чтобы вернуть автоматический контроль:
ipmitool raw 0x30 0x30 0x01 0x01
Продвинутое управление: скрипт fan control на Python
Теперь перейдем к самому интересному — созданию интеллектуальной системы контроля, которая реагирует на температуру дисков и CPU. Вот пример скрипта, который я использую:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Интеллектуальный контроллер вентиляторов для TrueNAS
Реагирует на температуру HDD и CPU
"""
import subprocess
import time
import logging
from datetime import datetime
# Настройка логирования
logging.basicConfig(
filename='/var/log/fan_control.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
class FanController:
def __init__(self):
# Температурные пороги (в градусах Цельсия)
self.hdd_critical = 45 # Критическая температура HDD
self.hdd_high = 40 # Высокая температура HDD
self.hdd_medium = 35 # Средняя температура HDD
self.hdd_low = 30 # Низкая температура HDD
self.cpu_critical = 70 # Критическая температура CPU
self.cpu_high = 60 # Высокая температура CPU
# Скорости вентиляторов (в % от максимума)
self.speeds = {
'critical': 80, # Критический режим
'high': 60, # Высокая нагрузка
'medium': 40, # Средняя нагрузка
'low': 25, # Низкая нагрузка
'idle': 20 # Режим простоя
}
# Текущий режим
self.current_mode = 'idle'
def get_hdd_temperatures(self):
"""Получение температур HDD через smartctl"""
temperatures = []
try:
# Получаем список дисков
result = subprocess.run(
['smartctl', '--scan'],
capture_output=True,
text=True,
timeout=10
)
for line in result.stdout.split('\n'):
if '/dev/' in line:
device = line.split()[0]
# Получаем температуру для каждого диска
temp_result = subprocess.run(
['smartctl', '-A', device],
capture_output=True,
text=True,
timeout=5
)
for temp_line in temp_result.stdout.split('\n'):
if 'Temperature_Celsius' in temp_line or \
'Airflow_Temperature_Cel' in temp_line:
parts = temp_line.split()
if len(parts) > 9:
temp = int(parts[9])
temperatures.append(temp)
logging.info(f"Диск {device}: {temp}°C")
except Exception as e:
logging.error(f"Ошибка получения температур HDD: {e}")
return temperatures if temperatures else [30] # Дефолтное значение
def get_cpu_temperature(self):
"""Получение температуры CPU"""
try:
with open('/sys/class/thermal/thermal_zone0/temp', 'r') as f:
temp = int(f.read().strip()) / 1000.0
logging.info(f"CPU: {temp}°C")
return temp
except:
return 40.0 # Дефолтное значение
def determine_fan_speed(self, hdd_temps, cpu_temp):
"""Определение необходимой скорости вентиляторов"""
max_hdd_temp = max(hdd_temps)
# Критический режим - что-то перегревается
if max_hdd_temp >= self.hdd_critical or cpu_temp >= self.cpu_critical:
new_mode = 'critical'
# Высокая нагрузка
elif max_hdd_temp >= self.hdd_high or cpu_temp >= self.cpu_high:
new_mode = 'high'
# Средняя нагрузка
elif max_hdd_temp >= self.hdd_medium:
new_mode = 'medium'
# Низкая нагрузка
elif max_hdd_temp >= self.hdd_low:
new_mode = 'low'
# Режим простоя
else:
new_mode = 'idle'
return new_mode, self.speeds[new_mode]
def set_fan_speed(self, speed_percent):
"""Установка скорости вентиляторов через IPMI"""
try:
# Конвертируем проценты в hex (0-64 = 0-100%)
hex_speed = hex(int(speed_percent * 0.64))[2:].zfill(2)
# Устанавливаем скорость для всех зон
# Зона 0x00 обычно основная
cmd = ['ipmitool', 'raw', '0x30', '0x70', '0x66', '0x01', '0x00', f'0x{hex_speed}']
subprocess.run(cmd, check=True, timeout=5)
logging.info(f"Установлена скорость: {speed_percent}% (0x{hex_speed})")
except subprocess.CalledProcessError as e:
logging.error(f"Ошибка установки скорости: {e}")
except Exception as e:
logging.error(f"Общая ошибка: {e}")
def run(self):
"""Основной цикл работы контроллера"""
logging.info("Запуск контроллера вентиляторов")
while True:
try:
# Получаем температуры
hdd_temps = self.get_hdd_temperatures()
cpu_temp = self.get_cpu_temperature()
# Определяем необходимую скорость
new_mode, speed = self.determine_fan_speed(hdd_temps, cpu_temp)
# Меняем скорость только если режим изменился
if new_mode != self.current_mode:
self.current_mode = new_mode
self.set_fan_speed(speed)
logging.info(
f"Режим изменен: {new_mode}. "
f"Температуры: HDD max={max(hdd_temps)}°C, CPU={cpu_temp}°C"
)
# Ждем перед следующей проверкой
time.sleep(30) # Проверяем каждые 30 секунд
except KeyboardInterrupt:
logging.info("Остановка контроллера по запросу пользователя")
# Возвращаем авторежим при выходе
subprocess.run(['ipmitool', 'raw', '0x30', '0x30', '0x01', '0x01'])
break
except Exception as e:
logging.error(f"Ошибка в основном цикле: {e}")
time.sleep(60)
if __name__ == "__main__":
controller = FanController()
controller.run()
Установка и настройка скрипта
Теперь давай разберем, как правильно установить этот скрипт:
# 1. Копируем скрипт в систему
cp fan_controller.py /usr/local/bin/
chmod +x /usr/local/bin/fan_controller.py
# 2. Создаем systemd сервис для автозапуска
cat > /etc/systemd/system/fan-control.service << EOF
[Unit]
Description=TrueNAS Fan Controller
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/fan_controller.py
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target
EOF
# 3. Включаем и запускаем сервис
systemctl daemon-reload
systemctl enable fan-control
systemctl start fan-control
# 4. Проверяем статус
systemctl status fan-control
journalctl -u fan-control -f
Мониторинг и диагностика
После настройки важно отслеживать работу системы. Вот полезные команды для мониторинга:
# Реальный мониторинг в реальном времени
watch -n 2 "ipmitool sdr | grep -E '(FAN|TEMP)'"
# График температур (установи сначала gnuplot)
pkg install gnuplot
# Логи контроллера
tail -f /var/log/fan_control.log
# Проверка всех датчиков
ipmitool sdr list full | grep -v "0x00" | grep -v "0xff"
Создание дашборда мониторинга
Можно создать простой скрипт для вывода статуса в консоль:
#!/bin/bash
# status_dashboard.sh
echo "=== TrueNAS Fan Control Dashboard ==="
echo "Время: $(date)"
echo ""
echo "📊 СТАТУС ВЕНТИЛЯТОРОВ:"
echo "-----------------------"
ipmitool sdr | grep -i fan | while read line; do
echo " $line"
done
echo ""
echo "🌡️ ТЕМПЕРАТУРЫ:"
echo "----------------"
# CPU
temp=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null)
if [ ! -z "$temp" ]; then
echo " CPU: $(echo "scale=1; $temp/1000" | bc)°C"
fi
# HDD (пример для первого диска)
if [ -e /dev/ada0 ]; then
hdd_temp=$(smartctl -A /dev/ada0 | grep -i temperature | awk '{print $10}')
echo " HDD (/dev/ada0): ${hdd_temp}°C"
fi
echo ""
echo "⚙️ РЕЖИМ РАБОТЫ:"
echo "----------------"
mode=$(ipmitool raw 0x30 0x45 0x00 2>/dev/null | awk '{print $2}')
case $mode in
"00") echo " Режим: Standard (BMC control)";;
"01") echo " Режим: Full speed";;
"02") echo " Режим: Optimal";;
"04") echo " Режим: Heavy IO";;
*) echo " Режим: Unknown ($mode)";;
esac
echo ""
echo "📈 ПОСЛЕДНИЕ СОБЫТИЯ:"
echo "-------------------"
tail -5 /var/log/fan_control.log 2>/dev/null || echo " Лог файл не найден"
Часто задаваемые вопросы (FAQ)
Вентиляторы не реагируют на команды IPMI
Проверь:
- Активирован ли IPMI в BIOS (часто называется "BMC Configuration")
- Установлен ли ipmitool:
pkg install ipmitool - Доступны ли raw команды:
ipmitool mc info - Некоторые материнские платы требуют дополнительной активации
Скрипт работает, но вентиляторы не замедляются
Возможные причины:
- Неправильные зоны контроля — проверь командой
ipmitool raw 0x30 0x70 0x66 0x00 0x00 - Аппаратное ограничение — некоторые серверы имеют минимальную скорость 20-30%
- Температура все еще высокая — проверь датчики
После перезагрузки настройки сбрасываются
Решение:
- Используй systemd сервис (как в статье выше)
- Добавь команды в
/etc/rc.local - Для постоянных настроек используй IPMI фрэймворк:
ipmitool lan set 1 ipsrc static
Как узнать точные команды для моей материнской платы?
- Найди точную модель материнской платы
- Скачай руководство по IPMI с сайта производителя
- Ищи раздел "Fan Speed Control" или "Thermal Control"
- Для Supermicro:
ipmitool raw 0x30 0x70 0x66 0x01— стандартная команда
Заключение и лучшие практики
Управление вентиляторами в TrueNAS — это баланс между тишиной, температурой и надежностью. Вот мои рекомендации как Senior DevOps:
- Начинай с малого: Сначала используй предустановленные профили IPMI, только потом переходи к кастомным скриптам
- Мониторь температуру дисков: HDD — самый критичный компонент. Не допускай нагрев выше 45°C
- Добавь гистерезис: В скриптах избегай постоянного переключения режимов при температуре на границе
- Тестируй под нагрузкой: Запусти stress-тест CPU и проверь, как система реагирует на нагрев
- Веди логи: Все изменения скорости должны логироваться для последующего анализа
Теперь у тебя есть полный набор инструментов для контроля вентиляторов в TrueNAS. От базовых команд IPMI до продвинутого Python-скрипта — выбирай то, что подходит твоему железу и требованиям. Помни: тихий сервер — это не только комфорт, но и экономия энергии и увеличение срока службы компонентов.