fancontrol - automated software based fan speed regulation
fancontrol is a shell script for use with lm_sensors. It reads its
configuration from a file, then calculates fan speeds from temperatures
and sets the corresponding PWM outputs to the computed values.
Please be careful when using the fan control features of your
mainboard, in addition to the risk of burning your CPU, at higher
temperatures there will be a higher wearout of your other hardware
components, too. So if you plan to use these components in 50 years,
maybe you shouldn’t use fancontrol at all. Also please keep in mind
most fans aren’t designed to be powered by a PWMed voltage.
In practice it doesn’t seem to be a major issue, the fans will get
slightly warmer, just be sure to have a temperature alarm and/or
shutdown call, in case some fan fails, because you probably won’t hear
it anymore ;)
For easy configuration, there’s a script named pwmconfig(8) which lets
you interactively write your configuration file for fancontrol.
Alternatively you can write this file yourself using the information
from this manpage.
Since most of you are going to use pwmconfig(8) script, the config file
syntax will be discussed last. First I’m going to describe the various
variables available for changing fancontrol’s behaviour:
This variable defines at which interval in seconds the main loop
of fancontrol will be executed
Maps hwmon class devices to physical devices. This lets
fancontrol check that the configuration file is still up-to-
Records hwmon class device names. This lets fancontrol check
that the configuration file is still up-to-date.
Maps PWM outputs to temperature sensors so fancontrol knows
which temperature sensors should be used for calculation of new
values for the corresponding PWM outputs.
FCFANS Records the association between a PWM output and a fan input.
Then fancontrol can check the fan speed and restart it if it
The temperature below which the fan gets switched to minimum
The temperature over which the fan gets switched to maximum
Sets the minimum speed at which the fan begins spinning. You
should use a safe value to be sure it works, even when the fan
The minimum speed at which the fan still spins. Use a safe value
MINPWM The PWM value to use when the temperature is below MINTEMP.
Typically, this will be either 0 if it is OK for the fan to
plain stop, or the same value as MINSTOP if you don’t want the
fan to ever stop. If this value isn’t defined, it defaults to 0
MAXPWM The PWM value to use when the temperature is over MAXTEMP. If
this value isn’t defined, it defaults to 255 (full speed).
The configuration file format is a bit strange:
Each variable has its own line. The variable name is followed by an
equal sign and the device=value pairs. These consist of the path to the
pwm output for which the value is valid, equal sign followed by the
value and are separated by a blank. Path can be absolute or relative
(from /sys/bus/i2c/devices or /sys/class/hwmon depending on the kernel
You have to play with the temperature values a bit to get happy. For
initial setup I recommend using the pwmconfig script. Small changes can
be made by editing the config file directly following the rules above.
Upon starting, fancontrol will make sure that all referenced devices do
exist and match what they were at configuration time, and that all
referenced sysfs files do exist. If not, it will quit immediately, upon
the assumption that the configuration file may be out-of-sync with the
loaded kernel drivers.
fancontrol first reads its configuration, writes it to arrays and loops
its main function. This function gets the temperatures and fanspeeds
from kernel driver files and calculates new speeds depending on
temperature changes, but only if the temp is between MINTEMP and
MAXTEMP. After that, the new values are written to the PWM outputs.
Currently the speed increases quadratically with rising temperature.
This way you won’t hear your fans most of the time at best.
Marius Reiner <firstname.lastname@example.org>