最近我把家里那台 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.fpktad-module.fpk.sha256,校验 SHA256 之后,在飞牛应用中心选择手动安装。

当前这一版的下载地址:

也可以在 NAS 上直接装:

1
appcenter-cli install-fpk tad-module.fpk

仓库的 GitHub Actions 会在每次提交时跑测试并打包;推送和 manifest 版本一致的 v* 标签时,会自动创建 Release 并附上插件包。

温度口径

我刻意把「核心最高温」和「Package 原始温」拆开,就是为了不再跟飞牛桌面抢同一个数字。

  • 插件主显示走 RR 口径:Core N 最大值
  • Package 只作为对照,不覆盖飞牛自己的读数
  • CPU 控制风扇时,取所有 coretemp 节点中的最高值
  • 不读取无标签的 IT87 温度,也不会把 CPU 与 GPU 温度相加

打开界面后,插件会在首次硬盘刷新完成后检查 coretemp、IT87、风扇通道、仓位枚举和已识别硬盘的 SMART/NVMe 温度。异常会弹一次说明,并留在右上角「需要检查」里。空仓不会被当成温度故障。

功耗默认表

功耗页用来限制 Package 的 PL1 / PL2。默认值如下,数字都来自仓库 README,不是我另外估的:

CPUPL1(持续)PL2(短时)可调 PL1可调 PL2
N30515 W15 W6–硬件上限 WPL1–35 W
N1506 W15 W4–硬件上限 WPL1–25 W
N1006 W15 W4–硬件上限 WPL1–25 W

插件会读 constraint_*_max_power_uw。内核给出有效上限时,界面会收敛预设,后端也会拒绝超上限的配置。

N305 默认把 PL2 和 PL1 一起压到 15 W,避免 CPU 和核显联合负载在短时窗口里把 Package 功耗放得太高。降低 PL1/PL2 会牺牲一部分峰值性能;不同主板 BIOS 也可能锁 RAPL,写入被拒绝或回读不一致时,插件会报错,不会假装成功。

风扇和物理仓位

风扇功能默认关闭。插件只认 IT87 的标准 hwmon 节点:必须同时有 fanN_inputpwmNpwmN_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.00000: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

仓位和 GPIO 映射都是按 TAD6S4N10G 这块硬件核对过的。别的机型不能直接套;后续如果要支持,需要单独做映射表并验证。

评论