最近我把家里那台 TAD6S4N10G 上的飞牛 fnOS 又折腾了一圈,最后做成了一个第三方模块:TAD6S4N模块。
仓库:
https://github.com/luodaoyi/TAD6S4N10G-fnos
写这篇文章时,当前版本是 0.10.0。一句话概括:按 RR CPUinfo 的口径看 CPU 核心最高温度,同时把 Package 原始温度、Package 功耗、风扇曲线、物理仓位和机箱 GPIO 按键放进同一个 fnOS 原生界面里。
只支持明确识别出的 Intel Processor N100、N150 和 Intel Core i3-N305。其他 CPU 会拒绝安装或启动。功耗、风扇、按键三页配置是分开保存的;保存当前页不会覆盖另外两页还没提交的改动。侧栏的「检查更新」只有点了才会去拉最新 Release,不会自动联网。
为什么飞牛自带的 CPU 温度不可靠
我一开始盯着飞牛资源监控里的 CPU 温度,总觉得它和实际手感对不上,红得也莫名其妙。后来在已经验证过的 fnOS 主机上把温度服务拆开看,原因很直接:
系统温度服务会枚举 coretemp,但只读取匹配到的第一个 temp*_input。这个节点就是 Package id 0。飞牛资源监控再把这个 Package 热点当成「CPU 温度」显示,并且用 65°C / 75°C 去着色告警。
Linux coretemp 本身读的是 Intel 数字温度传感器,不会把 CPU 和 GPU 温度相加。真正容易误导人的是:飞牛把 Package 热点当成了核心温度。Package 往往比单个 Core 更高,告警阈值又卡得比较紧,所以桌面上很容易提前变红。
RR 的 CPUinfo 做法是筛选标签为 Core N 的温度,再取最大值。这个模块沿用同一口径:
- 主卡片:所有
Core N里的最高温度 - 另一张卡片:所有
Package id N里的最高原始值 - 诊断区:列出每个
coretemp节点,方便自己核对
如果系统根本没有暴露任何 Core N 标签,才会回退到 Package 温度,并且明确标注。
模块不会改飞牛的私有温度服务、资源监控前端或告警阈值,所以桌面上原来的 Package 温度和红色告警还在。判断差异时,以插件里分开的两组读数为准。
安装 .fpk
从 GitHub Release 下载最新的 tad-module.fpk 和 tad-module.fpk.sha256,校验 SHA256 之后,在飞牛应用中心选择手动安装。
当前这一版的下载地址:
- Release:TAD6S4N模块 v0.10.0
- 包:https://github.com/luodaoyi/TAD6S4N10G-fnos/releases/download/v0.10.0/tad-module.fpk
- 校验:https://github.com/luodaoyi/TAD6S4N10G-fnos/releases/download/v0.10.0/tad-module.fpk.sha256
也可以在 NAS 上直接装:
| |
仓库的 GitHub Actions 会在每次提交时跑测试并打包;推送和 manifest 版本一致的 v* 标签时,会自动创建 Release 并附上插件包。
温度口径
我刻意把「核心最高温」和「Package 原始温」拆开,就是为了不再跟飞牛桌面抢同一个数字。
- 插件主显示走 RR 口径:
Core N最大值 - Package 只作为对照,不覆盖飞牛自己的读数
- CPU 控制风扇时,取所有
coretemp节点中的最高值 - 不读取无标签的 IT87 温度,也不会把 CPU 与 GPU 温度相加
打开界面后,插件会在首次硬盘刷新完成后检查 coretemp、IT87、风扇通道、仓位枚举和已识别硬盘的 SMART/NVMe 温度。异常会弹一次说明,并留在右上角「需要检查」里。空仓不会被当成温度故障。
功耗默认表
功耗页用来限制 Package 的 PL1 / PL2。默认值如下,数字都来自仓库 README,不是我另外估的:
| CPU | PL1(持续) | PL2(短时) | 可调 PL1 | 可调 PL2 |
|---|---|---|---|---|
| N305 | 15 W | 15 W | 6–硬件上限 W | PL1–35 W |
| N150 | 6 W | 15 W | 4–硬件上限 W | PL1–25 W |
| N100 | 6 W | 15 W | 4–硬件上限 W | PL1–25 W |
插件会读 constraint_*_max_power_uw。内核给出有效上限时,界面会收敛预设,后端也会拒绝超上限的配置。
N305 默认把 PL2 和 PL1 一起压到 15 W,避免 CPU 和核显联合负载在短时窗口里把 Package 功耗放得太高。降低 PL1/PL2 会牺牲一部分峰值性能;不同主板 BIOS 也可能锁 RAPL,写入被拒绝或回读不一致时,插件会报错,不会假装成功。
风扇和物理仓位
风扇功能默认关闭。插件只认 IT87 的标准 hwmon 节点:必须同时有 fanN_input、pwmN、pwmN_enable,并且转速大于 0 RPM 才会列出来。没检测到驱动时,风扇页顶部会给红色警告,并指向 fnos-it87-kmod。插件自己不会自动加载内核模块,也不会改 force_id 或驱动参数。
CPU、HDD、NVMe 三条曲线可以分别绑一个或多个风扇。目标 PWM 永远取最高值,所以任何一侧先热都会先提速。默认曲线:
- CPU:40°C / 60%、55°C / 70%、70°C / 85%、80°C / 100%
- HDD / NVMe:25°C / 最低转速、35°C / 85%、50°C / 100%
- 紧急满速:85°C
- 风扇采样间隔:2 秒
HDD 曲线可选 SATA 1–6,NVMe 曲线可选 M.2 1–4,控制只取已勾选槽位的最高温度;全部取消则这类曲线不参与控制。槽位温度缓存大约 60 秒刷新一次,不会为了 2 秒风扇轮询频繁唤醒 SATA 盘。
仓位映射走稳定的 /dev/disk/by-path,只针对这块主板和背板,不能按 sda / sdb 猜物理位置:
- 前置 SATA:控制器
0000:02:00.0的 ATA 端口 1–6;界面按机箱正面从左到右显示为 6、5、4、3、2、1 - 四个 M.2:依次对应
0000:04:00.0到0000:07:00.0 - 图形盘位卡片按前置 SATA 6 → 1,以及 M.2 4 / 2 / 3 / 1 排布
界面每 5 秒刷新一次状态,SMART/温度后台缓存大约 60 秒。普通刷新不会为了读健康或电源状态去叫醒休眠盘。
GPIO 按键和安全回滚
按键功能也是默认关闭。插件以 root 只读访问 /dev/port,每 100 ms 读一次固定 GPIO,并做 100 ms 消抖:
- 复制键:
0xA04/bit6 - 网络键:
0xA00/bit3 - 后置重置键:
0xA03/bit6
每个键都能分别配短按、长按 3 秒、长按 9 秒、长按 15 秒松开后的动作。内置动作包括无动作、只记日志、刷新仓位、刷新仓位并检查 SMART、重新应用插件配置。也可以自己写 Bash 脚本再绑上去;脚本只有点了「保存按钮控制」才会持久化。
自定义脚本以 root 跑 /bin/bash --noprofile --norc,单次最长 30 秒。脚本可以改系统数据,插件不会审查它安不安全,只保存自己完全信任的内容。GPIO 地址和位号是写死的硬件映射,界面不能改成任意 I/O 读写器。
回滚我按「能恢复到装之前」来做:
- 第一次应用功耗限制前,把每个
package-*的原始 PL1/PL2 存进 fnOS 持久化应用数据目录 - 写入后立刻回读校验;任一 Package 失败就尝试回滚本轮修改
- 每 5–300 秒校验并重应用,避免休眠恢复或系统服务把限制盖掉
- 在应用中心停止或卸载时,恢复首次安装前捕获的限制
- 第一次启用风扇曲线前,单独保存原始 PWM 和控制模式;停止、卸载或关闭曲线时恢复 BIOS 自动模式
- 温度读失败、风扇转速丢失或 PWM 写入异常时,已捕获通道切到 100% 做故障保护
- 不修改 BIOS、内核、GRUB、飞牛系统服务、驱动参数或飞牛温度告警配置
仓库和 Release
- 仓库:https://github.com/luodaoyi/TAD6S4N10G-fnos
- 最新 Release:https://github.com/luodaoyi/TAD6S4N10G-fnos/releases/tag/v0.10.0
- 全部 Release:https://github.com/luodaoyi/TAD6S4N10G-fnos/releases
仓位和 GPIO 映射都是按 TAD6S4N10G 这块硬件核对过的。别的机型不能直接套;后续如果要支持,需要单独做映射表并验证。
评论