Встроенный контроллер управления сервера сам крутит вентиляторами по своим правилам, и эти правила далеко не всегда разумны: простаивающая машина может выть на полных оборотах из-за одного непонравившегося датчика. Утилита ipmitool позволяет заглянуть в BMC, прочитать обороты и температуры, переключить режим охлаждения и задать фиксированную скорость вентиляторов. Ниже разобраны рабочие команды для Supermicro и Dell, скрипт регулировки по температуре и разумные границы снижения шума.

Модули ядра, утилита ipmitool и доступ к BMC

BMC это отдельный микрокомпьютер на материнской плате со своей прошивкой, памятью и сетевым портом: у Supermicro роль контроллера играют чипы Aspeed семейства AST2500 и AST2600, у Dell это интерфейс iDRAC, у HPE он называется iLO. Контроллер живёт своей жизнью даже при выключенном сервере, пока подано питание стойки, и именно он принимает решения об оборотах вентиляторов.

Работа начинается с доступа. Локально BMC общается с системой через интерфейс IPMI, для которого нужны модули ядра ipmi_msghandler, ipmi_si и ipmi_devintf, создающий устройство /dev/ipmi0:

sudo apt install ipmitool
sudo modprobe ipmi_devintf ipmi_si
ls -l /dev/ipmi0

В Debian и Ubuntu модули загружаются сами после установки пакета, в RHEL-семействе его ставят через dnf install ipmitool. Если устройства /dev/ipmi0 нет, модули не загрузились или сервер не предоставляет локальный интерфейс, и остаётся сетевой путь через порт BMC. Для удалённой работы используется транспорт lanplus с учётной записью контроллера:

ipmitool -I lanplus -H bmc.example.com -U admin -P pass mc info

Команда mc info печатает версию прошивки и состояние устройства, а ipmitool lan print 1 показывает сетевые настройки канала управления. Учётные данные к BMC стоит хранить отдельно от системных, а сетевой доступ держать в сегменте управления: это тот же интерфейс, который даёт консоль, питание и полный контроль над сервером. Альтернативный набор утилит freeipmi с командами ipmi-sensors и ipmi-raw решает те же задачи, но ipmitool встречается чаще и команда к команде совпадает у обоих наборов.

Чтение оборотов и температур командами sdr и sensor

Каждый вентилятор и датчик температуры виден в сервере как запись в хранилище датчиков SDR. Список вентиляторов с оборотами:

ipmitool sdr type fan

Строка вывода устроена одинаково везде: имя датчика, идентификатор сущности, статус, значение и единица измерения. Статусы расшифровываются как ok для нормы, ns для состояния, которое не проверяется, cr при нарушении критического порога и nr при выходе за аварийную границу. Точное значение конкретного датчика удобно читать по имени:

ipmitool sensor reading "CPU Temp"

Полный список с порогами даёт ipmitool sensor list: там же видны нижние и верхние границы каждого датчика, на которые BMC опирается при решениях. Температуры процессора, чипсета и дисков читаются командой ipmitool sdr type temp, а журнал событий, куда попадают все тревоги, открывается через ipmitool sel list. Хранилище SDR прошивается производителем и переживает перезагрузки, поэтому показания одинаковы при каждом чтении. Единицы измерения различаются между платформами: Dell показывает обороты в минутах, часть плат Supermicro печатает проценты заполнения, и это стоит учесть при написании скриптов мониторинга.

Вид из операционной системы и вид из BMC не совпадают полностью: утилита lm-sensors показывает то, что видит ядро через драйверы, а SDR содержит всё, что контроллер измерил сам, включая датчики питания и входов прошивки. Для управления вентиляторами верен второй источник, и именно его значения стоит записать в простое и под нагрузкой, прежде чем что-то менять: без этой базы сложно выбрать скорость, которая одновременно тиха и безопасна.

Режимы вентиляторов Supermicro через raw-команду 0x30 0x45

На платах Supermicro поколений X9, X10 и X11 режим охлаждения переключается одной raw-командой, и она не менялась годами:

