ArchLabs Linux

Fan Control on Lenovo Ideapad G50-45 laptop

Hello, thank you for reading me.

(I am not an english-born locutor so apologize for any language mistake)

I installed AL/OB on a 2016 Lenovo Ideapad G50-45 laptop.
Most of things seem to work fine however I feel like the fan regularly shows overheaded activity -which is kind of a noise nuisance- as it seems to me that it starts without any real need (cpu activity mostly showing less than 10 %). It might be related to graphic card activity but i doubt since the fan starts without special new task opened at graphic concern.

I previously installed on a older/weaker laptop another arch-based distribution (manjaro-Xfce) with similar hardware (amd/ati) and never experienced such an issue with fan activity which most of time remained silent.

Here are a few outputs that may help kind people providing me with useful troubleshooting :

thierry@Lenovo-G50-45 ~ % sensors #at a moment when fan shows apparently excess-activity
Adapter: PCI adapter
temp1:        +39.0°C  (crit = +120.0°C, hyst = +90.0°C)

Adapter: PCI adapter
temp1:        +39.5°C  (high = +70.0°C)
                       (crit = +105.0°C, hyst = +104.0°C)

Adapter: PCI adapter
power1:       10.27 W  (interval =   0.01 s, crit =  14.98 W)

And general system info (still when fan shows-off) :

    thierry@Lenovo-G50-45 ~ % inxi -Fxxx
    System:    Host: Lenovo-G50-45 Kernel: 4.16.8-1-ARCH x86_64 bits: 64 compiler: gcc 
               v: 8.1.0 Desktop: Xfce 4 wm: Openbox dm: lightdm 1.26.0 Distro: Arch Linux 
    Machine:   Type: Laptop System: LENOVO product: 80E3 v: Lenovo G50-45 
               serial: <root required> Chassis: type: 10 v: Lenovo G50-45 
               serial: <root required> 
               Mobo: LENOVO model: Lancer 5B2 serial: <root required> UEFI [Legacy]: LENOVO 
               v: A2CN44WW(V2.12) date: 01/18/2016 
    Battery:   ID-1: BAT1 charge: 32.4 Wh condition: 32.4/31.7 Wh (102%) volts: 16.6/14.4 
               model: LENOVO PABAS0241231 type: Li-ion serial: 41167 status: Full 
    CPU:       Topology: Quad Core model: AMD A6-6310 APU with AMD Radeon R4 Graphics 
               bits: 64 type: MCP arch: Puma rev: 1 L2 cache: 2048 KiB 
               flags: lm nx pae sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 svm bogomips: 14379 
               Speed: 998 MHz min/max: 1000/1800 MHz Core speeds (MHz): 1: 998 2: 998 3: 1020 
               4: 998 
    Graphics:  Card-1: AMD Mullins [Radeon R4/R5 Graphics] driver: radeon v: kernel 
               bus ID: 00:01.0 chip ID: 1002:9851 
               Display: x11 server: X.Org 1.19.6 driver: ati,radeon 
               unloaded: fbdev,modesetting,vesa compositor: compton resolution: 1366x768~60Hz 
               Message: Unable to show advanced data. Required tool glxinfo missing. 
    Audio:     Card-1: AMD Kabini HDMI/DP Audio driver: snd_hda_intel v: kernel 
               bus ID: 00:01.1 chip ID: 1002:9840 
               Card-2: AMD FCH Azalia driver: snd_hda_intel v: kernel bus ID: 00:14.2 
               chip ID: 1022:780d 
               Sound Server: ALSA v: k4.16.8-1-ARCH 
    Network:   Card-1: Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter 
               driver: ath9k v: kernel bus ID: 01:00.0 chip ID: 168c:0036 
               IF: wlp1s0 state: up mac: X
               Card-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
               v: 2.3LK-NAPI port: 2000 bus ID: 02:00.0 chip ID: 10ec:8168 
               IF: enp2s0 state: down mac: X
               Card-3: Qualcomm Atheros AR3012 Bluetooth 4.0 type: USB driver: btusb 
               bus ID: 2:4 chip ID: 0cf3:3004 
    Drives:    HDD Total Size: 223.57 GiB used: 6.22 GiB (2.8%) 
               ID-1: /dev/sda vendor: SanDisk model: SDSSDA240G size: 223.57 GiB 
               serial: 164217447904 rev: 80RL scheme: MBR 
    Partition: ID-1: / size: 194.86 GiB used: 6.22 GiB (3.2%) fs: ext4 dev: /dev/sda1 
    Sensors:   System Temperatures: cpu: 38.6 C mobo: N/A gpu: radeon temp: 39 C 
               Fan Speeds (RPM): N/A 
    Info:      Processes: 147 Uptime: 49m Memory: 10.71 GiB used: 1009.2 MiB (9.2%) 
               Init: systemd v: 238 target: Compilers: gcc: 8.1.0 Shell: zsh 
               v: 5.5.1 running in: termite inxi: 3.0.09

(any other information available on request)

I had a look at several fan control related topics on Linux an especially Arch but most of them merely appear far too risky for my linux knowledge (eg. those mentionned here ).

May my fan issue come from the uninstalled acpi-related package on AL ?

Thank you for your help.

Hello @thierry nice to meet you.

Sorry to hear the issue, there isn’t too many active process started by us, we try to keep the system light on resources. That being said you could try using a different panel like tint2 or reducing the frequency the polybar is redrawn by editing the config.

Also try removing opensnap if it’s installed

pacman -Rs archlabs-opensnap

Another request, can you paste the output of the following command?

cat "$HOME/.config/ob-autostart/config"

I would also check your BIOS and see if there is a fan setting in there, I doubt, my laptop does not have one.

I don’t think 30-40 C is overly hot for a CPU though, I can totally understand not wanting to hear your fan spinning up all the time though.

Give me a bit to look around and try some stuff and get back to you, in the meantime you should try editing the polybar settings to make it use less CPU time. You’ll need to edit a few seperate files and change sleep or time intervals

First up, ~/bin/check-network

while true; do
    if ping -c1 &>/dev/null; then
        ID=$(ip link | awk '/state UP/ {print $2}')
        if [[ $ID == e* ]]; then
            echo "$ethernet_connected"

            sleep 10   # try increasing this
            echo "$wireless_connected"

            sleep 10    # this
        echo "$disconnected"

        sleep 0.6   # this

        echo "$disconnected2"

        sleep 0.6  # and lastly this

The rest will be very much the same, next up ~/bin/

    while [[ $updates -gt 0 ]]; do
        if [[ $updates -eq 1 ]]; then
            echo "$updates Update"
        elif [[ $updates -gt 1 ]]; then
            echo "$updates Updates"
        sleep 8    # delay when updates are available, how often to recheck
        updates=$(checkupdates | wc -l)

    while [[ $updates -eq 0 ]]; do
        echo $BAR_ICON
        sleep 1600  # this is the delay to wait when system is up to date.. 26 min 
        updates=$(checkupdates | wc -l)

hi thierry,
you could start to have a look here

I also suggest you install this:
tool glxinfo missing.
please posted response this command
glxinfo | grep “direct rendering”

Hello @nate and thank you for replying me.

Here is what I did according to your advice :
First removed archlabs-opensnap as you said,
Next changed $HOME/bin/check-network : increased sleep values from 10 to 50 and from 0.6 to 6.
Then logged-out and re-logged-in.
Alas it doesn’t seem to make any change as far as fan activity is concerned, still showing-off from time to time with no need seemingly…

