Настройка авторегулирования оборотов вентиляторов

В любом современном компьютере есть датчики температуры. Датчики встраиваются в процессоры, материнские платы, диски, видеокарты. Кроме этого, на многих материнских платах есть возможность наблюдать за скоростью и управлять скоростью вращения вентиляторов. Используя специальный софт можно связать одно с другим. Чтобы, только при повышении температуры вентиляторы начинали крутиться быстрее.

Я не нашёл для этой задачи софта с нормальным графическим интерфейсом. Есть только консольные программы. Благо, они дружелюбны. Настройка производится в режиме мастера. Вам задаются вопросы, вы выбираете варианты ответов. У меня настройка заняла 5 минут.

Руководство неоднократно мною использовано, в том числе в Elementary OS 5 и Ubuntu 20.04.

Установка необходимого софта:

sudo apt install lm-sensors fancontrol

Запуск автоматического определения имеющихся в компьютере датчиков:

sudo sensors-detect

При этом сначала будут задаваться вопросы, хотим ли мы тестировать те или иные типы существующих в природе чипов. В принципе, можно не вникать, что за железо нам предлагают для тестирования. Можно нажимать всегда y и тестировать всё подряд.

В конце будет предложено сохранить найденное в файл конфигурации. Сделайте это, если результат тестирования вас удовлетворит, если будут найдены хоть какие-нибудь датчики.

Результат для моего компьютера:

elementary@elementary:~$ sudo sensors-detect
# sensors-detect revision 6284 (2015-05-31 14:00:33 +0200)
# Board: ASRock H67M-GE
# Kernel: 4.13.0-32-generic x86_64
# Processor: Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz (6/42/7)

This program will help you determine which kernel modules you need
to load to use lm_sensors most effectively. It is generally safe
and recommended to accept the default answers to all questions,
unless you know what you're doing.

