TrueNAS Fan Control: настройка вентиляторов, скрипты, ipmitool | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Полное руководство по настройке fan control в TrueNAS: управление вентиляторами и температурой

08 марта 2026 10 мин. чтения #fan control #ipmi #truenas #вентиляторы #настройка #сервер #скрипты #температура

Проблема и решение: зачем нужен fan control в TrueNAS

Представь, что твой TrueNAS сервер работает как промышленный пылесос — вентиляторы крутятся на максимальных оборотах постоянно. Шум мешает спать, а энергопотребление зашкаливает. При этом температура компонентов остается низкой даже под нагрузкой. Это классическая ситуация, когда управление вентиляторами (fan control) вышло из-под контроля.

В этой статье мы разберем, как взять контроль над кулерами в свои руки: от базовой настройки через IPMI до продвинутых скриптов на Python, которые реагируют на температуру дисков и CPU.

Понимание архитектуры управления вентиляторами

Прежде чем лезть в настройки, давай разберемся, как вообще работает система охлаждения в серверном оборудовании. Обычно есть три уровня контроля:

Уровень контроля Что управляет Гибкость Сложность настройки
BMC/IPMI Все вентиляторы через материнскую плату Средняя Низкая
Скрипты + IPMITOOL Группы вентиляторов по датчикам Высокая Средняя
Кастомные контроллеры Индивидуальные вентиляторы Максимальная Высокая
Важно: Большинство серверных материнских плат Supermicro, ASRock Rack, Tyan и других используют IPMI (Intelligent Platform Management Interface) для управления вентиляторами. Это наш основной инструмент.

Шаг 1: Проверка текущего состояния вентиляторов

Прежде чем что-то менять, нужно понять, что происходит сейчас. Подключись к TrueNAS по SSH и выполни:

bash
# Установка ipmitool если его нет
pkg install ipmitool

# Проверка состояния вентиляторов
ipmitool sdr type fan

# Более подробная информация
ipmitool sdr list full | grep -i fan

# Текущая скорость вентиляторов в RPM
ipmitool sdr | grep -i fan

Ты увидишь что-то вроде:

bash
FAN1             | 5800 RPM        | ok
FAN2             | 5600 RPM        | ok
FAN3             | 5400 RPM        | ok

Шаг 2: Настройка профилей вентиляторов через IPMI

Современные BMC поддерживают несколько предустановленных профилей. Давай посмотрим, какие есть варианты:

bash
# Проверка текущего режима работы вентиляторов
ipmitool raw 0x30 0x45 0x00

# Расшифровка ответа:
# 0x00 = Standard (полный контроль BMC)
# 0x01 = Full (100% скорость)
# 0x02 = Optimal (оптимальный режим)
# 0x04 = Heavy IO (режим для высокой нагрузки)

Чтобы установить оптимальный режим (обычно самый тихий):

bash
# Установка оптимального режима
ipmitool raw 0x30 0x45 0x01 0x02

# Проверяем изменение
ipmitool sdr | grep -i fan
Внимание: Команды raw могут отличаться в зависимости от производителя BMC. Для Supermicro команды обычно стандартные, но для других вендоров проверяй документацию.

Шаг 3: Ручная настройка скорости вентиляторов

Если предустановленные профили не устраивают, можно задать фиксированную скорость. Но сначала нужно понять, какие зоны контроля есть в системе:

bash
# Включение ручного режима
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%)

Чтобы вернуть автоматический контроль:

bash
ipmitool raw 0x30 0x30 0x01 0x01

Продвинутое управление: скрипт fan control на Python

Теперь перейдем к самому интересному — созданию интеллектуальной системы контроля, которая реагирует на температуру дисков и CPU. Вот пример скрипта, который я использую:

python
#!/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()

Установка и настройка скрипта

Теперь давай разберем, как правильно установить этот скрипт:

bash
# 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

Мониторинг и диагностика

После настройки важно отслеживать работу системы. Вот полезные команды для мониторинга:

bash
# Реальный мониторинг в реальном времени
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"

Создание дашборда мониторинга

Можно создать простой скрипт для вывода статуса в консоль:

bash
#!/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

Как узнать точные команды для моей материнской платы?

  1. Найди точную модель материнской платы
  2. Скачай руководство по IPMI с сайта производителя
  3. Ищи раздел "Fan Speed Control" или "Thermal Control"
  4. Для Supermicro: ipmitool raw 0x30 0x70 0x66 0x01 — стандартная команда

Заключение и лучшие практики

Управление вентиляторами в TrueNAS — это баланс между тишиной, температурой и надежностью. Вот мои рекомендации как Senior DevOps:

  • Начинай с малого: Сначала используй предустановленные профили IPMI, только потом переходи к кастомным скриптам
  • Мониторь температуру дисков: HDD — самый критичный компонент. Не допускай нагрев выше 45°C
  • Добавь гистерезис: В скриптах избегай постоянного переключения режимов при температуре на границе
  • Тестируй под нагрузкой: Запусти stress-тест CPU и проверь, как система реагирует на нагрев
  • Веди логи: Все изменения скорости должны логироваться для последующего анализа
Профессиональный совет: Настрой алерты в TrueNAS на критическую температуру. Даже с идеальным fan control нужно знать о проблемах до того, как они приведут к повреждению оборудования.

Теперь у тебя есть полный набор инструментов для контроля вентиляторов в TrueNAS. От базовых команд IPMI до продвинутого Python-скрипта — выбирай то, что подходит твоему железу и требованиям. Помни: тихий сервер — это не только комфорт, но и экономия энергии и увеличение срока службы компонентов.

Поделиться:
Сохранить гайд? В закладки браузера