Fan Control and Power Management

Install and configure thinkfan for quiet fan profiles, TLP for battery life, and power-profiles-daemon on a Lenovo ThinkPad L14 Gen 2.

Intermediate Verified Working Updated 16 min read Tested on Linux Mint 22.3 Cinnamon (Ubuntu 24.04 Noble base); also tested on Zorin OS 18.1 Pro Hardware Lenovo ThinkPad L14 Gen 2 (Intel i5-1135G7, 16GB RAM, Intel Iris Xe, 1366x768)

What This Guide Achieves

Fix a laptop fan that runs at full speed (3600+ RPM) at idle when CPU temperatures are only 36–46°C. This problem was observed on Zorin OS 18.1 Pro on a Lenovo ThinkPad L14 Gen 2.

Linux Mint 22.3 Cinnamon users: This issue does not appear on Mint. On the same ThinkPad hardware, Linux Mint keeps the fan at ~2500 RPM — audible but far from the 3600+ RPM scream seen on Zorin. The difference likely comes from how each distro configures kernel power profiles (power-profiles-daemon) and thinkpad_acpi defaults, which affect CPU power states and therefore heat output. thinkfan was installed on the tested Mint system but never configured because it wasn’t needed. If your fan is reasonably quiet, skip to the Power Profile Behavior section.

The root cause: The ThinkPad BIOS/EC (Embedded Controller) firmware ships with a conservative fan curve designed for Windows. Windows has its own fan management layer (Lenovo Vantage) that talks to the EC and keeps things quiet. Linux does not have this layer by default, so the EC falls back to its aggressive built-in curve — spinning the fan hard even when the CPU is perfectly cool.

This guide gives Linux the same kind of intelligent fan control that Windows gets out of the box.

BeforeAfter
Fan at 3600+ RPM at idleFan silent (0 RPM) at idle
Constant noise even with cool CPUFan only spins when CPU actually gets warm
BIOS controls fan with no OS feedbackLinux controls fan based on real-time temperature

The Problem (Windows User Perspective)

On Windows, Lenovo Vantage handles fan curves automatically — the fan stays quiet when browsing and only ramps up under load.

On Linux, this layer is absent. On the tested Zorin OS 18.1 Pro setup, the ThinkPad BIOS/EC firmware falls back to an aggressive built-in curve: the fan spins at 3600+ RPM even when the CPU is at a cool 40°C. This is a gap in the communication between ThinkPad firmware and the Linux kernel — one that specifically manifested on Zorin but does not occur on Linux Mint 22.3 Cinnamon (where the fan runs at a moderate ~2500 RPM under BIOS control).


When to Apply This Fix

The full thinkfan configuration below is needed if:

  • Your fan runs at 3600+ RPM at idle with CPU temps of 40–50°C
  • You’re on Zorin OS or another GNOME-based distro
  • sensors | grep fan shows excessive RPM at idle

If your fan runs at ~2500 RPM at idle (as on Linux Mint 22.3 Cinnamon), the BIOS fan control is already reasonable. thinkfan can still be installed for finer control, but the aggressive-noise problem this guide solves does not apply.


Diagnosing the Fan Problem

Before installing anything, confirm that your fan is actually misbehaving. You need two pieces of information: what temperature your CPU is at, and how fast the fan is spinning.

Step 1: Install the sensor tools

sudo apt install lm-sensors

This installs the sensors command, which reads temperature and fan data from your hardware.

Step 2: Detect your hardware sensors

sudo sensors-detect

Press Enter for every question to accept the defaults. This scans your motherboard for temperature sensors and fan controllers so the sensors command knows where to look.

Step 3: Read the sensor data

sensors

On a ThinkPad L14 Gen 2 with this problem, the output looked like this:

coretemp-isa-0000
Adapter: ISA adapter
Package id 0:  +46.0°C  (high = +100.0°C, crit = +100.0°C)
Core 0:        +42.0°C  (high = +100.0°C, crit = +100.0°C)
Core 1:        +42.0°C  (high = +100.0°C, crit = +100.0°C)
Core 2:        +43.0°C  (high = +100.0°C, crit = +100.0°C)
Core 3:        +42.0°C  (high = +100.0°C, crit = +100.0°C)

thinkpad-isa-0000
Adapter: ISA adapter
fan1:        3619 RPM
CPU:          +43.0°C

How to interpret this

  • CPU temperature 42-46°C — This is perfectly normal for an idle laptop. Nothing is overheating.
  • Fan at 3619 RPM — This is way too high for these temperatures. At 43°C, the fan should be off or barely spinning.

If your output looks similar — cool CPU but loud fan — this guide will fix it.


Solution — Tools to Install (Primarily for Zorin OS)

The primary fix is thinkfan for ThinkPad laptops. This was tested and verified on Zorin OS 18.1 Pro. On Linux Mint 22.3 Cinnamon, thinkfan is optional — the BIOS fan control is already reasonable. The other two tools (auto-cpufreq, TLP) are optional additions that help with CPU frequency scaling and battery life respectively, which can further reduce heat generation and give the fan even less reason to spin up.


Tool 1: thinkfan (Primary Fix — Controls the Fan)

This is the tool that actually solves the problem. thinkfan is a lightweight daemon that monitors CPU temperature and adjusts fan speed according to a curve you define. It replaces the BIOS fan control entirely.

Step 1: Install thinkfan

sudo apt install thinkfan

Step 2: Enable kernel-level fan control

By default, the Linux kernel does not allow software to control the ThinkPad fan — the BIOS has exclusive control. You need to tell the thinkpad_acpi kernel module to hand over fan control to userspace.

Create a configuration file that loads this option at every boot:

echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkpad_acpi.conf

Then apply it immediately without rebooting:

sudo modprobe -r thinkpad_acpi && sudo modprobe thinkpad_acpi fan_control=1

What this does: The thinkpad_acpi module is the kernel driver that talks to ThinkPad-specific hardware (fan, LEDs, special keys). The fan_control=1 option tells it to allow userspace programs (like thinkfan) to write fan speed values. Without this, thinkfan can read the temperature but cannot change the fan speed.

Step 3: Find your temperature sensor paths

Linux exposes hardware sensors through the /sys/class/hwmon/ directory. You need to find which paths correspond to your temperature sensors so thinkfan can read them.

find /sys/class/hwmon/hwmon*/temp*_input

On a ThinkPad L14 Gen 2, the output looked like this:

/sys/class/hwmon/hwmon1/temp1_input
/sys/class/hwmon/hwmon3/temp1_input
/sys/class/hwmon/hwmon6/temp1_input
/sys/class/hwmon/hwmon6/temp2_input
/sys/class/hwmon/hwmon6/temp3_input
/sys/class/hwmon/hwmon6/temp4_input
/sys/class/hwmon/hwmon6/temp5_input
/sys/class/hwmon/hwmon7/temp1_input
/sys/class/hwmon/hwmon7/temp2_input
/sys/class/hwmon/hwmon7/temp3_input
/sys/class/hwmon/hwmon7/temp4_input
/sys/class/hwmon/hwmon7/temp5_input
/sys/class/hwmon/hwmon7/temp6_input
/sys/class/hwmon/hwmon7/temp7_input
/sys/class/hwmon/hwmon7/temp8_input
/sys/class/hwmon/hwmon8/temp1_input

You can also see what each hwmon node represents:

for i in /sys/class/hwmon/hwmon*/name; do echo "$i: $(cat $i)"; done

Note the paths — you will use the primary sensor from each group (typically temp1_input) in the next step. Your hwmon numbers may differ from the example above.

Step 4: Create the thinkfan configuration file

This is the most important step. The configuration file tells thinkfan where to read temperatures, where to write fan speeds, and what fan speed to use at each temperature range.

sudo nano /etc/thinkfan.conf