BIOS settings are really frugal as on most laptops and doesn’t show any fan setting item.

May this this part of the sensors command output be involved ?

Adapter: PCI adapter
power1:       19.10 W  (interval =   0.01 s, crit =  14.98 W)

? (I don’t know what this really means nor if it’s fan-running related).

Otherwise I don’t think my fan activity is related to system’s charge but may result from a default configuration somewhere in an hardware chip, or something like that because I think Manjaro is heavier on system’s charge than default AL/OB and though as I previously said, I never experienced such fan activity with it.

Due to my wide ignorance in IT matters I cannot evaluate what is worth the following pieces of advice fan-controlling related : (extracted from here )

A couple of other things you could try are

1- At the grub menu press e and navigate to the line with splash (or nosplash) and insert pcie_aspm=force and i915.i915_enable_rc6=1
If it works as expected and no system instability occurs (there’s only a small risk) then make these changes permanent by adding them to the GRUB_CMDLINE_LINUX variable /etc/default/grub

2- add acpi_osi=“Linux” to the GRUB_CMDLINE_LINUX variable /etc/default/grub

Do you think it may apply to my problem ?

I wouldnt mind using one of the fan-control utilities available in AUR (amdoverdrivectrl , fanicontrol , or others as descripted here ) but it seemed far too tricky for me and I fear to break the hardware and be unable to restore it. However I wouldn’t mind if someone may help me in this respect.

Or else I had the thought that maybe the lack of any of the acpi packages on AL may result in my fan problem, can someone tell me ?

Thank you for your support.


I do not understand why you do not want to follow the arch linux wiki on thinkpad, since archlabs is based on archlinux!
And you have to install only one program and enable it, but do not disable it and remove the package, repeat active glx, the cpu and gpu can also heat up for that

Hello @ector and thank you for helping me.

I first posted a reply to your previous post but it has been deleted as I rebooted for activating fan_control at boot in Grub.

First here is the output you requested :

root@Lenovo-G50-45 /home/thierry # glxinfo|grep 'direct rendering'                      
direct rendering: Yes

[to be continued after further enquiries on Thinkpads_laptops]

[continued from previous post @ector ]
After having struggled with the arch wiki about thinkpad_acpi and been through heaving puzzling questions about provided documentation, I fear I cannot achieve thinkpad_acpi and thinkfan configuration by myself even with all the docs provided.

Here is the output of /usr/share/doc/thinkfan/README :

 * thinkfan version 0.9 -- copyleft 01-2013, Victor Mataré
 * thinkfan is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * thinkfan is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with thinkfan.  If not, see <>.

Thinkfan is a simple, lightweight fan control program. Originally designed
specifically for IBM/Lenovo Thinkpads, it now supports any kind of system via
the sysfs hwmon interface (/sys/class/hwmon). It is designed to eat as little
CPU power as possible.

Contents of this file


(1) How it works

(2) Install and configure
(2.1)  Build
(2.2a) Configure hardware interface (IBM/Lenovo Thinkpads)
(2.2b) Configure hardware interface (any system)
(2.3)  Configure fan behaviour
(2.4)  Test and install

(3) Usage
(3.1)  Invocation
(3.2)  Temperature biasing (the -b option)
(3.3)  Pulsing-fan workaround
(3.4)  Signals

(4) Contact/Bugs

(0) WARNING!!!!

There's only very basic sanity checking on the configuration (semantic
plausibility). You can set the temperature limits as insane as you like.

Any change to fan behaviour that results in higher temperatures in some parts
of the system will shorten your system's lifetime and/or cause weird hardware
bugs that'll make you pull out your hair.

   No warranties whatsoever.

If this program steals your car, kills your horse, smokes your dope or pees
on your carpet...
 - too bad, you're on your own.

(1) How it works

Thinkfan can read temperatures from /proc/acpi/ibm/thermal, from temp*_input
files in /sys/class/hwmon, or directly from hard disks via S.M.A.R.T.  Your
fan speed is set according to predefined temperature limits that are specified
in the config file. There are two modes of operation:

(1.1) Simple Mode
In simple mode, thinkfan uses only the highest temperature it can find. This
was the only choice in versions before 0.8. However, it's potentially
dangerous for devices with a low temperature rating like hard drives. For
these devices, you should specify a correction value that's added to the
actual temperature.

(1.2) Complex Mode
In complex mode, temperature limits are defined for each sensor individually.
If *at least one* upper limit is reached we switch to the next fan level, and
if *all* lower limits are reached, we switch to the previous level.
This is a new feature in 0.8. It allows very fine-grained control and is the
preferred way of using thinkfan. However it may require a bit of tweaking and
experimentation to get a suitable config for your system.

(2) How to install

(2.1) Build
You can use ccmake to choose build options interactively:

 ccmake .

Or set your build options from the command line. E.g. to configure a debug
build with support for libatasmart:


Use CMAKE_BUILD_TYPE:STRING="" to get an optimized build without debug
symbols. This is the default.
To compile simply run:

 cmake --build .

CMake should also provide you with a "make install" target, which defaults to
a /usr/local prefix.

(2.2) Configure
The default config file location is /etc/thinkfan.conf. You should start with
one of the supplied example configs and tweak from there. There are three
possible temperature sources, which can also be combined (since 0.9). Take
note of the order in which you listed your sensors, since that is the way they
are matched against your temperature limits.

a) /proc/acpi/ibm/ (default)
   Most IBM/Lenovo Thinkpads and some other Lenovo models support this. You
   need the thinkpad_acpi kernel driver (see 2.2a).

b) /sys/class/hwmon/
   This is a generic interface which is not hardware-specific. You need an
   hwmon-driver for your system that allows reading temperatures and
   controlling the fan from userspace. (see 2.2b)

c) S.M.A.R.T
   Thinkfan uses libatasmart to read the temperature directly from hard disks.
   Just include a line saying
   atasmart /dev/sda
   And thinkfan will read the temperature directly from /dev/sda.

(2.2a) Configure hardware interface (/proc/acpi/ibm)
First, you need to load the thinkpad_acpi module with fan_control=1:
# modprobe thinkpad_acpi fan_control=1
See your distribution documentation for how to load modules at bootup with
custom options.

Then you might want to check out which fan levels your fan controller
supports by doing something like this:

 for i in 0 1 2 3 4 5 6 7; do
    echo "level $i" > /proc/acpi/ibm/fan
    echo "level $i..."
    sleep 6
    cat /proc/acpi/ibm/fan | egrep "^speed"
 echo "level auto" > /proc/acpi/ibm/fan

Now you have to choose whether you want to use complex or simple temperature
limits. I recommend using complex limits, since that gives you more control.
Whatever you choose, you should have two lines saying

 tp_thermal /proc/acpi/ibm/thermal
 tp_fan /proc/acpi/ibm/fan

in your config. /proc/acpi/ibm/thermal provides 8 or 16 temperatures, so if
you use complex temperature limits, your limits need have that same length.

(2.2b) Configure hardware interface (any system)
On all systems other than IBM/Lenovo Thinkpads, you need to provide thinkfan
with the path(s) of all sysfs temperature sensor files you want to use. You
may find them by doing something like this:

 find -L /sys/class/hwmon -maxdepth 5 -name "temp*_input" \
       -print -exec cat \{\} \; 2>/dev/null

Now put all file names into the config file that give you a sensible
temperature reading, each one on a separate "sensor" line. Example:
sensor /sys/class/hwmon/hwmon3/device/temp10_input