Some south bridges, CPUs or memory controllers contain embedded sensors.
Do you want to scan for them? This is totally safe. (YES/no): y
Module cpuid loaded successfully.
Silicon Integrated Systems SIS5595...                       No
VIA VT82C686 Integrated Sensors...                          No
VIA VT8231 Integrated Sensors...                            No
AMD K8 thermal sensors...                                   No
AMD Family 10h thermal sensors...                           No
AMD Family 11h thermal sensors...                           No
AMD Family 12h and 14h thermal sensors...                   No
AMD Family 15h thermal sensors...                           No
AMD Family 16h thermal sensors...                           No
AMD Family 15h power sensors...                             No
AMD Family 16h power sensors...                             No
Intel digital thermal sensor...                             Success!
    (driver `coretemp')
Intel AMB FB-DIMM thermal sensor...                         No
Intel 5500/5520/X58 thermal sensor...                       No
VIA C7 thermal sensor...                                    No
VIA Nano thermal sensor...                                  No

Some Super I/O chips contain embedded sensors. We have to write to
standard I/O ports to probe them. This is usually safe.
Do you want to scan for Super I/O sensors? (YES/no): y
Probing for Super-I/O at 0x2e/0x2f
Trying family `National Semiconductor/ITE'...               No
Trying family `SMSC'...                                     No
Trying family `VIA/Winbond/Nuvoton/Fintek'...               Yes
Found `Nuvoton NCT5573D/NCT5577D/NCT6776F Super IO Sensors' Success!
    (address 0x290, driver `nct6775')
Probing for Super-I/O at 0x4e/0x4f
Trying family `National Semiconductor/ITE'...               No
Trying family `SMSC'...                                     No
Trying family `VIA/Winbond/Nuvoton/Fintek'...               No
Trying family `ITE'...                                      No

Some systems (mainly servers) implement IPMI, a set of common interfaces
through which system health data may be retrieved, amongst other things.
We first try to get the information from SMBIOS. If we don't find it
there, we have to read from arbitrary I/O ports to probe for such
interfaces. This is normally safe. Do you want to scan for IPMI
interfaces? (YES/no): y
Probing for `IPMI BMC KCS' at 0xca0...                      No
Probing for `IPMI BMC SMIC' at 0xca8...                     No

Some hardware monitoring chips are accessible through the ISA I/O ports.
We have to write to arbitrary I/O ports to probe them. This is usually
safe though. Yes, you do have ISA I/O ports even if you do not have any
ISA slots! Do you want to scan the ISA I/O ports? (yes/NO): y
Probing for `National Semiconductor LM78' at 0x290...       No
Probing for `National Semiconductor LM79' at 0x290...       No
Probing for `Winbond W83781D' at 0x290...                   No
Probing for `Winbond W83782D' at 0x290...                   No

Lastly, we can probe the I2C/SMBus adapters for connected hardware
monitoring devices. This is the most risky part, and while it works
reasonably well on most systems, it has been reported to cause trouble
on some systems.
Do you want to probe the I2C/SMBus adapters now? (YES/no): y
Using driver `i2c-i801' for device 0000:00:1f.3: Intel Cougar Point (PCH)
Module i2c-i801 loaded successfully.

Next adapter: Radeon i2c bit bus 0x90 (i2c-0)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x91 (i2c-1)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x92 (i2c-2)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x93 (i2c-3)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x94 (i2c-4)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x95 (i2c-5)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x96 (i2c-6)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: Radeon i2c bit bus 0x97 (i2c-7)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: card0-DP-1 (i2c-8)
Do you want to scan it? (yes/NO/selectively): y

Next adapter: SMBus I801 adapter at f000 (i2c-9)
Do you want to scan it? (yes/NO/selectively): y
Client found at address 0x50
Probing for `Analog Devices ADM1033'...                     No
Probing for `Analog Devices ADM1034'...                     No
Probing for `SPD EEPROM'...                                 Yes
    (confidence 8, not a hardware monitoring chip)
Probing for `EDID EEPROM'...                                No
Client found at address 0x51
Probing for `Analog Devices ADM1033'...                     No
Probing for `Analog Devices ADM1034'...                     No
Probing for `SPD EEPROM'...                                 Yes
    (confidence 8, not a hardware monitoring chip)
Client found at address 0x52
Probing for `Analog Devices ADM1033'...                     No
Probing for `Analog Devices ADM1034'...                     No
Probing for `SPD EEPROM'...                                 Yes
    (confidence 8, not a hardware monitoring chip)
Client found at address 0x53
Probing for `Analog Devices ADM1033'...                     No
Probing for `Analog Devices ADM1034'...                     No
Probing for `SPD EEPROM'...                                 Yes
    (confidence 8, not a hardware monitoring chip)


Now follows a summary of the probes I have just done.
Just press ENTER to continue: 

Driver `nct6775':
  * ISA bus, address 0x290
    Chip `Nuvoton NCT5573D/NCT5577D/NCT6776F Super IO Sensors' (confidence: 9)

Driver `coretemp':
  * Chip `Intel digital thermal sensor' (confidence: 9)

To load everything that is needed, add this to /etc/modules:
#----cut here----
# Chip drivers
coretemp
nct6775
#----cut here----
If you have some drivers built into your kernel, the list above will
contain too many modules. Skip the appropriate ones!

Do you want to add these lines automatically to /etc/modules? (yes/NO)y
Successful!

Monitoring programs won't work until the needed modules are
loaded. You may want to run '/etc/init.d/kmod start'
to load them.

Unloading i2c-i801... OK
Unloading cpuid... OK

Теперь можно перегрузить фоновый сервис, чтобы изменения вступили в силу:

sudo service module-init-tools restart

После посмотреть показания всех найденных датчиков:

sensors

Результат для моего компьютера:

elementary@elementary:~$ sudo service module-init-tools restart
elementary@elementary:~$ sensors
nct6776-isa-0290
Adapter: ISA adapter
Vcore:          +0.93 V  (min =  +0.00 V, max =  +1.74 V)
in1:            +1.86 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
AVCC:           +3.34 V  (min =  +2.98 V, max =  +3.63 V)
+3.3V:          +3.33 V  (min =  +2.98 V, max =  +3.63 V)
in4:            +0.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in5:            +1.66 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
in6:            +0.94 V  (min =  +0.00 V, max =  +0.00 V)  ALARM
3VSB:           +3.42 V  (min =  +2.98 V, max =  +3.63 V)
Vbat:           +3.25 V  (min =  +2.70 V, max =  +3.63 V)
fan1:             0 RPM  (min =    0 RPM)
fan2:          2872 RPM  (min =    0 RPM)
fan3:             0 RPM  (min =    0 RPM)
fan4:             0 RPM  (min =    0 RPM)
fan5:             0 RPM  (min =    0 RPM)
SYSTIN:         +29.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor
CPUTIN:         +30.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
AUXTIN:         +29.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor
PECI Agent 0:   +36.0°C  (high = +80.0°C, hyst = +75.0°C)
                         (crit = +98.0°C)
PCH_CHIP_TEMP:   +0.0°C  
PCH_CPU_TEMP:    +0.0°C  
PCH_MCH_TEMP:    +0.0°C  
intrusion0:    ALARM
intrusion1:    OK
beep_enable:   disabled

radeon-pci-0100
Adapter: PCI adapter
temp1:        +38.0°C  (crit = +120.0°C, hyst = +90.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +37.0°C  (high = +80.0°C, crit = +98.0°C)
Core 0:        +30.0°C  (high = +80.0°C, crit = +98.0°C)
Core 1:        +31.0°C  (high = +80.0°C, crit = +98.0°C)
Core 2:        +33.0°C  (high = +80.0°C, crit = +98.0°C)
Core 3:        +28.0°C  (high = +80.0°C, crit = +98.0°C)

Важно, чтобы у вас в результатах показывались обороты вентилятора(ов)!

Если таковых нет, то продолжать настройку дальше смысла нет. Управлять нечем. Возможно вы сделали не полный поиск по всевозможным вариантам оборудования. Тогда попробуйте его повторить. Если не поможет, то вам не повезло. Либо в софте нет поддержки вашего типа оборудования. Либо у вас железо, которое не имеет соответствующих датчиков и управления.

У меня к материнской плате подключен только один вентилятор, из трёх возможных. Этот единственный вентилятор на процессоре. Им я и хотел управлять. По умолчанию он был включен на полные обороты. Скорость вращения видна в выдаче.

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

sudo pwmconfig

Не торопитесь, читайте, что пишет и спрашивает программа. Делает она это, к сожалению, на английском. Но текст можно копировать, например, в Google-переводчик. Важно понимать, что вы делаете.

Результат для моего компьютера:

elementary@elementary:~$ sudo pwmconfig
# pwmconfig revision 6243 (2014-03-20)
This program will search your sensors for pulse width modulation (pwm)
controls, and test each one to see if it controls a fan on
your motherboard. Note that many motherboards do not have pwm
circuitry installed, even if your sensor chip supports pwm.

We will attempt to briefly stop each fan using the pwm controls.
The program will attempt to restore each fan to full speed
after testing. However, it is ** very important ** that you
physically verify that the fans have been to full speed
after the program has completed.

Found the following devices:
   hwmon0 is radeon
   hwmon1 is coretemp
   hwmon2 is nct6776

Found the following PWM controls:
   hwmon2/pwm1           current value: 255
   hwmon2/pwm2           current value: 228
hwmon2/pwm2 is currently setup for automatic speed control.
In general, automatic mode is preferred over manual mode, as
it is more efficient and it reacts faster. Are you sure that
you want to setup this output for manual control? (n) y
   hwmon2/pwm3           current value: 255

Giving the fans some time to reach full speed...
Found the following fan sensors:
   hwmon2/fan1_input     current speed: 0 ... skipping!
   hwmon2/fan2_input     current speed: 2909 RPM
   hwmon2/fan3_input     current speed: 0 ... skipping!
   hwmon2/fan4_input     current speed: 0 ... skipping!
   hwmon2/fan5_input     current speed: 0 ... skipping!

Warning!!! This program will stop your fans, one at a time,
for approximately 5 seconds each!!!
This may cause your processor temperature to rise!!!
If you do not want to do this hit control-C now!!!
Hit return to continue: 

Testing pwm control hwmon2/pwm1 ...
  hwmon2/fan2_input ... speed was 2909 now 2909
    no correlation

No correlations were detected.
There is either no fan connected to the output of hwmon2/pwm1,
or the connected fan has no rpm-signal connected to one of
the tested fan sensors. (Note: not all motherboards have
the pwm outputs connected to the fan connectors,
check out the hardware database on http://www.almico.com/forumindex.php)

Did you see/hear a fan stopping during the above test (n)? n

Testing pwm control hwmon2/pwm2 ...
  hwmon2/fan2_input ... speed was 2909 now 1002
    It appears that fan hwmon2/fan2_input
    is controlled by pwm hwmon2/pwm2
Would you like to generate a detailed correlation (y)? y
Note: If you had gnuplot installed, I could generate a graphical plot.
    PWM 255 FAN 2954
    PWM 240 FAN 2967
    PWM 225 FAN 2812
    PWM 210 FAN 2755
    PWM 195 FAN 2626
    PWM 180 FAN 2486
    PWM 165 FAN 2339
    PWM 150 FAN 2177
    PWM 135 FAN 2033
    PWM 120 FAN 1821
    PWM 105 FAN 1648
    PWM 90 FAN 1500
    PWM 75 FAN 1317
    PWM 60 FAN 1192
    PWM 45 FAN 1104
    PWM 30 FAN 1042
    PWM 28 FAN 1035
    PWM 26 FAN 1011
    PWM 24 FAN 1006
    PWM 22 FAN 1023
    PWM 20 FAN 1018
    PWM 18 FAN 997
    PWM 16 FAN 996
    PWM 14 FAN 1014
    PWM 12 FAN 1014
    PWM 10 FAN 996
    PWM 8 FAN 994
    PWM 6 FAN 1014
    PWM 4 FAN 1014
    PWM 2 FAN 994
    PWM 0 FAN 994


Testing pwm control hwmon2/pwm3 ...
  hwmon2/fan2_input ... speed was 2909 now 2973
    no correlation

No correlations were detected.
There is either no fan connected to the output of hwmon2/pwm3,
or the connected fan has no rpm-signal connected to one of
the tested fan sensors. (Note: not all motherboards have
the pwm outputs connected to the fan connectors,
check out the hardware database on http://www.almico.com/forumindex.php)

Did you see/hear a fan stopping during the above test (n)? n

Testing is complete.
Please verify that all fans have returned to their normal speed.

The fancontrol script can automatically respond to temperature changes
of your system by changing fanspeeds.

Do you want to set up its configuration file now (y)? y
What should be the path to your fancontrol config file (/etc/fancontrol)? 

Select fan output to configure, or other action:
1) hwmon2/pwm2        3) Just quit       5) Show configuration
2) Change INTERVAL     4) Save and quit
select (1-n): 1

