sensors命令能直接显示各核心温度,但需先加载coretemp(Intel)或k10temp(AMD)内核模块,否则仅输出“Adapter: Non-I2C bus”;若失效,可从/sys/class/hwmon或/sys/class/thermal读取毫摄氏度值并除以1000换算。

sensors 命令能直接显示各核心温度,但前提是 coretemp(Intel)或 k10temp(AMD)内核模块已加载;否则输出为空或只有 Adapter: Non-I2C bus —— 这不是命令失效,是驱动没就位。
sensors 命令为什么只显示 Adapter: Non-I2C bus
这是最常被误判为“系统不支持”的现象。根本原因在于:lm-sensors 本身只是读取工具,真正提供数据的是内核模块:coretemp(Intel CPU)、k10temp(AMD CPU)或 nct6775(部分主板)。这些模块默认不自动加载。
- 运行
sudo sensors-detect时,在Probe I2C adapter? (YES/no)提示处**必须输入 YES**,否则探测跳过,模块不会写入/etc/modules - 临时验证:Intel CPU 执行
sudo modprobe coretemp,AMD 执行sudo modprobe k10temp,再跑一次sensors - 检查是否生效:
lsmod | grep -E "(coretemp|k10temp)",无输出说明模块未加载 - 虚拟机(VMware/VirtualBox)、某些云镜像、ARM 平台(如树莓派)天然无对应传感器,
sensors必然无核心温度输出
/sys/class/hwmon 下怎么定位并读取单个核心温度
这个路径是内核原生接口,不依赖用户态工具,适合脚本、容器或 sensors 失效时应急使用。所有温度值单位统一为毫摄氏度(m°C),需除以 1000 得到实际摄氏度。
- 先列出所有监控目录:
ls /sys/class/hwmon/ - 逐个检查设备名:
for d in /sys/class/hwmon/hwmon*; do echo "$d:"; cat "$d/name" 2>/dev/null; done,找含coretemp或k10temp的目录(例如/sys/class/hwmon/hwmon2/) - 确认后读取:
cat /sys/class/hwmon/hwmon2/temp1_input通常是 Package 总温;temp2_input起才对应 Core 1、Core 2……但顺序不固定,需结合sensors输出或实测比对 - 注意命名差异:部分 AMD 系统用
in*_input,老主板可能用nct6775模块,文件名可能是temp*_input或fan*_input
/sys/class/thermal 怎么快速筛选出 CPU 核心相关温度节点
/sys/class/thermal 更侧重热策略管理,目录名带语义(如 cpu-thermal、x86_pkg_temp),比 hwmon 更易理解,但不是每个 thermal_zone* 都对应物理核心。
- 列出所有 zone 类型和温度:
for z in /sys/class/thermal/thermal_zone*; do [ -f "$z/type" ] && echo "$(cat $z/type): $(cat $z/temp 2>/dev/null) m°C"; done - 重点关注类型为
cpu-thermal、x86_pkg_temp或Processor的项;thermal_zone0不一定对应 CPU,thermal_zone1反而可能是 - 封装温度常用:
cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | awk '{printf "%.1f°C\n", $1/1000}',但该路径一般不暴露单核温度,仅提供整体或区域级读数
真正要拿到每个物理核心的独立实时温度,sensors 是唯一能稳定区分 Core 0、Core 1 等字段的方案;/sys/class/hwmon 虽底层可靠,但核心编号映射没有标准,不同主板、不同内核版本可能完全错位——别硬记 temp2_input == Core 1,务必先用 sensors 对照验证。


