ipmitool raw 0x30 0x45 0x00
ipmitool raw 0x30 0x45 0x01
ipmitool raw 0x30 0x45 0x02
ipmitool raw 0x30 0x45 0x03

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

ipmitool raw 0x30 0x70 0x66 0x01 0x00 0x30
ipmitool raw 0x30 0x70 0x66 0x01 0x01 0x28

Байт после 0x66 0x01 это номер зоны: ноль отвечает за процессоры, единица за периферию, диски и слоты PCIe. Последний байт задаёт заполнение сигнала от 0x00 до 0xFF, где 0xFF максимум. Точные проценты на разных платах трактуются слегка по-разному, поэтому скорость подбирают опытным путём: дали значение, посмотрели обороты в sdr type fan, послушали корпус. На платформе X12 и новее формат команды изменился, и перед применением старых рецептов стоит свериться с документацией конкретной ревизии платы.

Настройка zone живёт в памяти контроллера и у части поколений сбрасывается после холодного перезапуска BMC или длительного отключения питания, поэтому полагаться на разовое применение не стоит, и к этому вопросу скрипт из следующего раздела относится спокойнее всего.

Статическая скорость вентиляторов на Dell iDRAC

У контроллеров Dell PowerEdge с iDRAC7, iDRAC8 и iDRAC9 схема другая. Сначала автоматическое управление отключают:

ipmitool -I lanplus -H bmc.example.com -U admin -P pass raw 0x30 0x30 0x01 0x00

Затем задают фиксированную скорость для всех зон сразу, например двадцать процентов:

ipmitool -I lanplus -H bmc.example.com -U admin -P pass raw 0x30 0x30 0x02 0xff 0x14

Здесь 0xff означает все зоны, а последний байт это процент в шестнадцатеричном виде: 0x14 даёт двадцать, 0x28 сорок, максимум соответствует 0x64. Вместо 0xff можно адресовать зоны по отдельности значениями 0x00 и 0x01. Вернуть автоматическое управление обратно можно командой raw 0x30 0x30 0x01 0x01. Свежие версии iDRAC9 добавляют и настройку Fan Speed Offset прямо в веб-интерфейсе, где смещение задаётся в процентах относительно кривой прошивки, и это более мягкий путь, чем полное отключение автоматики.

Отдельная известная особенность Dell тринадцатого поколения и новее: сервер резко поднимает обороты при обнаружении сторонних карт PCIe, считая, что airflow для неизвестного устройства недостаточен. Реакцию отключают отдельной командой:

ipmitool raw 0x30 0xce 0x00 0x16 0x05 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x00

Последний байт здесь 0x00 выключает реакцию, а 0x01 возвращает её. Raw-команды у разных поколений прошивки иногда различаются, поэтому после обновления iDRAC стоит проверять, что старые команды всё ещё работают, и помнить, что отключение этой реакции перекладывает ответственность за охлаждение карты на администратора.

Скрипт регулировки по температуре и запуск через systemd

Фиксированная скорость хороша для стабильной нагрузки, но для переменной лучше небольшая автоматика поверх ручного режима. Минимальный скрипт читает температуру процессора и меняет заполнение зоны с гистерезисом:

#!/bin/bash
while true; do
  temp=$(sensors | awk '/Package id 0/ {print int($4)}')
  if [ "$temp" -ge 75 ]; then duty=0x50
  elif [ "$temp" -ge 60 ]; then duty=0x30
  else duty=0x1e
  fi
  ipmitool raw 0x30 0x70 0x66 0x01 0x00 $duty
  sleep 30
done

Температура берётся из lm-sensors, пороги в примере это 75 и 60 градусов, а шаг опроса в тридцать секунд оставляет запас на всплески нагрузки. Две ступени вместо плавной кривой выбраны намеренно: чем меньше переключений, тем меньше вентиляторы гудят рывками, и тем проще предсказать поведение системы. Скрипт сохраняют как /usr/local/bin/fan.sh, дают право выполнения командой chmod +x и запускают юнитом systemd:

[Unit]
Description=IPMI fan control
After=multi-user.target

[Service]
ExecStart=/usr/local/bin/fan.sh
Restart=always

[Install]
WantedBy=multi-user.target

Юнит сохраняют в /etc/systemd/system/ipmi-fan.service, затем включают двумя командами:

sudo systemctl daemon-reload
sudo systemctl enable --now ipmi-fan.service

Для отладки служба запускается разово через systemctl start ipmi-fan.service, а её вывод виден командой journalctl -u ipmi-fan.service -f. Ключ Restart=always переживает сбои утилиты, а после перезагрузки сервера служба стартует автоматически. Тем же способом решается проблема сброса настроек: после обновления прошивки BMC или полного отключения питания ручные значения могут потеряться, и постоянный скрипт просто выставит их заново в течение первого цикла. Альтернатива для тех, кто не хочет постоянный процесс, это запись в crontab с теми же командами раз в несколько минут.

Пороги датчиков, журнал событий и ложные срабатывания

Снижая обороты, легко натолкнуться на нижние пороги вентиляторов: датчик падает ниже critical, BMC ставит отметку в журнал, а на части плат поднимает скорость обратно на максимум, сводя всю экономию на нет. В журнале это выглядит как события вида Lower Non-critical going low для конкретного вентилятора. Лечится правкой нижних порогов командой sensor thresh:

ipmitool sensor thresh FAN1 lower 100 200 300

Здесь заданы нижние границы non-critical, critical и non-recoverable в оборотах, и их подбирают с запасом ниже минимально стабильных оборотов конкретных вентиляторов: если на минимальном заполнении датчик показывает 600 оборотов, порог в 300 оставляет пространство для сбоев измерения. Верхние пороги правятся тем же командой с аргументом upper. Журнал событий после экспериментов просматривают через ipmitool sel list, а устаревшие записи чистят ipmitool sel clear, когда тестирование завершено. Здоровая картина выглядит так: вентиляторы крутятся ровно, статусов cr и nr нет, температуры дисков в пределах 35-45 градусов, процессор в простое заметно ниже 60.

Границы снижения шума и обслуживание сервера

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

  1. снять показания температур всех дисков и процессоров под реальной нагрузкой, а не в простое;
  2. убедиться, что нижние пороги вентиляторов в sensor list ниже планируемой скорости;
  3. проверить продувку корпуса: забитые фильтры и пыль на радиаторах сводят любую экономию оборотов к перегреву;
  4. назначить окно обслуживания и запасной способ доступа к BMC на случай сбоя регулировки;
  5. сохранить исходный режим охлаждения, чтобы вернуть его одной командой после тестов.

Жёстких универсальных процентов не существует. Вентилируемая дисковая полка, пассивная карта расширения с высоким радиатором и тихий офисный узел требуют разных значений, а температура в помещении напрямую сдвигает всю кривую: при +30 в серверной запас уменьшается на те же 10 градусов. Пассивные карты PCIe заслуживают особой осторожности: без собственного вентилятора они целиком зависят от потока в корпусе, и именно для них существует режим heavy IO на Supermicro и реакция на сторонние устройства у Dell.

Практика проста: опустите скорость на ступень, прогоните ночь под тестовой нагрузкой, посмотрите пики температур и журнал BMC, повторяйте, пока не найдёте границу. Низкие обороты дисковой зоны почти всегда безопасны, потому что жёстким дискам хватает 35-45 градусов, а процессорную зону стоит держать с запасом, поскольку тепловые лимиты современных моделей срабатывают быстро. В серверной с продуманной вентиляцией и чистыми фильтрами сервер на тридцати процентах слышен едва, при этом остаётся под защитой BMC, который в критической ситуации сам поднимет обороты по своим порогам, даже если внешний скрипт промедлит. Для постоянного присмотра значения из SDR удобно передавать в системы мониторинга вроде Zabbix: там рост температуры и падение оборотов ниже порога превращаются в обычное оповещение, и ручных проверок остаётся меньше.