Next you need to find the PWM control file of your fan:

 find -L /sys/class/hwmon -maxdepth 3 -name "pwm?" \
       -print -exec cat \{\} \; 2>/dev/null

At the moment, thinkfan can control only one fan. Support for multiple fans
may be added in a later release. Put your PWM control file on a "fan" line
like so:
pwm_fan /sys/class/hwmon/hwmon3/device/pwm1

You'll want to try out the behaviour of your PWM controller by echo'ing some
numbers from 0 to 255 to your PWM file and then checking the fan RPM in

ATTENTION: Most hwmon drivers seem to disable userspace fan control after
suspend/resume. That means you'll have to send a SIGHUP to thinkfan after
resuming to make it restore userspace fan control. Check your distribution
documentation to find out how you can do a "pkill -HUP thinkfan" after
By default, thinkfan re-initializes the PWM control *every time* a fan speed
is set. This is safe, but stupid. So if you want to do it properly, go the
SIGHUP way and use the -z option (see below).

(2.3) Configure fan behaviour
Carefully edit the fan-config tuples to your needs. Note that for the sysfs
hwmon-interface, the fan level is a number from 0 to 255, while in the
IBM-Interface, it's a number from 0 to 7. You also have the option of using
strings like "level 0", "level auto" or "level disengaged" (WITH the
quotation marks). In DANGEROUS mode, you can even use arbitrary (unknown)
garbage as fan level.

The temperature limits for different fan levels should overlap, so that once
the fan is on, it keeps running for a while.

If using simple temperature limits, you should specify a correction value for
the temperature of your harddisk, because it's much more sensitive to high
temperatures than your CPU. If using /proc/acpi/ibm/thermal, take a look at .
If you're using sysfs to read temperatures, you'll have to find out about the
meaning of your sensors on your own. A good starting point could be the
documentation of your hwmon driver.  Once you know which sensor belongs to
your harddrive, you should specify a correction value for it. For a sysfs
sensor, this would look like

 sensor /path/to/harddisk's/temp_input (15)

This will add 15°C to the temperature read from your harddisk and thus keep
it from heating up to the upper limit of your first fan level. In
/proc/acpi/ibm/thermal, the harddisk might be at the 3rd position:

 sensor /proc/acpi/ibm/thermal (0, 0, 15)

As this is just a quick-shot solution for the problem with overheating hard
disks, I really recommend using complex temperature limits. Go take a look at
thinkfan.conf.complex to learn about the syntax.

(2.4) Test and install
Run ./thinkfan -n -c PATH_TO_CONFIG and watch it do its job. Try putting some
load on your system with glxgears or running some infinite loop in bash.  If
everything works nicely, forget about it for a while to make sure it's
Once you're confident that it works well for you, you may want to copy it to
/usr/local/sbin or whatever you like and run it without -n.


(3.1) Invocation
Usage: thinkfan [-hnqzD] [-b BIAS ] [-c FILE] [-s SEC] [-p[SEC]]
-h       This help message
-s SEC   Maximum seconds between temperature updates (default: 5)
-b BIAS  Floating point number (0 ~ 20) to control rising edge
         temperature biasing strength (see below). Default 5.0
-c FILE  Load different configuration file (default: /etc/thinkfan.conf)
-n       Do not become a daemon and log to terminal instead of syslog
-q       Be quiet (no status info on terminal)
-z       Assume we don't have to worry about resuming when using the sysfs
         interface. Saves CPU load.
-p[SEC]  Use the pulsing-fan workaround (for older Thinkpads). Takes an
         optional floating-point argument (0 ~ 10s) as depulsing duration.
         Defaults to 0.5s. See (3.3).
-D       DANGEROUS mode: No sanity checks on config! May damage your

(3.2) Rising Temperature Exaggeration (the -b option)
Thinkfan takes special measures to deal with temperatures rising very
suddenly (like when you turn on the computer and instantly run some
CPU/GPU-intensive app).

You can provide a floating point number between 0 and 20 to adjust the amount
of exaggeration. If the highest known temperature jumps up 2 °C or more, the
exaggeration is calculated to:
exaggeration = (sleeptime * (delta_t - 1)) * (0.1 * BIAS)
(BIAS is the value provided on the commandline)
This value is then added to the current highest temperature and the fan speed
decision is based on that.

Ex: If we slept for 5 seconds during the last cycle, provided a BIAS of 10
on the commandline, and the temperature increased by 3 °C, we get a bias of:
5*2*0.1*10 = 10 °C
That's pretty nervous. If you want to turn off biasing entirely, run
thinkfan with -b 0.

In addition to exaggerating the temperature reading, the sleep time is
reduced to 2 seconds, and then slowly increased back up to the specified

(3.3) Pulsing-fan workaround (the -p option)
Specifying this option activates the pulsing-fan workaround. It works by
setting the fan controller to "disengaged" mode for a short amount of time on
every cycle (check the -s option). The optional argument of the -p option is
the duration for which the fan is kept in "disengaged" mode (defaults to 0.5
seconds). Note that the time spent in "disengaged" mode adds to the cycle
time, so with the -p option, the default sleep time is actually 5.5 seconds.

