返回首页

海康威视 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使用的小风扇。


换系统之后,风扇到底怎么了

官方系统里,你至少还有触控屏或 App 里那几档风扇模式,背后其实是 带温度参与的调速。N100 这种小功耗 U,低温时 停转或极低速 并不离谱。

Ubuntu 装完,常见情况是:

  • sensors 里能看到 CPU、ACPI、NVMe 之类,却 没有 fan
  • /sys/class/hwmon/ 下面也 找不到 fan*_input,像风扇根本不存在;
  • 噪音和官方系统一比,明显 更吵或更「呆」——因为没人替你在内核里把那块 Super I/O 聊明白。

所以问题不在「Ubuntu 故意阉割」,而是 板子上的监控芯片太新,主线内核当时还没跟上


先搞清楚:风扇是谁在管

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

sudo sensors-detect --auto

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

接下来就比较搞心态了:sensors-detect 会告诉你,主线里还没有这个型号的驱动——换句话说,自带的 it87 模块装不上、也认不出, sysfs 里自然什么都没有。到这里,如果你只盯着发行版自带的包,很容易以为「Linux 就是不行」,其实差一步:换一份社区维护的 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 散热片旁边的小家伙。要 100% 对号入座,最终还是 拆机看线 最准;如果后来发现接反了,后面温控配置里 把两路策略对调 就行,逻辑不用重写。


第三步:想接近官方,得接受「PWM 可以写到 0」

官方那种 CPU 不忙时风扇停一会儿,在 Linux 里等价于:低温时目标 PWM 允许是 0,而不是死守着「最低 30%」那种桌面主板思路。

这里有个细节很容易忽略:如果你把 nvme 的温度和 CPU 一起做 max(),SSD 待机温度往往比 N100 的 CPU 还「倔强」,结果是 CPU 已经凉透了,风扇还在转——和官方体验差一截。我的做法是 分路

  • CPU 那颗小扇:主要看 coretemp + 板载 it8613 里的温度不绑 NVMe,低温该停就停;
  • 机箱那颗:除了 CPU 和板载,还要把 nvme、以及 SATA 能读到的 drivetemp 拉进来——盘热了,风道先顶上,这才像 NAS 该干的事。

另外:systemctl stop 温控服务的时候,别留在 PWM 0。进程退出前我会 故意把两路都拉高一段,避免人走了、服务停了、风扇还睡在 0 档那种尴尬局面。


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

我自己写了一个小常驻进程(起名随意,这里叫 fanctl-thermal),逻辑不玄乎:

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

drivetemp 这块:没有兼容的盘或客户端时,内核里可能根本没有对应的 hwmon,写了也不报错,就当多一个可选输入。有 SATA 盘、内核能读到温的话,建议 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 不一样,就说明 分路真的生效了——比「两路绑同一个温度」要顺眼得多。


怎么验收、怎么微调

心里可以过一遍这样的 checklist:

  • sensorsit8613fan2 / fan3 读数正常;
  • 夜里轻负载时,CPU 那路 能慢慢 爬到 PWM 0(能不能完全停转还看风扇和主板,有的会剩一点点转);
  • 往 SSD 拷大文件或故意让盘热一点时,机箱那路 应该比「只看 CPU」时 更勤快
  • journalctl 里两路日志 别串台

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


写在最后:别和散热赌运气

改 PWM 本质上是在 和热量博弈。新曲线上去之后,多看几天 CPU、NVMe、(若有)硬盘 SMART 里的温度,比只看「安静了」重要得多。停转策略 在重负载、高环温下不一定适合所有人;拆机、刷机、改风扇也都不在厂商保修的舒适区里——这些老话还是那句:自己机器自己负责


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


同目录下的配套文件(可直接用)

与本文 Markdown 放在同一目录 下,还有最终方案用到的脚本和配置,便于打包下载或拷进新机:

文件 说明
fanctl-thermal.py 温控主程序(Python 3,仅标准库)
fanctl-thermal.conf 默认分路配置(机箱 pwm2 / CPU pwm3,可按实测改)
fanctl-thermal.service systemd 单元
modules-load-d-it87.conf 安装到 /etc/modules-load.d/it87.conf,开机加载 it87
modules-load-d-drivetemp.conf 安装到 /etc/modules-load.d/drivetemp.conf,开机加载 drivetemp
install-fanctl-thermal.sh 一键安装apt 依赖 → git 克隆并 DKMS 安装 frankcrawford/it87(若 sysfs 里已有 it8613 则自动跳过)→ 安装 fanctl + systemd + modules-load.denable --now 温控服务

该目录所在机器 上执行(需能 sudo、装驱动阶段需 联网):

chmod +x install-fanctl-thermal.sh
./install-fanctl-thermal.sh

可选参数:--skip-driver(你已自己装好 it87)、--skip-fanctl(只重装驱动)。./install-fanctl-thermal.sh --help 可看说明。

若启用 Secure Boot,DKMS 模块签名按发行版处理 MOK;脚本不包含驱动源码,运行时从 GitHub 浅克隆

若你只想手动拷文件,也可打开脚本对照其中的 install 路径自行操作。


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

发布说明:正文与配套脚本已做「可公开」处理——不写死具体 DMI 产品串、序列号、网卡 MAC、内网 IP 等;氛围灯脚本默认使用 占位式 product_name 匹配,实机须在 /etc/default/hkvr1-ambient 中改为本机 dmidecode -s system-product-name 的输出。