Paste the following content. Replace the sensor paths with the ones you found in Step 3 — pick the primary sensor (temp1_input) from each hwmon group to cover CPU, motherboard, and other thermal zones:

# Fan Control: Using the ThinkPad ACPI interface
fans:
  - tpacpi: /proc/acpi/ibm/fan

# Sensors: Using the hwmon paths found in Step 3
# Pick one temp1_input per hwmon group to cover different thermal zones
sensors:
  - hwmon: /sys/class/hwmon/hwmon1/temp1_input
  - hwmon: /sys/class/hwmon/hwmon3/temp1_input
  - hwmon: /sys/class/hwmon/hwmon6/temp1_input
  - hwmon: /sys/class/hwmon/hwmon7/temp1_input
  - hwmon: /sys/class/hwmon/hwmon8/temp1_input

# Fan Levels: [Level, Start-Temp, Stop-Temp]
# ThinkPads use levels 0-7. Level "auto" hands control back to BIOS above 80°C.
levels:
  - [0,  0,  52]
  - [1,  50, 60]
  - [2,  55, 65]
  - [3,  60, 70]
  - [6,  65, 80]
  - [7,  75, 85]
  - ["level auto", 80, 32767]

Understanding the fan curve

Each line in levels follows the format: [level, low_temp, high_temp]

LevelApproximate Fan BehaviorActivates When Temp Rises AboveDrops Back When Temp Falls Below
0Fan off (silent)
1Barely audible52°C50°C
2Low hum60°C55°C
3Moderate65°C60°C
6Noticeable70°C65°C
7Loud80°C75°C
autoBIOS takes over85°C80°C

Critical: ThinkPad levels (0-7), not PWM values. ThinkPad fans controlled via tpacpi: /proc/acpi/ibm/fan use discrete levels 0 through 7, plus auto and disengaged. Do not use PWM values (0-255) — those only work with hwmon-based PWM fan control, which is a different driver. Using PWM values with tpacpi will cause thinkfan to fail.

The "level auto" in the last line hands fan control back to the BIOS when temperatures exceed 80°C, providing a safety net. The 32767 is a sentinel value meaning “infinity” — there is no upper temperature limit for this level.

The overlapping temperatures (e.g., level 1 activates at 52°C and deactivates at 50°C) create hysteresis. This prevents the fan from rapidly toggling between levels when the temperature hovers right at a boundary. Without hysteresis, the fan would annoyingly switch on and off every few seconds.

Step 5: Enable and start the thinkfan service

sudo systemctl enable thinkfan
sudo systemctl start thinkfan
sudo systemctl status thinkfan

The enable command makes thinkfan start automatically at boot. The start command runs it immediately. The status command lets you confirm it is working.

You should see output that includes active (running) and something like:

Temperatures(bias): 42(0) -> Fans: 0

This means: “CPU is at 42°C, fan is at level 0 (off).” The laptop should now be silent.

If the service fails to start, the most common cause is an incorrect sensor path. Run sudo thinkfan -n to execute thinkfan in the foreground — it will print the exact error and line number causing the failure. Also verify that fan control is enabled: cat /proc/acpi/ibm/fan should show commands: level <level> in its output.


Tool 2: auto-cpufreq (Optional — Intelligent CPU Frequency Scaling)

auto-cpufreq dynamically adjusts your CPU frequency based on load. It can reduce heat generation by keeping the CPU at lower frequencies during light tasks, which means thinkfan has even less work to do.

Installation

sudo apt install git
git clone https://github.com/AdnanHodzic/auto-cpufreq.git
cd auto-cpufreq && sudo ./auto-cpufreq-installer
sudo auto-cpufreq --install

Important Warning

auto-cpufreq disables and replaces power-profiles-daemon, which is the service behind the Performance / Balanced / Power Saver buttons in your GNOME Settings panel. After installing auto-cpufreq, those buttons will disappear from the GUI.

