给奥睿科 HA500 安装 fnOS 后,我遇到了一个不影响存储功能、但每天看着都很
难受的问题:前面板硬盘灯完全不反映真实盘位。有盘的位置不一定亮,空盘位
反而可能一直亮。
经过一轮排查,我确认问题并不在硬盘、ASM1166 驱动或 SATA 识别,而是 HA500
的前面板灯使用了厂商自己的 GPIO 控制方式。最终我把五个蓝色盘位灯做成了
一个原生 fnOS FPK 应用,目前已公开源码。
项目地址:https://github.com/wayyoungboy/fnos-ha500-led
当前版本:0.0.1
重要提示:项目目前处于测试阶段,不是奥睿科或飞牛官方项目。应用会以
root 权限操作 GPIO,仅适用于确认型号的 HA500。作者和贡献者不对数据
丢失、硬件损坏、系统故障、服务中断或其他直接、间接损失承担责任。安装
或使用即表示使用者自行评估并承担全部风险。
最终效果
- 盘位有硬盘:对应蓝灯常亮;
- 盘位没有硬盘:对应蓝灯熄灭;
- 不依赖
/dev/sda、/dev/sdb 的易变顺序;
- 应用停止或卸载:五个受管蓝灯全部熄灭;
- 非 HA500 或硬件指纹不匹配:拒绝写 GPIO。
参考机器上装有 3 块 SATA 盘,分别位于盘位 1、3、4。应用运行后正好是
1、3、4 亮,2、5 灭。

如果论坛编辑器不支持 Markdown 图片,可使用上面的图片地址手动插图。照片中
的电源、STATUS 和 NETWORK 灯不由本应用控制。
已验证环境
这不是“所有 fnOS 都已经验证”的通用驱动。目前只在下面这套环境测试:
| 项目 |
版本/型号 |
| NAS |
奥睿科 HA500 |
| fnOS |
v1.2.0302(Debian 12 / bookworm) |
| trim 软件包 |
1.2.0302 |
| 内核 |
6.18.18.c938-trim,x86_64 |
| Python |
3.11.2 |
| CPU |
Intel Celeron N5105 |
| SATA 控制器 |
ASMedia ASM1166 |
其他 fnOS 版本、内核版本、硬件批次和其他 NAS 型号没有完成实机验证。系统
升级后也建议重新确认灯态和 GPIO 兼容性。
为什么 fnOS 默认没有正确驱动
系统里的通用 set_gpio-init.service 和 led-set.service 会读取
/boot/board.json,但 HA500 原厂系统没有用这套描述文件。原厂 OpenWrt
真正负责灯控的是私有程序:
/usr/sbin/linkmate.m8.nas.hw
它通过 /dev/mem 操作 Intel Jasper Lake PCH pad,并向原厂系统暴露
linkmate.m8.nas.hw.led UBus 对象。换成 fnOS 后,原厂守护进程不存在,
前面板灯自然只会停留在 BIOS/固件留下的电平。
映射是怎么找到的
我从设备所有者自己备份的原厂 OpenWrt eMMC 镜像中提取了上述守护进程。
二进制没有放进开源仓库,只记录校验值和恢复出的硬件事实:
SHA-256:
bd73089ad069dbdd31437f2c1c06d7aff3d8307e3e8725b2bd83821818a621c7
程序里能找到 m8:blue:hdd0 到 m8:blue:hdd4 等 14 个前面板灯对象。
结合静态分析、Linux pinctrl 信息和逐路实机测试,五个蓝灯对应的 Intel GPIO
offset 是:
| 物理盘位 |
ATA 端口 |
GPIO offset |
| 1 |
1 |
75 |
| 2 |
2 |
261 |
| 3 |
3 |
100 |
| 4 |
4 |
260 |
| 5 |
5 |
256 |
这里还有一个容易踩坑的点:HA500 蓝灯是低电平点亮,也就是 GPIO 0 亮、
1 灭。第一轮测试曾经出现过灯态完全相反,实机确认后才修正极性。
应用怎么判断物理盘位
/dev/sda 不是固定盘位,重启或换盘后顺序可能改变。因此服务会沿
/sys/block/<设备>/device 的符号链接找到真实 ataN,再把 ATA 1–5 映射
到 HA500 盘位 1–5。
GPIO 全局编号同样没有写死。程序先按 INT34C8:00 标签找到 PCH GPIO
控制器,读取当前动态 base,再计算 base + offset。这比直接写参考机器上的
587、773 等全局编号稳妥。
非 HA500 会发生什么
GPIO 接错可能影响完全无关的主板功能,所以这个问题不能靠“应该差不多”处理。
应用采用失败关闭策略:
- 安装向导要求手动输入
HA500;
- 安装前只读检查 N5105、ASM1166、PCH GPIO 和 DMI/机箱指纹;
- 后台启动时再次检查;
- 任一检查失败,直接退出,不导出也不写入 GPIO。
参考 HA500 的 DMI 信息全部是 Default string,所以自动识别无法做到理论上的
百分百可靠,人工型号确认仍然必须保留。其他 NAS 型号请不要安装本应用。
安装方法
- 打开项目的 GitHub Actions 页面;
- 进入最新一次成功的
CI;
- 在 Artifacts 下载
ha500-led-*;
- 解压获得
.fpk;
- 在 fnOS 应用中心选择“手动安装”;
- 向导中输入
HA500,安装并启动。
【建议插图 3:fnOS 应用中心里的 HA500 硬盘灯应用】
CI 和可复现构建
仓库已经配置 GitHub Actions。每次提交会自动执行 Python 单元测试、FPK
结构校验、版本一致性检查和 ShellCheck,再从 FNOS 官方静态站下载固定版本
的 fnpack。下载的二进制必须通过固定 SHA-256 才会参与构建,最终 FPK 和
校验文件作为 Actions Artifact 保存。
本地也可以构建:
python3 -m unittest discover -s tests -v
python3 scripts/validate_package.py
fnpack build -d ha500-led
当前限制和后续计划
0.0.1 只做“有盘亮、空盘灭”,暂时没有读写闪烁。红色故障灯中有四路被
ACPI/pinctrl 锁定,目前不会尝试强行控制。这样功能少一些,但不会为了灯效
冒主板 GPIO 风险。
后续如果继续开发,计划优先考虑:
- 读写活动闪烁;
- GPIO character-device ABI;
- 状态灯和网口灯;
- 将不同 NAS 型号做成相互隔离、必须实机验证的硬件 profile。
欢迎 HA500 用户测试反馈。反馈时请附上 fnOS 版本、内核版本、实际插盘位置和
灯态;其他型号不要直接套用 GPIO 表。
项目地址:https://github.com/wayyoungboy/fnos-ha500-led
声明:本项目不是奥睿科或飞牛官方项目。原厂固件和二进制不随仓库分发。
项目仍处于测试阶段,操作 GPIO 有硬件风险,请只在确认型号的 HA500 上
使用。作者和贡献者不对使用造成的数据丢失、硬件损坏、系统故障、服务
中断或其他直接、间接损失承担责任,全部风险由使用者自行承担。