sensors 命令没有任何输出,或者只显示一些虚拟设备,通常不是温度不存在,而是系统还没运行 sensors-detect,也没有把 coretemp、k10temp 这类内核模块加载起来。更稳妥的做法是,先完成 I2C 适配器探测并加载对应模块;如果暂时不走这条路,也可以直接读取 /sys/class/hwmon 或 /sys/class/thermal 路径下以毫摄氏度保存的数值。

sensors 命令能直接显示 CPU 封装和各核心温度,但**必须先运行 sensors-detect 并加载对应内核模块**,否则大概率输出为空或只显示 Adapter: Non-I2C bus。
为什么 sensors 没输出或全是虚拟设备?
这不是命令坏了,是内核没加载传感器驱动:coretemp(Intel)、k10temp(AMD)、nct6775(部分主板)这些模块才是真正在读硬件的。
- 运行
sensors-detect时,在Probe I2C adapter?提示处必须输入YES,不能直接回车跳过 - 探测完成后,模块名会写入
/etc/modules;若没写,手动执行sudo modprobe coretemp k10temp - 检查是否生效:
lsmod | grep -E "(coretemp|k10temp)",无输出说明模块未就位 - 某些笔记本、ARM 设备(如树莓派)、虚拟机环境天然不支持这些模块,
sensors必然不可用
绕过 sensors-detect:直接读 /sys/class/hwmon
这个路径是内核原生暴露的,不依赖用户态工具,适合脚本、容器或嵌入式场景。所有温度值单位都是毫摄氏度(m°C),需除以 1000 才是实际摄氏度。
- 先定位含 CPU 传感器的目录:
ls /sys/class/hwmon/→ 逐个执行cat /sys/class/hwmon/hwmon*/name 2>/dev/null,找coretemp或k10temp - 确认后读取:
cat /sys/class/hwmon/hwmon2/temp1_input通常是 Package 总温,temp2_input起对应 Core 0、Core 1…(编号因平台而异) - 注意:有些 AMD 系统用
in*_input而非temp*_input,得实测;不同主板命名差异大,不能硬编码路径 - 实时刷新示例:
watch -n 1 'cat /sys/class/hwmon/hwmon2/temp1_input /sys/class/hwmon/hwmon2/temp2_input | awk "{printf "Package: %.1f°C\nCore 0: %.1f°C\n", $1/1000, $2/1000}"'
用 /sys/class/thermal 快速筛出 CPU 封装温度
这个子系统更侧重热策略管理,目录名带语义(如 x86_pkg_temp、cpu-thermal),比 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 - 重点关注类型为
x86_pkg_temp或Package id 0的 zone;cpu-thermal多为 ARM 或通用抽象,不一定等于封装温度 - 一键获取封装温度:
for z in /sys/class/thermal/thermal_zone*; do [ "$(cat $z/type 2>/dev/null)" = "x86_pkg_temp" ] && echo "Package → $(($(cat $z/temp 2>/dev/null)/1000))°C"; done - 数值单位统一为毫摄氏度,但部分老旧内核可能返回 0 或无效值,需配合
cat $z/mode看是否为enabled
sensors 是最省心的选择,但前提是探测和模块加载走对了;一旦失败,别死磕,立刻切到 /sys/class/hwmon 或 /sys/class/thermal —— 它们不依赖额外软件,也不受发行版包管理干扰,只是需要你多花几秒确认路径和单位。