Devices:
hwmon0 is radeon
hwmon1 is coretemp
hwmon2 is nct6776

Current temperature readings are as follows:
hwmon0/temp1_input 40
hwmon1/temp1_input 37
hwmon1/temp2_input 30
hwmon1/temp3_input 32
hwmon1/temp4_input 33
hwmon1/temp5_input 28
hwmon2/temp1_input 29
hwmon2/temp2_input 29
hwmon2/temp3_input 29
hwmon2/temp7_input 35
hwmon2/temp8_input 0
hwmon2/temp9_input 0

Select a temperature sensor as source for hwmon2/pwm2:
 1) hwmon0/temp1_input
 2) hwmon1/temp1_input
 3) hwmon1/temp2_input
 4) hwmon1/temp3_input
 5) hwmon1/temp4_input
 6) hwmon1/temp5_input
 7) hwmon2/temp1_input
 8) hwmon2/temp2_input
 9) hwmon2/temp3_input
10) hwmon2/temp7_input
11) hwmon2/temp8_input
12) hwmon2/temp9_input
13) None (Do not affect this PWM output)
select (1-n): 2

Enter the low temperature (degree C)
below which the fan should spin at minimum speed (20): 40

Enter the high temperature (degree C)
over which the fan should spin at maximum speed (60): 

