海康威视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/ 里找到 name 为 it8613 的那一个目录,记下当时的 pwmN 和各路 fan*_input。然后只动一路,比如把 pwm2 改成手动、占空比从 120 拉到 70,等几秒,看 哪一路 RPM 跟着掉。再换 pwm3 试一遍。
我当时的结果是:动 pwm2 只有 fan2 跟着变,动 pwm3 只有 fan3 跟着变;fan4 一直是 0,调 pwm4、pwm5 也没带动前两路——基本就当 空脚或未用 了。
转速上还能看出一点性格:一路偏低转、一路偏高转。偏低的那颗,多半是 机箱或风道的大扇;偏高的那颗,更像 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:
sensors里 it8613 下fan2/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.d → enable --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 的输出。