收起左侧

[内测使用][仅HA500]让奥睿科 HA500 在 fnOS 下正确显示硬盘蓝灯

0
回复
16
查看
[ 复制链接 ]

3

主题

12

回帖

0

牛值

江湖小虾

给奥睿科 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 灭。

修复后盘位 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.serviceled-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:hdd0m8: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 接错可能影响完全无关的主板功能,所以这个问题不能靠“应该差不多”处理。
应用采用失败关闭策略:

  1. 安装向导要求手动输入 HA500
  2. 安装前只读检查 N5105、ASM1166、PCH GPIO 和 DMI/机箱指纹;
  3. 后台启动时再次检查;
  4. 任一检查失败,直接退出,不导出也不写入 GPIO。

参考 HA500 的 DMI 信息全部是 Default string,所以自动识别无法做到理论上的
百分百可靠,人工型号确认仍然必须保留。其他 NAS 型号请不要安装本应用。

安装方法

  1. 打开项目的 GitHub Actions 页面;
  2. 进入最新一次成功的 CI
  3. 在 Artifacts 下载 ha500-led-*
  4. 解压获得 .fpk
  5. 在 fnOS 应用中心选择“手动安装”;
  6. 向导中输入 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 上
使用。作者和贡献者不对使用造成的数据丢失、硬件损坏、系统故障、服务
中断或其他直接、间接损失承担责任,全部风险由使用者自行承担。

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则