Управление кулером на ноутбуке Asus X554L
Ubuntu 22.04
fancontrol 1:3.6.0-7ubuntu1
fancontrol - это bash скрипт для управления скоростью кулера(ов).
Запускается как systemd сервис.
Дело в том, что по умолчанию, политика охлаждения для этого ноутбука на мой взгляд излишне агрессивная.
Например при t +34.0°C обороты держатся на значении 2300 RPM.
Меня бы устроило полное отключение вентилятора до t +48.0°C.
Установка
Устанавливаем fancontrol и набор утилит lm-sensors
sudo apt-get install fancontrol lm-sensors
Введение
Модуль asus_nb_wmi
Познакомимся с модулем (драйвером) управления кулером asus_nb_wmi.
Он должен быть автоматически загружен, это специфичный модуль для ноутбуков Asus
$ lsmod | grep asus asus_nb_wmi 28672 0 <---------- Есть asus_wireless 20480 0 asus_wmi 45056 2 asus_nb_wmi,mfd_aaeon sparse_keymap 16384 1 asus_wmi platform_profile 16384 1 asus_wmi video 65536 3 asus_wmi,i915,nouveau
Запустим команду sensors и посмотрим какие датчики нам доступны и какие интересуют
$ sensors asus-isa-0000 <---------- Датчик предоставляемый модулем asus_nb_wmi Adapter: ISA adapter cpu_fan: 2300 RPM <---------- Скорость вращения cpu_fan - это единственный кулер temp1: +37.0°C <---------- Температура, вероятно средняя coretemp-isa-0000 <---------- Датчик предоставляемый модулем coretemp, данные по CPU Adapter: ISA adapter Package id 0: +37.0°C (high = +105.0°C, crit = +105.0°C) <---------- Средняя Core 0: +37.0°C (high = +105.0°C, crit = +105.0°C) <---------- Ядро #0 Core 1: +37.0°C (high = +105.0°C, crit = +105.0°C) <---------- Ядро #1 BAT0-acpi-0 Adapter: ACPI interface in0: 7.50 V pch_wildcat_point-virtual-0 Adapter: Virtual device temp1: +37.0°C nouveau-pci-0400 <---------- Датчик предоставляемый модулем nouveau, видеокарта Nvidia Adapter: PCI adapter GPU core: N/A (min = +0.60 V, max = +1.20 V) temp1: N/A (high = +95.0°C, hyst = +3.0°C) (crit = +105.0°C, hyst = +5.0°C) (emerg = +135.0°C, hyst = +5.0°C) acpitz-acpi-0 Adapter: ACPI interface temp1: +37.0°C (crit = +108.0°C)
Данные по температуре и управление модулем осуществляется через виртуальную файловую систему sysfs.
Найдем датчик asus-isa-0000
$ ls -la /sys/devices/platform/asus-nb-wmi/hwmon/ total 0 drwxr-xr-x 3 root root 0 Mar 6 16:41 . drwxr-xr-x 5 root root 0 Mar 6 16:41 .. drwxr-xr-x 3 root root 0 Mar 6 16:41 hwmon6 # Имя сенсора $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/name asus # Имя кулера $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_label cpu_fan # Скорость вращения $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_input 2300 # Температура. Делим значение на 1000 и получаем +35.05С $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/temp1_input 35050 # Режим работы управления скоростью кулера через PWM # 1 - ручной # 2 - автоматический $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/pwm1_enable 2 # Значение PWM (будем считать, что это значение мощности) # 0 - минимальное значение (кулер не вращается) # 255 - максимальное значение # NOTE: При автоматическом управлении, это значение не отражает действительности $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/pwm1 85
hwmon6 - это имя предоставляемое The Linux Hardware Monitoring kernel API.
Номер может манятся, поэтому в дальнейшем использоваться wildcard путь, к счастью у нас один кулер.
Управляем кулером
Потренируемся управлять вентилятором вручную.
Дальнейшие действия будем выполнять из под root.
sudo -i
# Установим максимальную мощность. При этом режим управления перейдет в ручной! echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Посмотрим скорость вращения $ cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/fan1_input cat: /sys/devices/platform/asus-nb-wmi/hwmon/hwmon6/fan1_input: No such device or address # Посмотрим температуру cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input # Выключим кулер echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Посмотрим температуру cat /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input # Возвращаем автоматические режим echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable
В ручном режиме скорость вращения не отображается.
К сожалению это такой баг или фича.
Опытным путем выяснил, что при значении PWM < 40 кулеру не хватает мощности что бы раскрутиться.
Настройка fancontrol
Скрипт действует точно также, как ранее выполнялись действия руками используя sysfs.
Постоянно подстраивает значение PWM в зависимости от t°C.
Создаем файл конфигурации. Пример файла с описанием параметров:
/etc/fancontrol
# Частота опроса сенсора в сек. Как быстро скрипт будет реагировать на изменение t. INTERVAL=3 # Минимальное значение PWM (по умолчанию 0) #MINPWM=0 # Максимальное значение PWM (по умолчанию 255) #MAXPWM=255 # Сопоставление сенсоров температуры с устройствами регулирования # В данном случае у нас одна пара, но скрипт позволяет использовать список через пробел. FCTEMPS=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/temp1_input # Сопоставление датчиков скорости с устройствами регулирования. Параметр опционален. # Т.к. при переходе в ручной режим управления, данные по скорости RPM недоступны, то и использовать не получится. # Да и я не очень понял зачем этот параметр, что конкретно он делает и как влияет. #FCFANS=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/fan1_input # При значении датчика t < 48С, устанавливать значение pwm1 = MINPWM MINTEMP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=48 # При значении датчика t >= 65С, устанавливать значение pwm1 = MAXPWM MAXTEMP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=65 # Если вентилятор был остановлен, то старт будет со значения MINSTART # Возможно сделать резкий старт или плавный. # Надо учесть то, что значение при котором вентилятор способен раскрутиться на этом ноутбуке >=40. # На следующем же интервале опроса - это значение будет скорректировано в большую или меньшую сторону. MINSTART=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=100 # Что-то типа минимально гарантированное значение PWM, но только если значение датчика t > MINTEMP. # Там хитрая формула и это значение будет прибавлено к расчетному. # Опытным путям я поставил значение чуть меньше, чем значение при котором вентилятор способен раскрутиться. MINSTOP=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=30 # Усредняет значения температуры при расчете по нескольким измерениям, что позволяет изменять скорость более плавно. AVERAGE=/sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1=3
Формула расчета скорости из скрипта
# minsa - MINSTART # minso - MINSTOP if (( $tval <= $mint )) then pwmval=$minpwm # below min temp, use defined min pwm elif (( $tval >= $maxt )) then pwmval=$maxpwm # over max temp, use defined max pwm else # calculate the new value from temperature and settings pwmval="(${tval}-${mint})*(${maxpwm}-${minso})/(${maxt}-${mint})+${minso}" if [ $pwmpval -eq 0 -o $min_fanval -eq 0 ] then # if fan was stopped start it using a safe value echo $minsa > $pwmo # Sleep while still handling signals sleep 1 & wait fi fi
Запускаем скрипт
sudo systemctl restart fancontrol.service
В случае неудачного запуска смотрим логи
sudo journalctl -u fancontrol.service -n100
Если сервис будет остановлен, то перед выходом скрипт установит максимальное значение PWM.
Обсуждение