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.
Overview
Fix a laptop fan that runs at full speed (3600+ RPM) at idle when CPU temperatures are only 36–46°C. This problem can happen on various Linux distributions (including Zorin OS, Linux Mint, and Ubuntu) on modern ThinkPad hardware.
Note on Distro Differences: Some users might find that their fan is reasonably quiet out of the box (~2500 RPM or less). If your fan is already quiet, you don’t necessarily need this guide, but you can still use
thinkfanfor finer control. If your fan is screaming at 3600+ RPM while idling, continue with this guide to fix it permanently.
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.
| Before | After |
|---|---|
| Fan at 3600+ RPM at idle | Fan silent (0 RPM) at idle |
| Constant noise even with cool CPU | Fan only spins when CPU actually gets warm |
| BIOS controls fan with no OS feedback | Linux 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 many setups, 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.
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
sensors | grep fanshows excessive RPM at idle
If your fan runs at a quiet ~2500 RPM or less at idle, the BIOS fan control is already reasonable for you. thinkfan can still be installed for finer control, but the aggressive-noise problem this guide solves may not apply to your setup.
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
The primary fix is thinkfan for ThinkPad laptops. This gives full fan control back to the OS. 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.
Automated Setup Script
If you don’t want to configure thinkfan manually step-by-step, you can save this script as fix_fan.sh, make it executable (chmod +x fix_fan.sh), and run it to automatically install and configure thinkfan with stable sensor names:
#!/bin/bash
echo "Starting ThinkPad Fan Fix..."
# 1. Install thinkfan
echo "Installing thinkfan..."
sudo apt install -y thinkfan
# 2. Enable kernel-level fan control
echo "Enabling kernel-level fan control..."
echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkpad_acpi.conf > /dev/null
sudo modprobe -r thinkpad_acpi && sudo modprobe thinkpad_acpi fan_control=1
# 3. Create the thinkfan config
echo "Creating /etc/thinkfan.conf..."
sudo tee /etc/thinkfan.conf > /dev/null <<EOF
# Fan Control: Using the ThinkPad ACPI interface
fans:
- tpacpi: /proc/acpi/ibm/fan
# Sensors: Use name-based matching to prevent breaking after reboots!
sensors:
- hwmon: /sys/class/hwmon
name: acpitz
indices: [1]
- hwmon: /sys/class/hwmon
name: nvme
indices: [1]
- hwmon: /sys/class/hwmon
name: thinkpad
indices: [1]
- hwmon: /sys/class/hwmon
name: coretemp
indices: [1]
# Fan Levels: [Level, Start-Temp, Stop-Temp]
levels:
- [0, 0, 52]
- [1, 50, 60]
- [2, 55, 65]
- [3, 60, 70]
- [6, 65, 80]
- [7, 75, 85]
- ["level auto", 80, 32767]
EOF
# 4. Enable and start the service
echo "Starting thinkfan service..."
sudo systemctl enable thinkfan
sudo systemctl restart thinkfan
echo "Done! The fan should now be quiet."
If you prefer to understand exactly what is happening, follow the manual steps below.
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_acpimodule is the kernel driver that talks to ThinkPad-specific hardware (fan, LEDs, special keys). Thefan_control=1option 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 names
Linux exposes hardware sensors through the /sys/class/hwmon/ directory. Instead of hardcoding paths (like hwmon1 or hwmon2), which randomly change on every reboot or when plugging in USB-C devices, you should use the names of the sensors so thinkfan always finds them dynamically.
Find what each hwmon node is named:
for i in /sys/class/hwmon/hwmon*/name; do echo "$i: $(cat $i)"; done
Note the names of the temperature sensors (like acpitz, nvme, coretemp, thinkpad). You will use these exact names in the configuration file in the next step.
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. Using name: instead of raw paths prevents thinkfan from breaking after a reboot or kernel update!
# Fan Control: Using the ThinkPad ACPI interface
fans:
- tpacpi: /proc/acpi/ibm/fan
# Sensors: Use name-based matching to prevent breaking after reboots!
sensors:
- hwmon: /sys/class/hwmon
name: acpitz
indices: [1]
- hwmon: /sys/class/hwmon
name: nvme
indices: [1]
- hwmon: /sys/class/hwmon
name: thinkpad
indices: [1]
- hwmon: /sys/class/hwmon
name: coretemp
indices: [1]
# 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]
| Level | Approximate Fan Behavior | Activates When Temp Rises Above | Drops Back When Temp Falls Below |
|---|---|---|---|
| 0 | Fan off (silent) | — | — |
| 1 | Barely audible | 52°C | 50°C |
| 2 | Low hum | 60°C | 55°C |
| 3 | Moderate | 65°C | 60°C |
| 6 | Noticeable | 70°C | 65°C |
| 7 | Loud | 80°C | 75°C |
| auto | BIOS takes over | 85°C | 80°C |
Critical: ThinkPad levels (0-7), not PWM values. ThinkPad fans controlled via
tpacpi: /proc/acpi/ibm/fanuse discrete levels 0 through 7, plusautoanddisengaged. Do not use PWM values (0-255) — those only work with hwmon-based PWM fan control, which is a different driver. Using PWM values withtpacpiwill 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. The32767is 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 -nto 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/fanshould showcommands: 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. Many modern Linux distributions ship withpower-profiles-daemonpre-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, removepower-profiles-daemonfirst:sudo systemctl disable power-profiles-daemon sudo systemctl stop power-profiles-daemonRecommendation: 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),
thermaldis less commonly needed. The kernel’sintel_pstatedriver handles CPU frequency scaling natively, and thinkfan already provides direct fan control. Installingthermaldalongside thinkfan can cause conflicts since both try to manage thermal policy. If you are not using thinkfan,thermaldmay 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 Tried | Why 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 solution | Keeps 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)
| Mode | CPU Behavior | Fan Result |
|---|---|---|
| Power Saver | Caps CPU speed low | Fan quiet, but slow performance |
| Balanced | CPU ramps up freely for any task | Fan spins up unnecessarily for small tasks |
| Performance | Full CPU speed at all times | Fan loud constantly |
With thinkfan installed (thinkfan controls the fan)
| Mode | CPU Behavior | Fan Result |
|---|---|---|
| Power Saver | Caps CPU speed low | Fan silent (thinkfan keeps it off at low temps) |
| Balanced | CPU ramps up freely for any task | Fan stays quiet unless CPU genuinely gets hot |
| Performance | Full CPU speed at all times | Fan 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
-
Check that fan control is enabled in the kernel:
cat /proc/acpi/ibm/fanThe 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. -
Check that your sensor names are correct:
for i in /sys/class/hwmon/hwmon*/name; do echo "$i: $(cat $i)"; doneEnsure the names listed in
/etc/thinkfan.confperfectly match the actual names of your hardware sensors. -
Run thinkfan in the foreground to see the exact error:
sudo thinkfan -nThis 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.
-
Check the thinkfan log for errors:
sudo journalctl -u thinkfan -eLook for error messages about missing files or incorrect configuration.
After Kernel Updates
Kernel updates can sometimes reset the thinkpad_acpi module parameters. Because we used name-based matching in /etc/thinkfan.conf, you do not need to worry about hwmon numbers changing. However, if the fan randomly starts running loud again after a major system update, check if the kernel module option was reset:
sudo modprobe thinkpad_acpi fan_control=1
sudo systemctl restart thinkfan
Tip: The
/etc/modprobe.d/thinkpad_acpi.conffile you created in Step 2 ensures thatfan_control=1is applied automatically on every boot. You should rarely need to intervene manually.
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 real debugging sessions on a ThinkPad L14 Gen 2 running Linux Mint and Zorin OS. Every command was tested on actual hardware.
Related Guides
- System Requirements — Hardware compatibility and what was tested
- Fingerprint Login Setup — fprintd setup and ThinkPad fingerprint reader sleep-state fixes
- Log Analysis — Reading system logs for hardware diagnostics
- Common Issues — FAQ for common problems
Discussion