Enter the PWM value (0-255) to use when the temperature
is over the high temperature limit (255): 


Select fan output to configure, or other action:
1) hwmon2/pwm2        3) Just quit       5) Show configuration
2) Change INTERVAL     4) Save and quit
select (1-n): 4

Saving configuration to /etc/fancontrol...
Configuration saved

Теперь комментарии к моему примеру.

Смысл первого этапа в том, что программа видит, какие есть датчики оборотов. Каждый датчик/вентилятор она пытается затормозить на 5 секунд. Нужно подтвердить – было снижение оборотов или нет. Если снижение вы подтверждаете, то программа для этого датчика дополнительно предлагает попробовать плавную регулировку оборотов.

В моём случае один вентилятор и 3 датчика. Первым программа попыталась управлять, но результата никакого не было. Управление вторым датчиком имело результат — обороты снизились. Дополнительно произведён тест плавного регулирования оборотов. От тестирования третьего датчика я отказался.

Второй этап — это настройка автоматического регулирования оборотов. Я выбрал из списка единственный свой датчик, который хотел настроить. Другие в списке не показались, ведь для них я не подтвердил, что ими удалось управлять.

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

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

У меня управление оборотами вентилятора, который на процессоре. Не составило труда определить датчики температуры для каждого из четырех его ядер. Ещё, по температуре я сразу узнал датчик видеокарты. Но это всё не то. Лучше всего для мой задачи подошёл бы какой-нибудь общий датчик температуры процессора. Позднее я его все же идентифицировал.

