返回首页

海康威视 R1 打造完美的 Ubuntu Server——风扇控制

在 Ubuntu Server 24.04 下为海康威视 R1 的 IT8613E Super I/O 安装社区驱动,实现风扇转速读取与分路 PWM 温控,让 NAS 像官方系统一样「该静就静」。

海康威视R1这台机器颜值、性价比都很高,功耗低、四盘位、N100、双2.5G网卡、板载EMMC、有两个NVME固态硬盘插槽,基本满足了我对NAS的需求。但机器自带的NAS系统不能当作普通Linux系统使用,所以机器到手第一时间就安装了Ubuntu Server 24.04系统(为了不破坏板载闪存上的原版系统,Ubuntu系统安装在NVME固态硬盘上,后续会庆幸这个英明的决定,哈哈)。 但海康威视R1这台机器当作一台7*24小时运行的Ubuntu服务器,存在几大硬伤:

一、机箱氛围灯无法关闭,虽然看着很酷炫

二、风扇无法控制转速,重负载时CPU温度会飙升到90度,平时无负载时风扇不减速或停止

三、前面板小屏幕无法关闭

经过一番折腾,以上问题全部解决,R1变身完美的Ubuntu Server!理论上这些经验也能用于飞牛Nas系统,但我没去尝试。

第二个问题,风扇转速控制

R1有两个风扇,一个机箱后面的大风扇,一个是cpu使用的小风扇。


换Ubuntu系统之后,风扇不能智能控制转速

安装Ubuntu之后:

  • sensors 里能看到 CPU、ACPI、NVMe 之类,却 没有 fan
  • /sys/class/hwmon/ 下面也 找不到 fan*_input,似乎根本不存在风扇;
  • 只要CPU负载上去温度就能轻易飙到90度,风扇似乎不工作(其实是不能智能调节)

问题在于 板子上的监控芯片太新,内核当时还没跟上


先搞清楚:风扇是谁在管

跑一遍(自动模式即可):

sudo sensors-detect --auto

R1 这类机型 上跑 sensors-detect --auto,芯片探测里通常会看到 ITE IT8613E(ISA 地址以终端输出为准)。CPU 是 N100,它自己 不管机箱风扇的 tach;真正和风扇 PWM、转速脉冲打交道的是这块 IT8613E

内核里还没有这个型号的驱动——换句话说,自带的 it87 模块装不上、也认不出, sysfs 里自然什么都没有。到这里,其实差一步:换一份社区维护的 it87 源码,用 DKMS 编进去


第一步:把 IT8613E「点亮」

依赖按常规装齐就行:

sudo apt update
sudo apt install -y dkms build-essential linux-headers-$(uname -r) git lm-sensors

驱动用的是 GitHub 上 frankcrawford/it87 这一支(仓库链接),对 IT8613E 这类比主线更友好。

下面这个坑我踩过:克隆下来的目录名必须是 it87。DKMS 安装脚本会用 当前目录名 去拼构建目标;如果你图省事克隆成 it87-frank 之类,编译阶段会报 找不到某某 .o,和代码没关系,纯命名问题。

cd /tmp
rm -rf it87
git clone --depth 1 https://github.com/frankcrawford/it87.git it87
cd it87
sudo ./dkms-install.sh

编完、modprobe 成功之后,sensors 里会出现 it8613-isa-xxxx 一块,电压、几路温度、fan2 / fan3 的 RPM、pwm2 往上都有——这时候才算 「看得见风扇了」

模块还要记得 开机加载。我写的是 /etc/modules-load.d/it87.conf,里面一行 it87 就够。DKMS 会跟着内核更新去重编,但 不会替你保证每次启动都 modprobe,这一步别省。

若你开了 Secure Boot,DKMS 模块签名要按发行版文档走一遍 MOK;没开的话一般无感。


第二步:fan2、fan3 分别是什么风扇