For most users, this trade-off is not worth it. thinkfan already handles the fan, and the built-in GNOME power profiles give you simple, predictable control over CPU behavior.

Recommendation: Remove auto-cpufreq and Restore the GUI

If you installed auto-cpufreq and want the GUI power buttons back:

cd ~/auto-cpufreq && sudo ./auto-cpufreq-installer --remove
sudo apt install power-profiles-daemon
sudo systemctl enable power-profiles-daemon
sudo systemctl start power-profiles-daemon

The Performance / Balanced / Power Saver buttons will reappear in Settings. thinkfan handles fan control regardless of which power mode you pick, so you get the best of both worlds: a silent fan and GUI-accessible power profiles.


Tool 3: TLP (Optional — Battery and Power Management)

TLP optimizes power consumption in the background. It does not control the fan — that is thinkfan’s job — but it reduces heat generation by managing things like USB autosuspend, WiFi power saving, and PCIe power states.

sudo apt install tlp tlp-rdw
sudo systemctl enable tlp
sudo systemctl start tlp
  • TLP manages battery and power settings (screen dimming, USB power, PCIe power states). It is especially useful on laptops.
  • tlp-rdw is an optional Radio Device Wizard addon for TLP that handles WiFi/Bluetooth power based on docking state.

Important: TLP conflicts with power-profiles-daemon. Ubuntu 24.04-based systems with GNOME/Zorin ship with power-profiles-daemon pre-installed — it powers the Performance / Balanced / Power Saver buttons in Settings. Installing TLP will disable it. If you want to keep the GUI power buttons, skip TLP. If you prefer TLP’s deeper power optimization, remove power-profiles-daemon first:

sudo systemctl disable power-profiles-daemon
sudo systemctl stop power-profiles-daemon

Recommendation: For most users, power-profiles-daemon + thinkfan is the better combo. You get GUI-accessible power profiles and a silent fan. TLP adds marginal battery gains at the cost of losing the power profile buttons.

Note on thermald: On 11th gen Intel and newer (like the i5-1135G7 in the L14 Gen 2), thermald is less commonly needed. The kernel’s intel_pstate driver handles CPU frequency scaling natively, and thinkfan already provides direct fan control. Installing thermald alongside thinkfan can cause conflicts since both try to manage thermal policy. If you are not using thinkfan, thermald may still provide useful thermal management via Intel DPTF interfaces.


What Didn’t Work (and Why)

These are approaches that were tried and failed during the process of solving this problem. They are documented here so you do not waste time on them.

Approach TriedWhy It Failed
Using hwmon-based fan control (fans: - hwmon: /sys/class/hwmon/hwmon6, name: thinkpad)thinkfan failed with "Could not find a hwmon... name: thinkpad" — the hwmon driver does not expose the fan controller by name on the L14 Gen 2
Using PWM values (0-255) instead of ThinkPad levels (0-7)tpacpi fan control expects discrete levels 0-7, not PWM duty cycles. PWM values only work with hwmon-based PWM fans, a different driver entirely
Using GNOME power profiles alone (Balanced mode)CPU ramps up aggressively for tiny tasks, triggering the fan via BIOS control
auto-cpufreq alone (without thinkfan)The fan is controlled by BIOS/EC firmware, not the CPU governor. Changing CPU frequency does not change the fan curve
Power Saver mode as a permanent solutionKeeps the fan quiet by capping CPU speed, but unnecessarily cripples performance for all tasks

The key insight is that fan speed and CPU speed are controlled by different systems. The CPU governor (managed by GNOME power profiles or auto-cpufreq) controls how fast the CPU runs. The EC firmware (overridden by thinkfan) controls how fast the fan spins. Fixing one does not fix the other.


Power Profile Behavior Explained

Here is how each GNOME power profile affects CPU and fan behavior, both with and without thinkfan:

Without thinkfan (BIOS controls the fan)

ModeCPU BehaviorFan Result
Power SaverCaps CPU speed lowFan quiet, but slow performance
BalancedCPU ramps up freely for any taskFan spins up unnecessarily for small tasks
PerformanceFull CPU speed at all timesFan loud constantly