Очевидно, что лучше выбирать тот датчик температуры, который те только подходит по смыслу, но и быстро реагирует на изменения температуры процессора, чтобы быстрее подстраивать под неё обороты вентилятора. Так, например, показания датчика, который расположен где-то на поверхности материнской платы, да ещё и в далеке от процессора — это неприемлемый выбор.

В общем, тут выбор у каждого свой. Я вначале выбрал почти наугад, но позднее потестировал, как всё это работает при нагрузке. Оказалось, что выбор сделан правильный. Нагружая процессор, температура выбранного датчика меняется довольно быстро и обороты вентилятора при этом начинали постепенно расти.

В случае необходимости можно изменить выбор. Это можно сделать вручную, просто отредактировав файл конфигурации /etc/fancontrol. Ну или запустить снова мастер настройки. Я рекомендую второй вариант. Он значительно проще и последующие разы отвечать на вопросы можно практически не задумываясь. Времени уходит минимум.

В мастере настройки я указал, что до температуры 40°C обороты вентилятора должны быть минимальны. Максимальные обороты при температуре 60°C. Далее выбрал сохранение результатов и выход.

Чтобы настройки начали работать нужно запустить фоновый сервис:

sudo service fancontrol start

У меня при этом сразу наступила тишина.

Ещё команды, которые стоит знать:

sudo service fancontrol stop
sudo service fancontrol restart

Соответственно, остановка и перезапуск фонового сервиса fancontrol.

Проблема

У меня иногда случалось так, что компьютер запускался, а вентиляторы продолжали крутиться на полных оборотах. Перезапуск компьютера обычно решал проблему. Ещё можно было просто перезапустить службу fancontrol.

В итоге я просто добавил задержку 5 секунд перед запуском службы. Видимо, какие-то компоненты системы не успевали активироваться/прогрузиться перед запуском службы.

Файл /usr/lib/systemd/system/fancontrol.service необходимо скопировать в /etc/systemd/system/fancontrol.service и уже здесь его отредактировать. Добавляем sleep 5. У меня файл получался таким:

[Unit]
Description=fan speed regulator
# Run pwmconfig to create this file.
ConditionPathExists=/etc/fancontrol
After=lm-sensors.service
Documentation=man:fancontrol(8) man:pwmconfig(8)

[Service]
ExecStartPre=/usr/bin/sleep 5
ExecStartPre=/usr/sbin/fancontrol --check
ExecStart=/usr/sbin/fancontrol
PIDFile=/var/run/fancontrol.pid

[Install]
WantedBy=multi-user.target

Комментарии