芯片里的编号很「程序员」:fan2 不一定等于主板丝印上的 FAN2`。最笨也最稳的办法,是自己做一个小实验:

/sys/class/hwmon/ 里找到 nameit8613 的那一个目录,记下当时的 pwmN 和各路 fan*_input。然后只动一路,比如把 pwm2 改成手动、占空比从 120 拉到 70,等几秒,看 哪一路 RPM 跟着掉。再换 pwm3 试一遍。

我当时的结果是:pwm2 只有 fan2 跟着变,动 pwm3 只有 fan3 跟着变fan4 一直是 0,调 pwm4pwm5 也没带动前两路——基本就当 空脚或未用 了。

转速上还能看出一点性格:一路偏低转、一路偏高转。偏低的那颗,多半是 机箱或风道的大扇;偏高的那颗,更像 CPU 散热风扇。我试验出来的结果是,fan2是机箱风扇,fan3是cpu风扇。


第三步:实现风扇的智能转速控制

N100 CPU的功耗很低,低负载时CPU风扇完全可以用非常低的转速,甚至短暂停转,机箱风扇也是一样,毕竟是铝合金机箱散热。还有就是这两个风扇的控制策略应该不同,CPU风扇转速只取决于CPU,而机箱风扇要兼顾硬盘以及整个环境温度。所以:

  • CPU 那颗小风扇:主要看 coretemp + 板载 it8613 里的温度,低温该停就停;
  • 机箱风扇:除了 CPU 和板载,还要把 nvme、以及 SATA 能读到的 drivetemp 拉进来——硬盘热了,加速通风散热

另外:参照一些其它的成品机器风扇策略,在开机和关机时短暂让风扇高速运转一会。


第四步:分路怎么写进脚本

我自己写了一个风扇智能控制脚本(起名随意,这里叫 fanctl-thermal),逻辑很简单:

  • 隔几秒读一圈 hwmon 的 temp*_input(记得单位是毫摄氏度,自己除 1000);
  • 每个 PWM 单独一条曲线:自己的温度源列表、低温阈值、高温阈值、PWM 上下限;
  • 加一点 滑动平均每步 PWM 变化上限
  • 紧急温度所有通道出现过的温度源并在一起取 max,谁爆表了两路一起 拉满,宁可吵一点。

drivetemp 这块:没有插入硬盘时,内核里可能根本没有对应的 hwmon,写了也不报错,就当多一个可选输入。有机械盘、内核能读到温的话,建议 modprobe drivetemp,再在 /etc/modules-load.d/ 里放一行 drivetemp,省得每次重启忘加载。

部署位置按自己习惯即可,我这边是:

  • 可执行:/usr/local/sbin/fanctl-thermal
  • 配置:/etc/fanctl-thermal.conf
  • systemd:/etc/systemd/system/fanctl-thermal.service

第一次跑通之后:

sudo systemctl daemon-reload
sudo systemctl enable --now fanctl-thermal.service
journalctl -u fanctl-thermal -f

日志里如果能看到 chassis / cpu 两路各算各的、目标 PWM 不一样,就说明 分路真的生效了


怎么验收、怎么微调

  • sensorsit8613fan2 / fan3 读数正常;
  • 轻负载时,能慢慢 爬到 PWM 0(机箱风扇能看到完全停转,CPU风扇没拆机不确定);
  • 往 SSD 拷大文件或故意让盘热一点时,机箱那路 应该比「只看 CPU」时 更勤快
  • journalctl 里两路日志。

调参没有银弹:多盘、夏天、机柜密闭 就把机箱那条曲线 收紧一点;觉得 CPU 扇停太晚,就动 [pwm3] 的低温阈值或平均窗口——窗口越小反应越快,但也越容易抖。


写在最后:

还是那句:自己机器自己负责


回过头看,整条路其实就是:社区驱动把芯片认出来 → sysfs 里把风扇和 PWM 对上号 → 再写一层「比官方笨一点、但听自己话」的温控。离「完美」肯定还有距离——毕竟海康原厂的策略和 EC 细节我们拿不到——但至少 Ubuntu Server 上的 R1,终于又像一个正常 NAS 那样会动态调节风扇转速了

文中硬件信息与命令基于公开资料与个人实践整理;具体编号、阈值请以你机器实测为准。

评论 (0)

暂无评论,来做第一个留言的人吧!

友善交流,支持匿名