(3.4) Signals
Send a SIGHUP to make thinkfan reload its config file and reinitialize fan

 kill -HUP $(</var/run/

SIGINT and SIGTERM are caught to make for a clean exit.

SIGUSR1 will cause thinkfan to dump all currently known temperatures, either
to syslog, or to the console.


If you have questions or a bug report, please try the help forum at

In addition here my lsmod output (which doesn’t seem to show any acpi modules although I typed the # modprobe thinkpad_acpi command) :

root@Lenovo-G50-45 /home/thierry # lsmod
Module                  Size  Used by
fuse                  118784  3
amdgpu               3158016  0
chash                  16384  1 amdgpu
gpu_sched              28672  1 amdgpu
ccm                    20480  9
joydev                 24576  0
mousedev               24576  0
bnep                   24576  2
arc4                   16384  2
ath9k                 184320  0
radeon               1654784  5
ath9k_common           36864  1 ath9k
ath9k_hw              512000  2 ath9k,ath9k_common
ath                    36864  3 ath9k_hw,ath9k,ath9k_common
mac80211              905216  2 ath9k_hw,ath9k
edac_mce_amd           28672  0
i2c_algo_bit           16384  2 amdgpu,radeon
ttm                   122880  2 amdgpu,radeon
kvm                   708608  0
drm_kms_helper        200704  2 amdgpu,radeon
irqbypass              16384  1 kvm
snd_hda_codec_conexant    24576  1
snd_hda_codec_generic    86016  1 snd_hda_codec_conexant
uvcvideo              114688  0
snd_hda_codec_hdmi     57344  1
crct10dif_pclmul       16384  0
ath3k                  20480  0
videobuf2_vmalloc      16384  1 uvcvideo
snd_hda_intel          45056  4
crc32_pclmul           16384  0
videobuf2_memops       16384  1 videobuf2_vmalloc
drm                   466944  9 amdgpu,radeon,gpu_sched,ttm,drm_kms_helper
cfg80211              741376  4 mac80211,ath9k,ath,ath9k_common
videobuf2_v4l2         28672  1 uvcvideo
ghash_clmulni_intel    16384  0
videobuf2_common       53248  2 uvcvideo,videobuf2_v4l2
btusb                  53248  0
snd_hda_codec         151552  4 snd_hda_intel,snd_hda_codec_conexant,snd_hda_codec_hdmi,snd_hda_codec_generic
btrtl                  16384  1 btusb
btbcm                  16384  1 btusb
pcbc                   16384  0
btintel                24576  1 btusb
videodev              208896  3 uvcvideo,videobuf2_common,videobuf2_v4l2
bluetooth             638976  13 btrtl,btintel,bnep,btbcm,ath3k,btusb
snd_hda_core           94208  5 snd_hda_intel,snd_hda_codec_conexant,snd_hda_codec,snd_hda_codec_hdmi,snd_hda_codec_generic
rtsx_usb_ms            20480  0
memstick               16384  1 rtsx_usb_ms
aesni_intel           188416  6
snd_hwdep              16384  1 snd_hda_codec
psmouse               167936  0
aes_x86_64             20480  1 aesni_intel
crypto_simd            16384  1 aesni_intel
glue_helper            16384  1 aesni_intel
cryptd                 28672  3 crypto_simd,ghash_clmulni_intel,aesni_intel
r8169                  94208  0
media                  45056  2 uvcvideo,videodev
input_leds             16384  0
snd_pcm               135168  4 snd_hda_intel,snd_hda_codec,snd_hda_core,snd_hda_codec_hdmi
agpgart                49152  2 ttm,drm
fam15h_power           16384  0
k10temp                16384  0
snd_timer              36864  1 snd_pcm
ecdh_generic           24576  1 bluetooth
mii                    16384  1 r8169
syscopyarea            16384  1 drm_kms_helper
ccp                    94208  0
sysfillrect            16384  1 drm_kms_helper
sysimgblt              16384  1 drm_kms_helper
fb_sys_fops            16384  1 drm_kms_helper
ideapad_laptop         36864  0
snd                    98304  16 snd_hda_intel,snd_hwdep,snd_hda_codec_conexant,snd_hda_codec,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_pcm
sp5100_tco             16384  0
shpchp                 40960  0
i2c_piix4              24576  0
rng_core               16384  1 ccp
soundcore              16384  1 snd
sparse_keymap          16384  1 ideapad_laptop
rfkill                 28672  7 bluetooth,ideapad_laptop,cfg80211
wmi                    28672  1 ideapad_laptop
battery                24576  0
rtc_cmos               24576  1
evdev                  20480  11
ac                     16384  0
mac_hid                16384  0
acpi_cpufreq           24576  0
crypto_user            16384  0
ip_tables              28672  0
x_tables               45056  1 ip_tables
ext4                  716800  1
crc32c_generic         16384  0
crc16                  16384  2 bluetooth,ext4
mbcache                16384  1 ext4
jbd2                  122880  1 ext4
fscrypto               32768  1 ext4
rtsx_usb_sdmmc         28672  0
rtsx_usb               20480  2 rtsx_usb_sdmmc,rtsx_usb_ms
sr_mod                 28672  0
cdrom                  69632  1 sr_mod
sd_mod                 61440  2
serio_raw              16384  0
atkbd                  32768  0
libps2                 16384  2 atkbd,psmouse
sdhci_pci              40960  0
ahci                   40960  1
cqhci                  28672  1 sdhci_pci
crc32c_intel           24576  1
sdhci                  57344  1 sdhci_pci
ehci_pci               16384  0
xhci_pci               16384  0
libahci                40960  1 ahci
xhci_hcd              258048  1 xhci_pci
ehci_hcd               94208  1 ehci_pci
led_class              16384  4 rtsx_usb_sdmmc,sdhci,input_leds,ath9k
libata                278528  2 ahci,libahci
mmc_core              172032  4 rtsx_usb_sdmmc,sdhci,sdhci_pci,cqhci
usbcore               286720  8 uvcvideo,ehci_hcd,xhci_pci,rtsx_usb,ath3k,btusb,xhci_hcd,ehci_pci
scsi_mod              258048  3 sd_mod,libata,sr_mod
usb_common             16384  1 usbcore
i8042                  32768  1 ideapad_laptop
serio                  28672  6 serio_raw,atkbd,psmouse,i8042

…if ever someone can help me configure thinkfan (and optionnaly thinkpad_acpi for screen brightness and other controls (battery usage is not monitored either on my laptop)) & set it in motion I would appreciate since I fear I cannot do it all by myself.

Thanks in advance to anyone it may concern.


To whoever may help me @nate or @ector or anyone else, here is two outputs after an attempt to start thinkfan.service :

root@Lenovo-G50-45 /home/thierry # systemctl enable thinkfan.service
    root@Lenovo-G50-45 /home/thierry # systemctl start --now thinkfan.service
    Job for thinkfan.service failed because the control process exited with error code.
    See "systemctl status thinkfan.service" and "journalctl -xe" for details.
    1 root@Lenovo-G50-45 /home/thierry # journalctl -xe                                       :(
    mai 13 01:41:38 Lenovo-G50-45 tumblerd[6300]: Failed to load plugin "tumbler-ffmpeg-thumbnai>
    mai 13 01:41:38 Lenovo-G50-45 tumblerd[6300]: Failed to load plugin "tumbler-odf-thumbnailer>
    mai 13 01:41:38 Lenovo-G50-45 tumblerd[6300]: Failed to load plugin "tumbler-raw-thumbnailer>
    mai 13 01:41:38 Lenovo-G50-45 org.freedesktop.thumbnails.Cache1[5305]: Registered thumbailer>
    mai 13 01:41:38 Lenovo-G50-45 org.freedesktop.thumbnails.Cache1[5305]: Registered thumbailer>
    mai 13 01:41:38 Lenovo-G50-45 dbus-daemon[5305]: [session uid=0 pid=5303] Successfully activ>
    mai 13 01:42:05 Lenovo-G50-45 systemd[1]: Reloading.
    mai 13 01:42:05 Lenovo-G50-45 dunst[6293]: Could not load icon: 'system-software-update'
    mai 13 01:42:05 Lenovo-G50-45 dunst[6293]: Could not load icon: 'system-software-update'
    mai 13 01:44:20 Lenovo-G50-45 systemd[1]: Reloading.
    mai 13 01:44:27 Lenovo-G50-45 systemd[1]: Starting simple and lightweight fan control progra>
    -- Subject: L'unité (unit) thinkfan.service a commencé à démarrer
    -- Defined-By: systemd
    -- Support:
    -- L'unité (unit) thinkfan.service a commencé à démarrer.
    mai 13 01:44:27 Lenovo-G50-45 thinkfan[6543]: thinkfan 0.9.1 starting...
    mai 13 01:44:27 Lenovo-G50-45 thinkfan[6543]: /proc/acpi/ibm/thermal: No such file or direct>
    mai 13 01:44:27 Lenovo-G50-45 systemd[1]: thinkfan.service: Control process exited, code=exi>
    mai 13 01:44:27 Lenovo-G50-45 thinkfan[6543]: add_sensor: Error getting temperature.
    mai 13 01:44:27 Lenovo-G50-45 systemd[1]: thinkfan.service: Failed with result 'exit-code'.
    mai 13 01:44:27 Lenovo-G50-45 thinkfan[6543]: Refusing to run without usable config file!
    mai 13 01:44:27 Lenovo-G50-45 systemd[1]: Failed to start simple and lightweight fan control>
    -- Subject: L'unité (unit) thinkfan.service a échoué
    -- Defined-By: systemd
    -- Support:
    -- L'unité (unit) thinkfan.service a échoué, avec le résultat RESULT.  

And here is the way I edited the conf file /etc/thinkfan.conf :

$ cat /etc/thinkfan.conf
        ## thinkfan 0.9 example config file
        ## ================================
        ## ATTENTION: There is only very basic sanity checking on the configuration.
        ## That means you can set your temperature limits as insane as you like. You
        ## can do anything stupid, e.g. turn off your fan when your CPU reaches 70°C.
        ## That's why this program is called thinkfan: You gotta think for yourself.
        ## This file shows how to use sensor-specific temperature limits.
        ## First of all, you need to specify temperature inputs. On a Thinkpad, you can
        ## just use:
        tp_thermal /proc/acpi/ibm/thermal  # provides us with 16 temperature inputs
        ## On other systems, you have to specify a file in /sys/class/hwmon for each
        ## sensor you want to use. They are numbered in their order of appearance.
        ## For example:
        # hwmon /sys/class/hwmon5/temp2_input           #1
        # hwmon /sys/class/hwmon0/device/temp3_input    #2
        ## Next we specify the fan we want to use. On a Thinkpad, this is:
        tp_fan /proc/acpi/ibm/fan

        ## On anything other than a Thinkpad you'll probably use some PWM control file
        ## in /sys/class/hwmon. Remember that fan levels range from 0 to 255 and that
        ## they're just a number, not including the word "level" as seen below.
        ## A sysfs fan would be specified like this:
        # pwm_fan /sys/class/hwmon/hwmon2/device/pwm1

        { "level auto" # nice idea: "level auto" can also be used.
                             # but again: only numbers for sysfs.
        #    (69 50 50 75 55 .  55 .  55 55 55 .  .  .  .  .)
        #    (99 99 99 99 99 .  99 .  99 99 99 .  .  .  .  .)

I am unable it seems to gain by myself further hints to solve this.

Any help welcome, even in an easier way than the thinkfan/thinkpad_acpi ones.



I suggest trying out this, remove any previously created configs and packages installed due to testing and trying things

Then just follow along Arch Wiki on Thinkpads

Most of the following will need to be done as root with the exception of yaourt

Add fan_control=1 to /etc/default/grub, like so

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fan_control=1"

Rebuild the grub config

grub-mkconfig -o /boot/grub/grub.cfg

Now install the required packages

yaourt -S thinkfan lm_sensors

They recommend taking a look at the files installed and their locations

pacman -Ql thinkfan

Next you want to make sure that /usr/lib/modprobe.d/thinkpad_acpi.conf has this line:

options thinkpad_acpi fan_control=1

Use cat to check

cat /usr/lib/modprobe.d/thinkpad_acpi.conf

# if it doesn't have the line/file, create the system default in /etc/modprobe.d
mkdir -p /etc/modprobe.d
echo "options thinkpad_acpi fan_control=1" > /etc/modprobe.d/thinkfan.conf

Next you want to enable the kernel module

modprobe thinkpad_acpi
cat /proc/acpi/ibm/fan

You may have to reboot but I believe it should be fine to continue.

Regarding the cat /proc/acpi/ibm/fan, the wiki states

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:


After all this try enabling the systemd unit, wait and read on please

systemctl enable thinkfan

Again from the wiki

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 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.

I believe this is your case and you will need to use a thermal zone rather than /proc/acpi/ibm/fan, that is why when you tried enabling thinkfan originally you got this error

/proc/acpi/ibm/thermal: No such file or directory

Look around in /sys/devices/virtual/thermal/ and /sys/class/hwmon/
I found my fan_input like so

 λ ~ → ls /sys/class/hwmon/hwmon0
name  power  subsystem  temp1_crit  temp1_input  temp2_crit  temp2_input  uevent

 λ ~ → ls /sys/class/hwmon/hwmon1
device  fan1_input  fan1_label  name  power  pwm1_enable  subsystem  uevent

 λ ~ → ls /sys/class/hwmon/hwmon2
device      temp1_crit_alarm  temp2_crit_alarm  temp3_crit_alarm  temp4_crit_alarm  temp5_crit_alarm
name        temp1_input       temp2_input       temp3_input       temp4_input       temp5_input
power       temp1_label       temp2_label       temp3_label       temp4_label       temp5_label
subsystem   temp1_max         temp2_max         temp3_max         temp4_max         temp5_max
temp1_crit  temp2_crit        temp3_crit        temp4_crit        temp5_crit        uevent

Also may want to run if your having no luck


On my system I have zones 0-2, not lenovo based, it’s a desktop. Also intel based so things may differ, yours may be thermal_zone1… etc. You may also have multiple zones, in which case I would say check each and go with the lowest one, that way the fan should have a little buffer before ramping up.

λ ~ → cat /sys/devices/virtual/thermal/thermal_zone0/temp

I mentioned before enabling the systemd unit, the wiki is kinda out of order, there is another way to first test things without needing to enable it, run:

thinkfan -n

Try doing some average usage and see how it reacts to the load.
When you have it configured correctly, then start/enable thinkfan.service

That should do it :crossed_fingers: if anything in this sequence seems odd or throws errors please post them back here.

Really hope this helps/works for you, if not we’ll check out other methods.


1 Like

Holy shit @nate, that has to be one of the most comprehensive replies I have ever encountered.

1 Like

Thank you for your reply hey @nate .

According to your previous post here is what I can say and what I did about thinkfan on my machine :

First :

thierry@Lenovo-G50-45 / % sudo sensors-detect
Driver `k10temp' (autoloaded):
  * Chip `AMD Family 16h thermal sensors' (confidence: 9)

No modules to load, skipping modules configuration.

Unloading i2c-dev... OK
Unloading cpuid... OK

Next here is a few outputs :

thierry@Lenovo-G50-45 / % ls /sys/class/hwmon
hwmon0  hwmon1  hwmon2  hwmon3

thierry@Lenovo-G50-45 / % ls /sys/class/hwmon/hwmon0
device  name  power  subsystem  temp1_crit  temp1_crit_hyst  temp1_input  temp1_max  uevent
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon0/name

thierry@Lenovo-G50-45 / % ls /sys/class/hwmon/hwmon1
device  name  power  power1_average  power1_average_interval  power1_crit  subsystem  uevent
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon1/name

thierry@Lenovo-G50-45 / % ls /sys/class/hwmon/hwmon2
device  name  power  subsystem  temp1_crit  temp1_crit_hyst  temp1_input  uevent
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon2/name

thierry@Lenovo-G50-45 / % ls /sys/class/hwmon/hwmon3
device  fan1_input  name  power  pwm1  pwm1_enable  subsystem  uevent
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon3/name
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon3/fan1_input
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon3/pwm1
thierry@Lenovo-G50-45 / % cat /sys/class/hwmon/hwmon3/pwm1_enable

The part /sys/devices/virtual/thermal is more puzzling since I get something like this inside :

thierry@Lenovo-G50-45 / % tree -fF /sys/devices/virtual/thermal/
├── /sys/devices/virtual/thermal/cooling_device1/
│   ├── /sys/devices/virtual/thermal/cooling_device1/cur_state
│   ├── /sys/devices/virtual/thermal/cooling_device1/device -> ../../../LNXSYSTM:00/LNXCPU:00/
│   ├── /sys/devices/virtual/thermal/cooling_device1/max_state
│   ├── /sys/devices/virtual/thermal/cooling_device1/power/
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/async
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/autosuspend_delay_ms
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/control
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/runtime_active_kids
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/runtime_active_time
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/runtime_enabled
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/runtime_status
│   │   ├── /sys/devices/virtual/thermal/cooling_device1/power/runtime_suspended_time
│   │   └── /sys/devices/virtual/thermal/cooling_device1/power/runtime_usage
│   ├── /sys/devices/virtual/thermal/cooling_device1/subsystem -> ../../../../class/thermal/
│   ├── /sys/devices/virtual/thermal/cooling_device1/type
│   └── /sys/devices/virtual/thermal/cooling_device1/uevent
├── /sys/devices/virtual/thermal/cooling_device2/
│   ├── /sys/devices/virtual/thermal/cooling_device2/cur_state
│   ├── /sys/devices/virtual/thermal/cooling_device2/device -> ../../../LNXSYSTM:00/LNXCPU:01/
│   ├── /sys/devices/virtual/thermal/cooling_device2/max_state
│   ├── /sys/devices/virtual/thermal/cooling_device2/power/
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/async
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/autosuspend_delay_ms
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/control
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/runtime_active_kids
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/runtime_active_time
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/runtime_enabled
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/runtime_status
│   │   ├── /sys/devices/virtual/thermal/cooling_device2/power/runtime_suspended_time
│   │   └── /sys/devices/virtual/thermal/cooling_device2/power/runtime_usage
│   ├── /sys/devices/virtual/thermal/cooling_device2/subsystem -> ../../../../class/thermal/
│   ├── /sys/devices/virtual/thermal/cooling_device2/type
│   └── /sys/devices/virtual/thermal/cooling_device2/uevent
├── /sys/devices/virtual/thermal/cooling_device3/
│   ├── /sys/devices/virtual/thermal/cooling_device3/cur_state
│   ├── /sys/devices/virtual/thermal/cooling_device3/device -> ../../../LNXSYSTM:00/LNXCPU:02/
│   ├── /sys/devices/virtual/thermal/cooling_device3/max_state
│   ├── /sys/devices/virtual/thermal/cooling_device3/power/
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/async
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/autosuspend_delay_ms
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/control
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/runtime_active_kids
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/runtime_active_time
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/runtime_enabled
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/runtime_status
│   │   ├── /sys/devices/virtual/thermal/cooling_device3/power/runtime_suspended_time
│   │   └── /sys/devices/virtual/thermal/cooling_device3/power/runtime_usage
│   ├── /sys/devices/virtual/thermal/cooling_device3/subsystem -> ../../../../class/thermal/
│   ├── /sys/devices/virtual/thermal/cooling_device3/type
│   └── /sys/devices/virtual/thermal/cooling_device3/uevent
└── /sys/devices/virtual/thermal/cooling_device4/
    ├── /sys/devices/virtual/thermal/cooling_device4/cur_state
    ├── /sys/devices/virtual/thermal/cooling_device4/device -> ../../../LNXSYSTM:00/LNXCPU:03/
    ├── /sys/devices/virtual/thermal/cooling_device4/max_state
    ├── /sys/devices/virtual/thermal/cooling_device4/power/
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/async
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/autosuspend_delay_ms
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/control
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/runtime_active_kids
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/runtime_active_time
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/runtime_enabled
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/runtime_status
    │   ├── /sys/devices/virtual/thermal/cooling_device4/power/runtime_suspended_time
    │   └── /sys/devices/virtual/thermal/cooling_device4/power/runtime_usage
    ├── /sys/devices/virtual/thermal/cooling_device4/subsystem -> ../../../../class/thermal/
    ├── /sys/devices/virtual/thermal/cooling_device4/type
    └── /sys/devices/virtual/thermal/cooling_device4/uevent

16 directories, 52 files

As you can see no “thermal_zone” or “temp” item, only “cooling_device*”

However I continued and set the thinkfan config file as this :

thierry@Lenovo-G50-45 / % cat /etc/thinkfan.conf
#thinkfan config file /etc/thinkfan.conf

hwmon /sys/class/hwmon/hwmon0/temp1_input  #k10temp
hwmon /sys/class/hwmon/hwmon2/temp1_input  #radeon

pwm_fan /sys/class/hwmon/hwmon3/pwm1

{ "0"   # the fan level
#             for a PWM fan in /sys/class/hwmon it would have to be just
#             0 or "0".
#    Sensor count:
#    1  2
#    ====
    (0  0)      # LOWER limit
    (0 0)     # UPPER limit

{ "1"
#    Sensor count:
#    1  2
#    ====
    (0  0)      # LOWER limit
    (30 30)     # UPPER limit
{ "3"
#    Sensor count:
#    1  2
#    ====
    (0  0)      # LOWER limit
    (60 60)     # UPPER limit
{ "5"
#    Sensor count:
#    1  2
#    ====
    (0  0)      # LOWER limit
    (100 100)     # UPPER limit
{ "7"
#    Sensor count:
#    1  2
#    ====
    (0  0)      # LOWER limit
    (200 200)     # UPPER limit

Next I did :

thierry@Lenovo-G50-45 ~ % sudo systemctl restart --now lm_sensors.service
thierry@Lenovo-G50-45 ~ % systemctl status lm_sensors.service
● lm_sensors.service - Initialize hardware monitoring sensors
   Loaded: loaded (/usr/lib/systemd/system/lm_sensors.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sun 2018-05-13 16:45:45 CEST; 9min ago
  Process: 24938 ExecStop=/sbin/modprobe -qabr $BUS_MODULES $HWMON_MODULES (code=exited, status=1/FAILURE)
  Process: 24940 ExecStart=/usr/bin/sensors -s (code=exited, status=0/SUCCESS)
  Process: 24939 ExecStart=/sbin/modprobe -qab $BUS_MODULES $HWMON_MODULES (code=exited, status=1/FAILURE)
 Main PID: 24940 (code=exited, status=0/SUCCESS)

mai 13 16:45:45 Lenovo-G50-45 systemd[1]: Starting Initialize hardware monitoring sensors...
mai 13 16:45:45 Lenovo-G50-45 modprobe[24939]: modprobe: ERROR: missing parameters. See -h.
mai 13 16:45:45 Lenovo-G50-45 systemd[1]: Started Initialize hardware monitoring sensors.

thierry@Lenovo-G50-45 ~ % sudo systemctl restart --now fancontrol.service
thierry@Lenovo-G50-45 ~ % systemctl status fancontrol.service
● fancontrol.service - Start fan control, if configured
   Loaded: loaded (/usr/lib/systemd/system/fancontrol.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
Condition: start condition failed at Sun 2018-05-13 16:45:29 CEST; 14min ago
           └─ ConditionFileNotEmpty=/etc/fancontrol was not met

thierry@Lenovo-G50-45 ~ % sudo systemctl restart --now thinkfan.service
thierry@Lenovo-G50-45 ~ % systemctl status thinkfan.service
● thinkfan.service - simple and lightweight fan control program
   Loaded: loaded (/usr/lib/systemd/system/thinkfan.service; enabled; vendor preset: disable>
   Active: active (running) since Sun 2018-05-13 16:45:55 CEST; 34s ago
  Process: 24963 ExecStart=/usr/bin/thinkfan (code=exited, status=0/SUCCESS)
 Main PID: 24964 (thinkfan)
    Tasks: 1 (limit: 4915)
   Memory: 272.0K
   CGroup: /system.slice/thinkfan.service
           └─24964 /usr/bin/thinkfan

mai 13 16:45:55 Lenovo-G50-45 systemd[1]: Starting simple and lightweight fan control program...
mai 13 16:45:55 Lenovo-G50-45 thinkfan[24963]: thinkfan 0.9.1 starting...
mai 13 16:45:55 Lenovo-G50-45 thinkfan[24963]: WARNING: Using safe but wasteful way of setting PWM value. Check README to know more.
mai 13 16:45:55 Lenovo-G50-45 thinkfan[24963]: Daemon PID: 24964
mai 13 16:45:55 Lenovo-G50-45 systemd[1]: Started simple and lightweight fan control program.

BUT, set as it is, the thinkfan control doesn’t seem to be functionnal since fan still seemingly shows overheading activity unpurposedly.

May be a workaround on lm_sensors.service and fancontrol.service starts failures could do the trick ?

… Thanks for your help again.


After a few enquiries on the web it seems that fancontrol.service lacks a configuration file usually located at /etc/fancontrol.

It seems that this file should be generated automatically by a utility called pmwconfig BUT when I run it I get :

root@Lenovo-G50-45 /home/thierry # pwmconfig                          
/usr/sbin/pwmconfig: There are no pwm-capable sensor modules installed

May someone knows what to do then…?
Thanks in advance.


I am noticing that thinkpad_acpi module seems to load fine with the modprobe command, however it goes away after reboot :

root@Lenovo-G50-45 /home/thierry # modprobe thinkpad_acpi 
root@Lenovo-G50-45 /home/thierry # lsmod|grep 'acpi'     
thinkpad_acpi         106496  0
nvram                  16384  1 thinkpad_acpi
snd                    98304  17 snd_hda_intel,snd_hwdep,snd_hda_codec_conexant,snd_hda_codec,snd_timer,thinkpad_acpi,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_pcm
rfkill                 28672  8 bluetooth,thinkpad_acpi,ideapad_laptop,cfg80211
acpi_cpufreq           24576  0
led_class              16384  5 rtsx_usb_sdmmc,sdhci,input_leds,thinkpad_acpi,ath9k

Then, back after a reboot the module has gone :

root@Lenovo-G50-45 /home/thierry # lsmod|grep 'acpi'        
acpi_cpufreq           24576  0

If ever it may help here is the module dependencies :

root@Lenovo-G50-45 /home/thierry # modprobe -D thinkpad_acpi
insmod /lib/modules/4.16.8-1-ARCH/kernel/drivers/leds/led-class.ko.xz 
insmod /lib/modules/4.16.8-1-ARCH/kernel/sound/soundcore.ko.xz 
insmod /lib/modules/4.16.8-1-ARCH/kernel/sound/core/snd.ko.xz 
insmod /lib/modules/4.16.8-1-ARCH/kernel/net/rfkill/rfkill.ko.xz 
insmod /lib/modules/4.16.8-1-ARCH/kernel/drivers/char/nvram.ko.xz 
insmod /lib/modules/4.16.8-1-ARCH/kernel/drivers/platform/x86/thinkpad_acpi.ko.xz fan_control=1 fan_control=1


Did you

Add fan_control=1 to /etc/default/grub, like so

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fan_control=1"

Rebuild the grub config

grub-mkconfig -o /boot/grub/grub.cfg


mkdir -p /etc/modprobe.d
echo "options thinkpad_acpi fan_control=1" > /etc/modprobe.d/thinkfan.conf

enable the kernel module

modprobe thinkpad_acpi
cat /proc/acpi/ibm/fan

I’m really not sure if this was/is needed, might be why it isn’t responding.

The lm_sensors/fancontrol guide is not quite the same as what I was walking through, they should all work in theory.

I get the same response. Note: the lm_sensors/fancontrol/pwmconfig is different than the thinkfan setup, I don’t think the two are compatible with eachother (if you follow one don’t follow the other)

If you want to continue down the pwmconfig/fancontrol route then create a config like shown on the wiki

Otherwise just disable the service and try the above.

EDIT: I just saw your above edit regarding the kernel module, try adding it to the /etc/default/grub then running grub-mkconfig -o /boot/grub/grub.cfg, is it still not loaded at boot?

Here it is :

root@Lenovo-G50-45 /home/thierry # cat /etc/modprobe.d/thinkfan.conf 
options thinkpad_acpi fan_control=1

and :

root@Lenovo-G50-45 /home/thierry # cat /boot/grub/grub.cfg|grep 'acpi'  
insmod thinkpad_acpi 

Next I disabled both odd services :

root@Lenovo-G50-45 /home/thierry # systemctl disable fancontrol.service 
Removed /etc/systemd/system/
root@Lenovo-G50-45 /home/thierry # systemctl disable lm_sensors.service 
Removed /etc/systemd/system/

And restarted the system…

…BUT the module thinkpad_acpi didn’t load at boot :

root@Lenovo-G50-45 /home/thierry # lsmod|grep 'acpi'                                  :(
acpi_cpufreq           24576  0

(no thinkpad_acpi)

I did edit /etc/default/grub.conf as this :

root@Lenovo-G50-45 /home/thierry # cat /etc/default/grub
# GRUB boot loader configuration


# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos thinkpad_acpi"


And did :

root@Lenovo-G50-45 /home/thierry # grub-mkconfig -o /boot/grub/grub.cfg
Création du fichier de configuration GRUB…
Image Linux trouvée : /boot/vmlinuz-linux
Image mémoire initiale trouvée : /boot/initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
Found memtest86+ image: /boot/memtest86+/memtest.bin
fait (done)

Checking :

root@Lenovo-G50-45 /home/thierry # cat /boot/grub/grub.cfg|grep 'acpi' 
insmod thinkpad_acpi

Althought … :

root@Lenovo-G50-45 /home/thierry # lsmod | grep 'acpi'
acpi_cpufreq           24576  0

(no thinkpad_acpi module loaded)…

Strange … :astonished:

Is the module now loading at boot and is thinkfan still able to start without error?

I’ll assume your still in the middle of it so I’ll wait your response without spamming too much

If it does not work with thinkfan, I would try to enable cupower and see how the fan goes by enabling acpi and powersave, follow the wiki here, remember to disable intel_p state

not even my notebook hp manages the fan, but enabling cpupower and disabling intel_p state acpi works and temperatures remain low, although I must use an old kernel.

[don@don-pc ~]$ ls /usr/lib/modules/$(uname -r)/kernel/drivers/cpufreq/
acpi-cpufreq.ko.gz          cpufreq_powersave.ko.gz  pcc-cpufreq.ko.gz
amd_freq_sensitivity.ko.gz  cpufreq_userspace.ko.gz  powernow-k8.ko.gz
cpufreq_conservative.ko.gz  p4-clockmod.ko.gz        speedstep-lib.ko.gz
[don@don-pc ~]$ uname -a
Linux don-pc 4.8.14-1-ARCH #1 SMP PREEMPT Sun Dec 11 01:47:53 UTC 2016 x86_64 GNU/Linux
[don@don-pc ~]$ 
lsmod|grep 'acpi'
acpi_cpufreq           20480  1
[don@don-pc ~]$ lsmod | grep cpufreq
cpufreq_powersave      16384  8
acpi_cpufreq           20480  1
[don@don-pc ~]$ 

Oh that is weird, I wonder why it isn’t being loaded.

Possibly check dmesg for ‘acpi’, ‘warning’, ‘fan’, ‘thinkpad’, etc…

# -i to ignore case, or use Warning, ACPI, etc..
dmesg | grep -i 'acpi'

I found this page in my searches

You don’t have to read too far down to find another one of the wiki’s mistakes:

If the module is built into the kernel, you can also pass options to the module using the kernel command line. Use the following sytax:


For example:


After reading this I believe the GRUB_CMDLINE_LINUX_DEFAULT kernel module should be


I’m also fairly sure you’ll need to be loading it from the initramfs

Note: If any of the affected modules is loaded from the initramfs, then you will need to add the appropriate .conf file to FILES in mkinitcpio.conf or use the modconf hook, so that it will be included in the initramfs.

This basically just mean you have to either

  • add the .conf file to a list of FILES=()
  • or add modconf to HOOKS=() to be built into the initramfs

These options allow users to add files to the image. Both BINARIES and FILES are added before hooks are run, and may be used to override files used or provided by a hook. BINARIES are auto-located within a standard PATH and are dependency-parsed, meaning any required libraries will also be added. FILES are added as-is. For example:


They are just space separated arrays ARRAY=(item1 item2 ...)

After this you’ll need to run (I’m assuming stock kernel here, or the -p preset will be different)

mkinitcpio -p linux

You shouldn’t see any warnings or errors regarding FILES

Ignore these

==> WARNING: Possibly missing firmware for module: wd719x
==> WARNING: Possibly missing firmware for module: aic94xx

Reboot once more and check the relevant commands to see if the module is loaded.

If this doesn’t work I’m starting to run thin on possibilities, perhaps your original attempt with lm_sensors and fancontrol may be a better solution in this case

@ector : Thanks for your tip, if I can’t get through thinkfan configuration I will try your solution, hopefully with your help.

@nate : I edit /etc/mkinitcpio.conf as follows :

root@Lenovo-G50-45 /home/thierry # cat /etc/mkinitcpio.conf
# vim:set ft=sh
# The following modules are loaded before any boot hooks are
# run.  Advanced users may wish to specify all system modules
# in this array.  For instance:
#     MODULES=(piix ide_disk reiserfs)

# This setting includes any additional binaries a given user may
# wish into the CPIO image.  This is run last, so it may be used to
# override the actual binaries included by a given hook
# BINARIES are dependency parsed, so you may safely ignore libraries

# This setting is similar to BINARIES above, however, files are added
# as-is and are not parsed in any way.  This is useful for config files.
[...] (rest left unchanged)

Then ran

root@Lenovo-G50-45 /home/thierry # mkinitcpio -p linux && update-grub

And after a reboot :

root@Lenovo-G50-45 /home/thierry # lsmod|grep 'acpi'
acpi_cpufreq           24576  0
thinkpad_acpi         106496  0
nvram                  16384  1 thinkpad_acpi
snd                    98304  17 snd_hda_intel,snd_hwdep,snd_hda_codec_conexant,snd_hda_codec,snd_timer,thinkpad_acpi,snd_hda_codec_hdmi,snd_hda_codec_generic,snd_pcm
rfkill                 28672  8 bluetooth,thinkpad_acpi,ideapad_laptop,cfg80211
led_class              16384  5 rtsx_usb_sdmmc,sdhci,input_leds,thinkpad_acpi,ath9k

…at last.

But hwmon numbers in /sys/class/hwmon are changed :
hwmon3 moved to hwmon0 ; hwmon0 moved to hwmon1 ; hwmon2 moved to hwmon3 and hwmon1 moved to hwmon2
so I had to edit /etc/thinkfan.conf accordingly and then restart thinkfan.service. which status was then fine.

Note : at this time :

root@Lenovo-G50-45 /sys/class/hwmon # cat /proc/acpi/ibm/fan 
status:		disabled
speed:		0
level:		0
commands:	level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands:	enable, disable
commands:	watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds)) 

Fan regulation is still not working I feel. :frowning_face:

I reboot to check it again…


to @nate or any other helper…

After reboot the /sys/class/hwmon/hwmon~ numbers got mixed again and thinkfan.conf is invalid again and causes thinkfan.service start failure. :sob:

What to do ?

Thanks to all.

Ok well, glad were getting close :stuck_out_tongue:

So now it seems alll is well and you have /proc/acpi/ibm/fan correct?

According to the wiki you now just have to setup the configs and it should be all good

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.

So you’re all good there, your level is reporting “auto”, next

Set thinkfan to run at startup by editing /etc/default/thinkfan and adding the following line:


Finally, enable the thinkfan systemd service:

systemctl enable thinkfan

Try out this for /etc/thinkfan.conf

tp_thermal /proc/acpi/ibm/thermal  # temps
tp_fan /proc/acpi/ibm/fan          # fan

{ "level 0"   # the fan level
    (0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0)      # LOWER limit
    (54 42 42 54 42 .  42 .  42 46 54 .  .  .  .  .)      # UPPER limit

{ "level 1"
    (46 39 39 48 39 .  39 .  41 44 46 .  .  .  .  .)
    (58 45 45 60 45 .  45 .  45 47 56 .  .  .  .  .)

{ "level 3"
    (52 43 43 57 43 .  43 .  43 45 51 .  .  .  .  .)
    (62 48 48 67 48 .  48 .  48 48 57 .  .  .  .  .)

{ "level 5"
    (56 46 46 65 46 .  46 .  46 46 52 .  .  .  .  .)
    (66 49 49 69 49 .  49 .  49 49 58 .  .  .  .  .)

{ "level 7"
    (63 47 47 67 47 .  47 .  47 47 50 .  .  .  .  .)
    (73 55 55 83 60 .  60 .  60 60 64 .  .  .  .  .)

{ "level disengaged" #  "level auto" can also be used.
    (69 50 50 75 55 .  55 .  55 55 55 .  .  .  .  .)
    (99 99 99 99 99 .  99 .  99 99 99 .  .  .  .  .)

Now try running thinkfan manually in non-daemon mode so you get all the output

thinkfan -n

After reading around a bit it seems that it’s just a matter of tweaking the threshold numbers, you may have to trial and error it to get where you want.

Checking out /proc/acpi/ibm/ and see what is all in there, then doing the same for each inside.

@nate : Thanks for your answer, however
First : I don’t get where you see my ibm/fan level reports “auto” as :

root@Lenovo-G50-45 /home/thierry # cat /proc/acpi/ibm/fan 
status:		disabled
speed:		0
level:		0
commands:	level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands:	enable, disable
commands:	watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))

/etc/default/thinkfan already set :

root@Lenovo-G50-45 /home/thierry # cat /etc/default/thinkfan 

Besides, I fear I cannot use ibm’s default probing mode because the thermal item in /proc/acpi/ibm doesn’t exist at my machine :

root@Lenovo-G50-45 /home/thierry # ls -a /proc/acpi/ibm/
.  ..  driver  fan  volume 

So tp_thermal set to /proc/acpi/ibm/thermal will be refused as “File not found” at thinfan.service startup.

This is why I used the #2 option of the thinkfan.conf skel file which uses pwm and hwmon* items of /sys/class/hwmon… as fan & thermal identifications.

But as I previously said, it seems that hwmon numbers are changed at each new boot, so one cannot rely on once given numbers set to /sys/class/hwmon/hwmon*. For once pwm is at hwmon1 and temp_inputs are at hwmon 2 and 3 and at next boot pwm moved to hwmon2 maybe and temp_inputs moved at hwmon0 and 1 for instance. So the previous-boot /etc/thinkfan.conf configuration file turns obsolete for the current boot and thinkfan.service start fails with “file not found” errors…

Do you agree or did I miss something in your previous post ?

@nate are you a walking linux encyclopedia!? I think we should throw out wiki and have a special button installed on AL that will act like the bat signal!:joy::rofl::joy:

1 Like




1 Like