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.
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) andthinkpad_acpidefaults, 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.
| 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 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 fanshows 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_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 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]
| 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. Ubuntu 24.04-based systems with GNOME/Zorin 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 paths are correct:
find /sys/class/hwmon/hwmon*/temp*_inputCompare 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. -
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 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.conffile you created in Step 2 ensures thatfan_control=1is 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.
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