Difference between revisions of "Fan speed control"
(→simple bash script to fine tune fan speed) |
(Splite section.) |
||
(39 intermediate revisions by 16 users not shown) | |||
Line 1: | Line 1: | ||
− | [[Category:CPU | + | [[Category:CPU]] |
− | [[ | + | [[it:Fan Speed Control]] |
+ | [[ru:Fan Speed Control]] | ||
+ | {{Article summary start}} | ||
+ | {{Article summary text|Fancontrol, part of {{Pkg|lm_sensors}}, can be used to control the speed and sound of CPU/case fans. This article covers configuration/setup of the utility}} | ||
+ | {{Article summary heading|Related}} | ||
+ | {{Article summary wiki|Lm_sensors}} | ||
+ | {{Article summary end}} | ||
+ | == Sensor driver == | ||
+ | Support for newer motherboards may not yet be in the Linux kernel. Check the official [http://www.lm-sensors.org/wiki/Devices lm-sensors devices] table to see if experimental drivers are available for such motherboards. | ||
− | {{ | + | It is recommended not to use lm_sensors.service to load the needed modules for fancontrol. Instead, manually place them in {{ic|/etc/modules-load.d/load_these.conf}} since the order in which these modules are loaded dictate the order in which the needed symlinks for hwmon get created. In other words, using the lm_sensors.service causes inconsistencies boot-to-boot which will render the configuration file for fan control worthless for a consistency point of view. |
− | |||
− | |||
− | |||
− | |||
− | + | For more, see this thread: https://bbs.archlinux.org/viewtopic.php?pid=1251766 | |
− | |||
− | |||
=== lm-sensors === | === lm-sensors === | ||
+ | Set up [[Lm_sensors|lm_sensors]]. | ||
− | + | {{bc|1=$ sensors | |
− | |||
− | |||
− | |||
− | |||
coretemp-isa-0000 | coretemp-isa-0000 | ||
Adapter: ISA adapter | Adapter: ISA adapter | ||
Core 0: +29.0°C (high = +76.0°C, crit = +100.0°C) | Core 0: +29.0°C (high = +76.0°C, crit = +100.0°C) | ||
− | + | [...] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
it8718-isa-0290 | it8718-isa-0290 | ||
Line 45: | Line 34: | ||
temp1: +37.5°C (low = +129.5°C, high = +129.5°C) sensor = thermistor | temp1: +37.5°C (low = +129.5°C, high = +129.5°C) sensor = thermistor | ||
temp2: +25.0°C (low = +127.0°C, high = +127.0°C) sensor = thermal diode | temp2: +25.0°C (low = +127.0°C, high = +127.0°C) sensor = thermal diode | ||
− | + | }} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | If the output does not display an RPM value for the CPU fan, one may need to increase the fan divisor. If fan speed is shown and higher than 0, skip the next step. | |
− | + | ====Increasing fan_div==== | |
+ | The first line of the sensors output is the chipset used by the motherboard for readings of temperatures and voltages. | ||
− | + | Edit {{ic|/etc/sensors.d/sensors.conf}} and look up the exact chipset. A few chipset names are similar, so make sure the one to edit is correct. Add the line {{ic|set fanX_div 4}} near the start of the chipset config, replacing X with the number of CPU fans in the target system. | |
− | + | Save the file, and run as root: | |
+ | # sensors -s | ||
which will reload the sensors.conf's set variables. | which will reload the sensors.conf's set variables. | ||
Run sensors again and check if there is an RPM readout. If not, increase the divisor to 8, 16 or 32. YMMV! | Run sensors again and check if there is an RPM readout. If not, increase the divisor to 8, 16 or 32. YMMV! | ||
− | + | == Configuration == | |
− | |||
− | == | ||
− | + | {{Note|Advanced users may want to skip this section and write {{ic|/etc/fancontrol}} on their own, which also saves them from hearing all of the fans at full speed.}} | |
− | |||
− | Follow the instructions in pwmconfig to set up basic speeds. | + | Once sensors is properly configured, run {{Ic|pwmconfig}} to test and configure speed control. Follow the instructions in {{Ic|pwmconfig}} to set up basic speeds. The default configuration options should create a new file, {{ic|/etc/fancontrol}}. |
− | + | === Tweaking === | |
− | + | {{Warning|Some of the steps outlined below describe how to tweak fan speeds. Before doing this be sure to have a low CPU load.}} | |
− | + | {{Note|On several systems, the included script may report errors as it trys to calibrate fans to the respective PWM. Users may safely ignore these errors. The problem is that the script does not wait long enough before ramping up or down the PWM.}} | |
− | + | Users wishing more more control may need to tweak the generated configuration. Here is a sample configuration file: | |
+ | INTERVAL=10 | ||
+ | DEVPATH=hwmon0=devices/platform/coretemp.0 hwmon2=devices/platform/w83627ehf.656 | ||
+ | DEVNAME=hwmon0=coretemp hwmon2=w83627dhg | ||
+ | FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp1_input | ||
+ | FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input | ||
+ | MINTEMP=hwmon0/device/pwm1=20 | ||
+ | MAXTEMP=hwmon0/device/pwm1=55 | ||
+ | MINSTART=hwmon0/device/pwm1=150 | ||
+ | MINSTOP=hwmon0/device/pwm1=105 | ||
− | + | * '''INTERVAL''': how often the daemon should poll CPU temps and adjust fan speeds. INTERVAL is in seconds. | |
− | + | The rest of the configuration file is split into (at least) two values per configuration option. Each configuration option first points to a PWM device which is written to which sets the fan speed. The second "field" is the actual value to set. This allows monitoring and controlling multiple fans and temperatures. | |
− | + | * '''FCTEMPS''': The temperature input device to read for CPU temperature. The above example corresponds to {{Ic|/sys/class/hwmon/hwmon0/device/temp1_input}}. | |
− | + | * '''FCFANS''': The current fan speed, which can be read (like the temperature) in {{Ic|/sys/class/hwmon/hwmon0/device/fan1_input}} | |
− | FCTEMPS | + | * '''MINTEMP''': The temperature (°C) at which to '''SHUT OFF''' the CPU fan. Efficient CPUs often will not need a fan while idling. Be sure to set this to a temperature that ''you know is safe''. Setting this to 0 is not recommended and may ruin your hardware! |
− | FCFANS | + | * '''MAXTEMP''': The temperature (°C) at which to spin the fan at its ''MAXIMUM'' speed. This should be probably be set to perhaps 10 or 20 degrees (°C) below your CPU's critical/shutdown temperature. Setting it closer to MINTEMP will result in higher fan speeds overall. |
− | MINTEMP | + | * '''MINSTOP''': The PWM value at which your fan stops spinning. Each fan is a little different. Power tweakers can {{Ic|echo}} different values (between 0 and 255) to {{ic|/sys/class/hwmon/hwmon0/device/pwm1}} and then watch the CPU fan. When the CPU fan stops, use this value. |
− | + | * '''MINSTART''': The PWM value at which your fan starts to spin again. This is often a higher value than MINSTOP as more voltage is required to overcome inertia. | |
− | |||
− | |||
− | |||
− | + | There are also two settings fancontrol needs to verify the configuration file is still up to date. The lines start with the setting name and a equality sign, followed by groups of hwmon-class-device=setting, seperated by spaces. You need to specify each setting for each hwmon class device you use anywhere in the config, or fancontrol will not work. | |
− | + | * '''DEVPATH''': Sets the physical device. You can determine this by executing the command | |
+ | readlink -f /sys/class/hwmon/<hwmon-device>/device | sed -e 's/^\/sys\///' | ||
+ | * '''DEVNAME''': Sets the name of the device. Try | ||
+ | cat /sys/class/hwmon/<hwmon-device>/device/name | sed -e 's/[[:space:]=]/_/g' | ||
− | + | {{Tip|Use '''MAXPWM''' and '''MINPWM''' options that limit fan speed range. See {{Ic|man fancontrol}} for details.}} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | == fancontrol == | |
Try to run fancontrol: | Try to run fancontrol: | ||
− | + | # /usr/bin/fancontrol | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | A properly configured setup will not error out and will take control of system fans. Users should hear system fans slowing shortly after executing this command. | |
− | |||
− | + | {{Note|For Dell Latitude/Inspiron laptops, {{Pkg|i8kutils}}/{{Pkg|i8kmon}} are available. Note that these two packages do ''not'' work on the Inspiron 1764.}} | |
− | + | To make fancontrol start automatically on every boot as a service run: | |
− | + | # systemctl enable fancontrol | |
+ | # systemctl start fancontrol |
Revision as of 10:42, 19 October 2013
Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary end
Contents
Sensor driver
Support for newer motherboards may not yet be in the Linux kernel. Check the official lm-sensors devices table to see if experimental drivers are available for such motherboards.
It is recommended not to use lm_sensors.service to load the needed modules for fancontrol. Instead, manually place them in /etc/modules-load.d/load_these.conf
since the order in which these modules are loaded dictate the order in which the needed symlinks for hwmon get created. In other words, using the lm_sensors.service causes inconsistencies boot-to-boot which will render the configuration file for fan control worthless for a consistency point of view.
For more, see this thread: https://bbs.archlinux.org/viewtopic.php?pid=1251766
lm-sensors
Set up lm_sensors.
$ sensors coretemp-isa-0000 Adapter: ISA adapter Core 0: +29.0°C (high = +76.0°C, crit = +100.0°C) [...] it8718-isa-0290 Adapter: ISA adapter Vcc: +1.14 V (min = +0.00 V, max = +4.08 V) VTT: +2.08 V (min = +0.00 V, max = +4.08 V) +3.3V: +3.33 V (min = +0.00 V, max = +4.08 V) NB Vcore: +0.03 V (min = +0.00 V, max = +4.08 V) VDRAM: +2.13 V (min = +0.00 V, max = +4.08 V) fan1: 690 RPM (min = 10 RPM) temp1: +37.5°C (low = +129.5°C, high = +129.5°C) sensor = thermistor temp2: +25.0°C (low = +127.0°C, high = +127.0°C) sensor = thermal diode
If the output does not display an RPM value for the CPU fan, one may need to increase the fan divisor. If fan speed is shown and higher than 0, skip the next step.
Increasing fan_div
The first line of the sensors output is the chipset used by the motherboard for readings of temperatures and voltages.
Edit /etc/sensors.d/sensors.conf
and look up the exact chipset. A few chipset names are similar, so make sure the one to edit is correct. Add the line set fanX_div 4
near the start of the chipset config, replacing X with the number of CPU fans in the target system.
Save the file, and run as root:
# sensors -s
which will reload the sensors.conf's set variables. Run sensors again and check if there is an RPM readout. If not, increase the divisor to 8, 16 or 32. YMMV!
Configuration
/etc/fancontrol
on their own, which also saves them from hearing all of the fans at full speed.Once sensors is properly configured, run pwmconfig
to test and configure speed control. Follow the instructions in pwmconfig
to set up basic speeds. The default configuration options should create a new file, /etc/fancontrol
.
Tweaking
Users wishing more more control may need to tweak the generated configuration. Here is a sample configuration file:
INTERVAL=10 DEVPATH=hwmon0=devices/platform/coretemp.0 hwmon2=devices/platform/w83627ehf.656 DEVNAME=hwmon0=coretemp hwmon2=w83627dhg FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp1_input FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input MINTEMP=hwmon0/device/pwm1=20 MAXTEMP=hwmon0/device/pwm1=55 MINSTART=hwmon0/device/pwm1=150 MINSTOP=hwmon0/device/pwm1=105
- INTERVAL: how often the daemon should poll CPU temps and adjust fan speeds. INTERVAL is in seconds.
The rest of the configuration file is split into (at least) two values per configuration option. Each configuration option first points to a PWM device which is written to which sets the fan speed. The second "field" is the actual value to set. This allows monitoring and controlling multiple fans and temperatures.
- FCTEMPS: The temperature input device to read for CPU temperature. The above example corresponds to
/sys/class/hwmon/hwmon0/device/temp1_input
. - FCFANS: The current fan speed, which can be read (like the temperature) in
/sys/class/hwmon/hwmon0/device/fan1_input
- MINTEMP: The temperature (°C) at which to SHUT OFF the CPU fan. Efficient CPUs often will not need a fan while idling. Be sure to set this to a temperature that you know is safe. Setting this to 0 is not recommended and may ruin your hardware!
- MAXTEMP: The temperature (°C) at which to spin the fan at its MAXIMUM speed. This should be probably be set to perhaps 10 or 20 degrees (°C) below your CPU's critical/shutdown temperature. Setting it closer to MINTEMP will result in higher fan speeds overall.
- MINSTOP: The PWM value at which your fan stops spinning. Each fan is a little different. Power tweakers can
echo
different values (between 0 and 255) to/sys/class/hwmon/hwmon0/device/pwm1
and then watch the CPU fan. When the CPU fan stops, use this value. - MINSTART: The PWM value at which your fan starts to spin again. This is often a higher value than MINSTOP as more voltage is required to overcome inertia.
There are also two settings fancontrol needs to verify the configuration file is still up to date. The lines start with the setting name and a equality sign, followed by groups of hwmon-class-device=setting, seperated by spaces. You need to specify each setting for each hwmon class device you use anywhere in the config, or fancontrol will not work.
- DEVPATH: Sets the physical device. You can determine this by executing the command
readlink -f /sys/class/hwmon/<hwmon-device>/device | sed -e 's/^\/sys\///'
- DEVNAME: Sets the name of the device. Try
cat /sys/class/hwmon/<hwmon-device>/device/name | sed -e 's/[[:space:]=]/_/g'
man fancontrol
for details.fancontrol
Try to run fancontrol:
# /usr/bin/fancontrol
A properly configured setup will not error out and will take control of system fans. Users should hear system fans slowing shortly after executing this command.
To make fancontrol start automatically on every boot as a service run:
# systemctl enable fancontrol # systemctl start fancontrol