Fan speed control
Fan control can bring various benefits to your system, such as quieter working system and power saving by completely stopping fans on low CPU load.
Contents
Overview
There are multiple working solutions for fan control for both desktops and notebooks. Depending on your needs:
- Fancontrol (lm-sensors) - Script (written in Bash) to configure fan speeds. Most suitable for desktops and laptops, where fan controls are available via sysfs.
- NoteBook Fan Control (NBFC) - Cross-platform solution for laptop fan control, written in C# and works under Mono runtime. Most suitable for latest, unsupported by Fancontrol laptops.
- Dell laptops - Alternative fan control daemon for some Dell laptops.
- ThinkPad laptops - Fan configuration for some ThinkPad laptops.
- Asus laptops - Configure some Asus laptops for Fancontrol or manual control.
Fancontrol (lm-sensors)
fancontrol
is a part of lm_sensors, which can be used to control the speed of CPU/case fans.
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.
lm-sensors
The first thing to do is to run
# sensors-detect
This will detect all of the sensors present and they will be used for fancontrol. After that, run the following to check if it detected the sensors correctly:
$ 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
Configuration
Once the sensors are properly configured, use pwmconfig
to test and configure fan speed control. Following the guide should create /etc/fancontrol a customized configuration file. In the guide, the default answers are in parenthesis if you press enter without typing anything. Enter "y" for yes, "n" for no.
# pwmconfig
Tweaking
Some users may want to manually tweak the config file after running pwmconfig, usually to fix something. For manually tweaking the /etc/fancontrol configuration file, check the man page for fancontrol for the definitions of the variables:
$ man fancontrol
Users will probably encounter the hwmon path issues as noted above in #Fancontrol (lm-sensors). Look at #Device Paths have Changed in /etc/fancontrol for more information.
MAXPWM
and MINPWM
options that limit fan speed range. See fancontrol manual page for details.becomes hwmon0/temp1_input) usually happens on a kernel update as well. Check the system log to find out which is the troublemaker:
# systemctl status fancontrol.serviceand correct your config file accordingly.
Running Fancontrol
Try to run fancontrol:
# fancontrol
A properly configured setup will not output errors and will take control of the system fans. Users should hear system fans starting shortly after executing this command.
To enable starting fancontrol automatically on every boot, enable fancontrol.service
:
# systemctl enable fancontrol.service
To start it in the background, run
# systemctl start fancontrol.service
For an unofficial GUI install fancontrol-guiAUR or fancontrol-kcmAUR.
NBFC
NBFC is a cross-platform fan control solution for notebooks. It comes with a powerful configuration system, which allows to adjust it to many different notebook models, including some of the latest ones.
Installation
NBFC can be installed as nbfcAUR or nbfc-gitAUR. Also start and enable nbfc.service
.
Configuration
NBFC comes with pre-made profiles. You can find them in /opt/nbfc/Configs/
directory. When applying them, use exact profile name without extension (e.g. some profile.xml
becomes "some profile"
).
Check if there is anything NBFC can recommend:
$ nbfc config -r
If there is at least one model, try to apply this profile and see how fan speeds are being handled. For example:
$ nbfc config -a "Asus Zenbook UX430UA"
File Descriptor does not support writing
, delete StagWare.Plugins.ECSysLinux.dll
[1] and restart nbfc.service
:
# mv /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll /opt/nbfc/Plugins/StagWare.Plugins.ECSysLinux.dll.old
If above solution did not help, try appending ec_sys.write_support=1
to kernel parameters.
If there are no recommended models, go to NBFC git repository or /opt/nbfc/Configs/
and check if there are any similar models available from the same manufacturer. For example, on Asus Zenbook UX430UQ, the configuration Asus Zenbook UX430UA did not work well (fans completelly stopped all the time), but Asus Zenbook UX410UQ worked fantastically.
Run nbfc
to see all options. More information about configuration is available at upstream wiki.
Dell laptops
i8kutils
is a daemon to configure fan speed according to CPU temperatures on some Dell Inspiron and Latitude laptops. It uses the /proc/i8k
interface provided by the dell_smm_hwmon
driver (formerly i8k
). Results will vary depending on the exact model of laptop.
Installation
i8kutilsAUR is the main package to control fan speed. Additionally, you might want to install these:
- acpi - must be installed to use
i8kmon
. - tcl - must be installed in order to run
i8kmon
as a background service (using the--daemon
option). - tk - must be installed together with tcl to run as X11 desktop applet.
- dell-bios-fan-control-gitAUR - recommended if your BIOS overrides fan control
Configuration
By default, i8kmon
only monitors the CPU temperature and fan speed passively. To enable its fan speed control, either run it with the --auto
option or enable the option permanently in /etc/i8kutils/i8kmon.conf
:
set config(auto) 1
The temperature points at which the fan changes speed can be adjusted in the same configuration file. Only three fans speeds are supported (high, low, and off). Look for a section similar to the following:
set config(0) {{0 0} -1 55 -1 55} set config(1) {{1 1} 45 75 45 75} set config(2) {{2 2} 65 128 65 128}
This example starts the fan at low speed when the CPU temperature reaches 55 °C, switching to high speed at 75 °C. The fan will switch back to low speed once the temperature drops to 65 °C, and turns off completely at 45 °C.
Installation as a service
i8kmon
can be started automatically as a systemd service:
# systemctl enable i8kmon # systemctl start i8kmon
BIOS overriding fan control
Some newer laptops have BIOS fan control in place which will override the OS level fan control. To test if this the case, run i8kmon
with verbose mode in a command line, make sure the CPU is idle, then see if the fan is turned off or turned down accordingly.
If the BIOS fan control is in place, you can try using dell-bios-fan-control-gitAUR:
To enable BIOS fan control:
# dell-bios-fan-control 1
To disable BIOS fan control:
# dell-bios-fan-control 0
To automatically disable BIOS fan control via systemd:
# systemctl enable dell-bios-fan-control # systemctl start dell-bios-fan-control
ThinkPad laptops
The embedded controller (EC) regulates fan speed. However, in order to take control over it, add fan_control=1
to your kernel parameters.
Current fan control daemons available in the AUR are simpfand-gitAUR and thinkfanAUR (recommended).
Installation
Install thinkfanAUR or thinkfan-gitAUR. Optionally, but recommended, install lm_sensors. Then have a look at the files:
# pacman -Ql thinkfan
Note that the thinkfan package installs /usr/lib/modprobe.d/thinkpad_acpi.conf
, which contains
options thinkpad_acpi fan_control=1
So fan control is enabled by default. Alternatively, you can enable fan control as follows:
$ echo "options thinkpad_acpi fan_control=1" > /etc/modprobe.d/thinkfan.conf
Now, load the module:
$ su # modprobe thinkpad_acpi # cat /proc/acpi/ibm/fan
You should see that the fan level is "auto" by default, but you can echo a level command to the same file to control the fan speed manually. The thinkfan daemon will do this automatically.
Set thinkfan to run at startup by editing /etc/default/thinkfan
and adding the following line:
START=yes
Finally, enable the thinkfan systemd service:
$ systemctl enable thinkfan
To configure the temperature thresholds, you will need to copy one of the example config files (e.g. /usr/share/doc/thinkfan/examples/thinkfan.conf.simple
) to /etc/thinkfan.conf
, and modify to taste. This file specifies which sensors to read, and which interface to use to control the fan. Some systems have /proc/acpi/ibm/fan
and /proc/acpi/ibm/thermal
available; on others, you will need to specify something like:
hwmon /sys/devices/virtual/thermal/thermal_zone0/temp
to use generic hwmon sensors instead of thinkpad-specific ones.
Running
You can test your configuration first by running thinkfan manually (as root):
# thinkfan -n
and see how it reacts to the load level of whatever other programs you have running.
When you have it configured correctly, start/enable thinkfan.service
.
Asus laptops
This topic will cover drivers configuration on Asus laptops for Fancontrol (lm-sensors).
Kernel modules
In configuration files, we are going to use full paths to sysfs files (e.g. /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1
). This is because hwmon1 might change to any other number after reboot. Fancontrol (lm-sensors) is written in Bash, so using these paths in configuration file is completely acceptable. You can find complete /etc/fancontrol
configuration file examples at ASUS N550JV#Fan control.
asus-nb-wmi
asus-nb-wmi is a kernel module, which is included in the Linux kernel and is loaded automatically on Asus laptops. It will only allow to control a single fan and if there is a second fan you will not have any controls over it. Note that blacklisting this module will prevent keyboard backlight to work.
Below are the commands to control it. Check if you have any controls over your fan:
# echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Full fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Fan is stopped (Value: 0) # echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[[:print:]]*/pwm1_enable # Change fan mode to automatic # echo 1 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable # Change fan mode to manual
If you were able to modify fan speed with above commands, then continue with #Generate config file with pmwconfig.
asus_fan
asus_fan is a kernel module, which allows to control both fans on some older Asus laptops. It does not work with the most recent models.
Install the DKMS asus-fan-dkms-gitAUR kernel module, providing asus_fan
:
# modprobe asus_fan
Check if you have any control over both fans:
# echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # Full CPU fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1 # CPU fan is stopped (Value: 0) # echo 255 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2 # Full GFX fan speed (Value: 255) # echo 0 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2 # GFX fan is stopped (Value: 0) # echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable # Change CPU fan mode to automatic # echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm1_enable # Change CPU fan mode to manual # echo 2 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable # Change GFX fan mode to automatic # echo 1 > /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/pwm2_enable # Change GFX fan mode to manual # cat /sys/devices/platform/asus_fan/hwmon/hwmon[[:print:]]*/temp1_input # Display GFX temperature (will always be 0 when GFX is disabled/unused)
If everything works, you might want to load this kernel module on boot:
/etc/modules-load.d/asus_fan.conf
asus_fan
Continue with #Generate config file with pmwconfig.
Generate config file with pmwconfig
If you get an error There are no working fan sensors, all readings are 0
while generating config file with pwmconfig
, open first console and execute:
# watch -n 1 "echo 2 > /sys/devices/platform/<kernel_module>/hwmon/hwmon[[:print:]]*/pwm1_enable"
If you use asus_fan
kernel module and have 2nd fan, in second console:
# watch -n 1 "echo 2 > /sys/devices/platform/<kernel_module>/hwmon/hwmon[[:print:]]*/pwm2_enable"
And finally, in the third console:
# pwmconfig
Once you are done and the configuration file is generated, you should stop the first and second consoles. Continue with Fancontrol (lm-sensors). After config file is generated, you might need to manually replace PWM values with full sysfs paths as they are used in these steps, because hwmon number values might change after reboot.
AMDGPU sysfs fan control
AMDGPU kernel driver offers fan control for graphics cards via hwmon in sysfs.
Configuration of manual control
To switch to manual fan control from automatic, run
# echo "1" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable
Set up fan speed to e.g. 50% (100% are 255 PWM cycles, thus calculate desired fan speed percentage by multiplying its value by 2.55):
# echo "128" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1
To reset to automatic fan control, run
# echo "2" > /sys/class/drm/card0/device/hwmon/hwmon0/pwm1_enable
amdgpu-fan
The amdgpu-fanAUR package is an automated fan controller for AMDGPU-enabled video cards written in Python. It uses a "speed-matrix" to match the frequency of the fans with the temperature of the GPU, for example:
speed_matrix: # -[temp(*C), speed(0-100%)] - [0, 0] - [40, 30] - [60, 50] - [80, 100]
Once the package can be installed, it can be run as a service, so you can either run it for the current session:
# systemctl start amdgpu-fan.service
or executed at boot
# systemctl enable amdgpu-fan.service
fancurve script
Not just fan controls are offered via hwmon in sysfs, but also GPU temperature reading:
cat /sys/class/drm/card0/device/hwmon/hwmon0/temp1_input
This outputs GPU temperature in °C + three zeroes, e.g. 33000
for 33°C.
The bash script amdgpu-fancontrol by grmat offers a fully automatic fan control by using the described sysfs hwmon functionality. It also allows to comfortably adjust the fancurve's temperature/PWM cycles assignments and a hysteresis by offering abstracted configuration fields at the top of the script.
For safety reasons, the script sets fan control again to auto when shutting down. This may cause spinning up of fans, which can be worked around at cost of security by setting set_fanmode 1
in the section function reset_on_fail
.
Setting up fancurve script
To start the script, it is recommend to do so via systemd init system. This way the script's verbose output can be read via journalctl/systemctl status. For this purpose, a .service configuration file is already included in the GitHub repository.
It may also be required to restart the script via a root-resume.service after hibernation in order to make it automatically function properly again:
/etc/systemd/system/root-resume.service
[Unit] Description=Local system resume actions After=suspend.target [Service] Type=simple ExecStart=/usr/bin/systemctl restart amdgpu-fancontrol.service [Install] WantedBy=suspend.target
Troubleshooting
Increase the fan divisor for sensors
If sensors does not output the CPU fan RPM, it may be necessary to change the fan divisor.
The first line of the sensors output is the chipset used by the motherboard for readings of temperatures and voltages.
Create a file in /etc/sensors.d/
:
/etc/sensors.d/fan-speed-control.conf
chip "coretemp-isa-*" set fanX_div 4
Replacing coretemp-isa- with name of the chipset and X with the number of the CPU fan to change.
Save the file, and run as root:
# sensors -s
which will reload the configuration files.
Run sensors
again, and check if there is an RPM readout. If not, increase the divisor to 8, 16, or 32. YMMV!