lm-sensors Explained: Reading Temperatures, Fans and Voltages
A fan that will not stop is either a cooling problem or a machine doing its job. sensors is how you tell which, and the readings need a little interpretation before they mean anything.
Setup
# Debian and Ubuntu
sudo apt install lm-sensors
# Fedora
sudo dnf install lm_sensors
# Arch
sudo pacman -S lm_sensors
sudo sensors-detect
It scans buses and asks before each probe. Accepting the defaults is the normal path. At the end it offers to write the detected modules to /etc/modules or equivalent, which is what makes the readings survive a reboot.
sudo systemctl restart lm-sensors # or just reboot
sensors
If output is sparse or empty, the modules for your chips are not loaded. sensors-detect is the fix; on some laptops you also need a vendor platform driver:
sudo modprobe coretemp # Intel CPU
sudo modprobe k10temp # AMD CPU
sudo modprobe nct6775 # common Super I/O chip, fans and voltages
sudo modprobe thinkpad_acpi # Thinkpads
sudo modprobe dell_smm_hwmon # some Dells
Reading the output
coretemp-isa-0000
Adapter: ISA adapter
Package id 0: +52.0C (high = +100.0C, crit = +100.0C)
Core 0: +50.0C (high = +100.0C, crit = +100.0C)
Core 1: +52.0C (high = +100.0C, crit = +100.0C)
nvme-pci-0400
Composite: +38.9C (low = -273.1C, high = +84.8C)
amdgpu-pci-0300
edge: +45.0C (crit = +100.0C, hyst = -273.1C)
junction: +48.0C (crit = +110.0C, hyst = -273.1C)
mem: +44.0C (crit = +105.0C, hyst = -273.1C)
Package id 0 is the whole CPU package, and the number to watch. Individual cores fluctuate constantly.
high and crit come from the hardware. crit is where the machine protects itself, by throttling hard or shutting down.
edge, junction, mem on AMD GPUs are different sensors on the same chip. junction is the hottest point and the one the card throttles on, so it reads highest and is the meaningful one.
Tctl versus Tdie on AMD
k10temp-pci-00c3
Tctl: +69.9C
Tdie: +49.9C
Tdie is the real die temperature. Tctl is a control value used for fan decisions, and on several Ryzen generations it carries a fixed offset, historically 20C on some parts.
If both appear, read Tdie. If only Tctl appears, treat it as possibly offset rather than as a genuine reading. A great many “my Ryzen idles at 70C” reports are this.
Temperatures worth worrying about
Rough guidance, and it depends heavily on the part:
| Reading | Desktop CPU | Laptop CPU |
|---|---|---|
| Idle | 30 to 45C | 40 to 60C |
| Load | 60 to 80C | 75 to 95C |
| Concerning | Sustained 90C+ | Sustained 100C |
A laptop hitting 95C under sustained load is normal. Thin chassis, small heatsink, a chip specified to run there and throttle rather than fail. It is not pleasant and it is not damage.
What actually indicates a problem:
- High idle temperatures. 70C doing nothing means poor contact, dust, or a fan that is not spinning
- A machine that used to be cooler. Dust and degraded thermal paste are gradual; a step change usually means a failed fan
- Throttling that costs you performance you need
- Temperature climbing until shutdown
Age is the usual culprit. Thermal paste degrades over a few years, and dust in a heatsink fin stack is remarkably effective insulation.
Distinguishing throttling from warmth
# current versus maximum frequency
grep MHz /proc/cpuinfo | head -4
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
# the kernel says so explicitly
sudo dmesg | grep -iE 'thermal|throttl'
# the definitive tool on Intel
sudo turbostat --interval 1
turbostat reports achieved frequency alongside the reason it is not higher, which separates thermal limits from power limits. They have different fixes: thermal is cooling, power is firmware configuration.
High temperature with frequency near maximum is not throttling. It is a chip working hard, which is what it is for.
Under load, generate some:
# all cores, 60 seconds
stress-ng --cpu 0 --timeout 60s &
watch -n1 sensors
Our CPU governor guide covers whether to trade peak speed for temperature, and power management covers the laptop case.
Fan speed
nct6798-isa-0290
fan1: 1048 RPM
fan2: 0 RPM
fan3: 834 RPM
0 RPM is usually correct. Modern boards stop case fans below a temperature threshold. A CPU fan reading zero under load is the problem case.
Values like -1 or absurd numbers mean the chip is reporting a channel that is not connected, which is a harmless artefact of generic detection.
Controlling it
# is anything writable
ls /sys/class/hwmon/hwmon*/pwm* 2>/dev/null
# interactive setup
sudo pwmconfig
sudo systemctl enable --now fancontrol
pwmconfig stops each fan in turn to work out which pwm file controls which fan reading, then writes /etc/fancontrol. It is noisy and slightly alarming to watch, and it works.
# /etc/fancontrol, roughly
INTERVAL=10
FCTEMPS=hwmon2/pwm2=hwmon1/temp1_input
MINTEMP=hwmon2/pwm2=40
MAXTEMP=hwmon2/pwm2=80
MINSTART=hwmon2/pwm2=150
MINPWM=hwmon2/pwm2=60
Most laptops expose nothing writable. Fan control lives in the embedded controller, and the firmware does not delegate it. Vendor modules sometimes help:
# Thinkpads, needs the module loaded with fan_control=1
echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkpad.conf
cat /proc/acpi/ibm/fan
Tools like nbfc-linux reverse-engineer specific models. Support is per-model and patchy, and overriding a manufacturer’s fan curve means you own the thermal outcome.
The underlying files
sensors is a presentation layer over sysfs, which matters when you want values in a script.
ls /sys/class/hwmon/
cat /sys/class/hwmon/hwmon1/name
cat /sys/class/hwmon/hwmon1/temp1_input # millidegrees
cat /sys/class/hwmon/hwmon1/temp1_label
# CPU package temperature, one number, no parsing
for h in /sys/class/hwmon/hwmon*; do
[ "$(cat "$h"/name 2>/dev/null)" = "coretemp" ] || continue
awk '{printf "%.1f\n", $1/1000}' "$h"/temp1_input
done
Or use the JSON output, which is far more robust than parsing the text:
sensors -j
sensors -j | jq '.["coretemp-isa-0000"]["Package id 0"].temp1_input'
Our sysfs guide covers the layout, and monitoring stacks covers graphing it over time, which is how you catch gradual degradation.
Drive temperatures come from elsewhere
NVMe drives appear in sensors output. SATA drives generally do not.
# SATA, via SMART
sudo smartctl -A /dev/sda | grep -i temp
# NVMe, directly
sudo nvme smart-log /dev/nvme0 | grep -i temp
# all drives, briefly
sudo hddtemp /dev/sd?
NVMe drives throttle at around 70 to 80C and it is common under sustained write load, particularly in a laptop or a cramped case. Our SMART guide and nvme-cli guide cover the rest.
Alerting on it
# ~/bin/tempcheck
#!/usr/bin/env bash
set -euo pipefail
threshold=85
temp=$(sensors -j | jq -r '.["coretemp-isa-0000"]["Package id 0"].temp1_input')
if (( ${temp%.*} > threshold )); then
logger -t tempcheck "CPU at ${temp}C, above ${threshold}C"
fi
Run it from a systemd timer rather than a cron job, so failures are visible in the journal.
Do not alert on single readings. Temperatures spike constantly, and an alert that fires every time a browser opens a tab gets ignored, which is worse than no alert.
Before blaming software
When a machine runs hot, the causes in order of likelihood:
- Dust in the heatsink fins. The single most common cause, and free to fix
- Degraded thermal paste, after three or so years
- A failed or failing fan. Check the RPM reading and listen
- Blocked airflow. A laptop on a duvet, a case against a wall
- A runaway process. Check top before anything else
- Firmware. Occasionally a BIOS update changes a fan curve, per our firmware guide
Software configuration is last on that list for a reason. Compressed air and a screwdriver fix more thermal problems than governor changes do.
Frequently Asked Questions
Why does sensors show nothing or almost nothing?
The hwmon kernel modules for your chips are not loaded. Run sensors-detect, accept the scan, and let it write the module list, then load them or reboot. On some laptops a vendor specific module such as a Thinkpad or Dell platform driver is what exposes the readings at all.
Is 90C dangerous for a CPU?
Not by itself on a laptop. Modern processors are specified to run into the nineties and throttle themselves before damage, and a thin laptop under sustained load reaching that is expected. What matters is whether it sits there while idle, and whether throttling is costing you performance you need.
What is the difference between Tctl and Tdie on AMD?
Tdie is the actual die temperature. Tctl is a control value the firmware uses for fan decisions, and on some Ryzen parts it carries a fixed offset that makes it read higher than reality. If both appear, read Tdie. If only Tctl appears, be aware it may be offset.
How do I know whether my CPU is thermally throttling?
Compare current frequency against the maximum while under load, and check the kernel log for thermal or clock throttled messages. turbostat reports the reason directly on Intel. A high temperature with frequency still near maximum is not throttling, it is just a warm chip working.
Can I control fan speed on Linux?
Sometimes. Desktop motherboards often expose writable pwm files under hwmon, which fancontrol and pwmconfig can drive. Most laptops keep fan control in the embedded controller and expose nothing, so you either use a vendor specific module where one exists or accept the firmware curve.
Is sensors-detect safe to run?
It probes hardware buses, and the prompts warn that some probes can be risky on some machines. In practice it is used routinely without incident. Answering yes to the defaults is the normal path, and if you would rather be cautious, decline the probes it marks as potentially dangerous.