With thinkfan installed (thinkfan controls the fan)

ModeCPU BehaviorFan Result
Power SaverCaps CPU speed lowFan silent (thinkfan keeps it off at low temps)
BalancedCPU ramps up freely for any taskFan stays quiet unless CPU genuinely gets hot
PerformanceFull CPU speed at all timesFan only ramps when CPU temperature actually requires it

With thinkfan, the fan stays quiet in ALL modes because thinkfan overrides the BIOS fan curve and makes decisions based on actual temperature, not CPU activity. The recommended combination is thinkfan + Balanced mode — you get full performance when you need it and a silent fan when you do not.


Verification

After completing the installation, verify that everything is working correctly.

Check fan speed

sensors | grep fan

At idle, you should see a low RPM value or 0 RPM. If you are seeing 3600+ RPM, something went wrong — check the troubleshooting steps below.

Watch fan control in real-time

watch -n 1 cat /proc/acpi/ibm/fan

This shows the fan level and speed updating every second. You should see the level change (0, 1, 2, etc.) as your CPU temperature crosses the boundaries defined in your config.

Check thinkfan service status

sudo systemctl status thinkfan

You should see active (running) in the output, along with a temperature/fan readout like:

Temperatures(bias): 42(0) -> Fans: 0

If thinkfan is not working

  1. Check that fan control is enabled in the kernel:

    cat /proc/acpi/ibm/fan

    The output should include commands: level <level> (<level> is 0-7, auto, disengaged, full-speed). If it does not, re-run the modprobe command from Step 2 and reboot.

  2. Check that your sensor paths are correct:

    find /sys/class/hwmon/hwmon*/temp*_input

    Compare the output with the paths in /etc/thinkfan.conf. If the hwmon numbers have changed (e.g., from hwmon6 to hwmon5), update the config to match.

  3. Run thinkfan in the foreground to see the exact error:

    sudo thinkfan -n

    This prints the error directly to your terminal, usually telling you exactly which sensor path or config line is causing the crash. This is the fastest way to debug a failing thinkfan service.

  4. Check the thinkfan log for errors:

    sudo journalctl -u thinkfan -e

    Look for error messages about missing files or incorrect configuration.


After Kernel Updates

Kernel updates can sometimes reset the thinkpad_acpi module parameters or change the hwmon numbering. If the fan starts running loud again after a kernel update:

sudo modprobe thinkpad_acpi fan_control=1
sudo systemctl restart thinkfan

If that does not fix it, check if the hwmon numbers changed:

find /sys/class/hwmon/hwmon*/temp*_input

If they changed, update the sensor paths in /etc/thinkfan.conf and restart the service.

Tip: The /etc/modprobe.d/thinkpad_acpi.conf file you created in Step 2 ensures that fan_control=1 is applied automatically on every boot. You should only need to intervene manually if the hwmon numbering changes. On some kernels, these numbers can shift after a major system update or if you plug in specific Thunderbolt/USB-C docks.


Complete Removal

If you want to revert to BIOS-controlled fan behavior (for example, before selling the laptop or switching to a different OS):

# Stop and disable the thinkfan service
sudo systemctl stop thinkfan
sudo systemctl disable thinkfan

# Remove the thinkfan package
sudo apt remove thinkfan

# Remove the kernel module configuration
sudo rm /etc/modprobe.d/thinkpad_acpi.conf

# Reload the thinkpad_acpi module without fan_control
sudo modprobe -r thinkpad_acpi && sudo modprobe thinkpad_acpi

After this, the fan will revert to BIOS/EC control. It will likely run louder again at idle — that is the default ThinkPad behavior on Linux without thinkfan.


This guide was written from a real debugging session on a ThinkPad L14 Gen 2 running Zorin OS 18.1 Pro (Ubuntu 24.04 base). Every command was tested on actual hardware.


Discussion