rasdaemon 项目深度解析

工作目录 /work 中包含多个项目,最近活跃且带 CLAUDE.md 的项目是 /work/work/git_code/rasdaemon(最新提交 2026-06-02,当前版本 0.8.4,2025-11-20 发布)。下面所有分析均基于此项目源代码与文档。


一、项目作用(它是什么?解决什么问题?)

rasdaemon 是 Linux 内核 RAS(Reliability, Availability, Serviceability,可靠性、可用性、可服务性) 事件的用户态守护进程,由 Mauro Carvalho Chehab 主导,2013 年作为 edac-utils 的替代品启动,现已发展为覆盖 CPU、内存、PCIe、CXL、ARM、磁盘等多种硬件错误的统一采集/分析框架。

1. 核心定位

  • 取代老化的 edac-utils:在内核 3.5 引入 HERM(Hardware Event Report Method)/ EDAC 3.0 之后,内核不再通过 sysfs 暴露单调递增的内存错误计数(因丢失时间维度信息,无法识别错误突发与稀疏)。
  • 统一事件来源:把内核 ras:* 跟踪事件(mc_eventaer_eventnon_standard_eventarm_eventcxl_*memory_failure_eventextlog_event 等)汇总到同一个守护进程中。
  • 决定权交给用户态:把"什么算异常、是否需要更换硬件"这种策略判断从内核移到用户态,并通过 SQLite 持久化 留存历史事件供后期挖掘。
  • 对接上游服务:支持把事件转发到 syslog/journald、ABRT 报告器、OpenBMC SEL(IPMI 风格的 System Event Log)。

2. 主要目标场景

  • 数据中心 / 服务器硬件健康监测(MCE、PCIe AER、CXL 介质错误)。
  • 国产 ARM 平台(华为鲲鹏/飞腾、海思、Zhaoxin、Yitian、算能/Ampere、NVIDIA)非标准错误解码。
  • 预测性故障分析:基于 Corrected Error 计数做 PFA(Predictive Failure Analysis),自动隔离已损坏的内存页 / CPU 核。

二、编译与使用

1. 依赖

类型 包名(Fedora) 说明
必装 make gcc autoconf automake libtool libtraceevent-devel libtraceevent 是强依赖(取代早期内嵌的 trace-cmd 库)
存储 sqlite-devel perl-DBD-SQLite 启用 SQLite 持久化事件
PCIe pciutils-devel --enable-aer 解析 PCI 设备
其它 dmidecode hwdata gettext-devel perl-generators systemd RPM 打包与运行需要

注:spec 中 ExcludeArch: s390 s390x,因此 s390 系列不打包。

2. 三种编译流程

(a) 常规 autotools 编译

autoreconf -vfi
./configure [options]
make
sudo make install

(b) RPM 打包(mock 方式)

autoreconf -vfi && ./configure   # 生成 misc/rasdaemon.spec
sudo make mock                   # 输出到 SRPMS/
sudo rpm -i $(ls SRPMS/rasdaemon-*.rpm | tail -1)

© CI 矩阵.github/workflows/ci.yml):在 Ubuntu(x86_64 / aarch64 / ppc64le,配置 --disable-all--enable-all)、Fedora rawhide(x86_64 mock)、openEuler LTS(aarch64)三种环境构建并验证。

3. 关键 configure 选项

选项 功能
--enable-all 一键启用所有功能
--enable-sqlite3 启用 SQLite 持久化(必需 ras-mc-ctl 才能查历史)
--enable-aer PCIe AER 错误(依赖 libpci)
--enable-mce x86 MCE 事件
--enable-arm ARM 硬件错误
--enable-cxl CXL 内存协议事件(spec 3.0/3.1/3.2)
--enable-extlog 旧式 Extended Log(BIOS 错误上报)
--enable-non-standard 厂商非标准事件(总开关)
--enable-hisi-ns-decode HiSilicon HIP08 解码(华为鲲鹏 920 等)
--enable-amp-ns-decode Ampere Altra/AmpereOne 解码
--enable-nvidia-ns-decode NVIDIA Grace/BlueField 解码
--enable-jaguar-ns-decode 嘉楠耘智 Jaguar Micro 解码
--enable-yitian-ns-decode 海光 Yitian 解码
--enable-openbmc-unified-sel OpenBMC 统一 SEL(IPMI)
--enable-abrt-report 转发到 ABRT 自动 bug 报告器
--enable-memory-failure 内存失败事件 + 页面隔离
--enable-cpu-fault-isolation CPU 故障在线隔离
--enable-diskerror 块设备 / SCSI 错误
--enable-signal 信号事件(含 SIGBUS)
--enable-devlink devlink 健康事件
--enable-memory-ce-pfa / --enable-memory-row-ce-pfa 内存 CE 预测性故障分析(单条 / 行级)
--enable-rier 实际上没有此名,应为新增的 RERI 处理器(见下)

4. 运行与配套工具

sudo rasdaemon                # 守护进程模式(默认)
sudo rasdaemon -f             # 前台运行,日志到 stdout
sudo rasdaemon -f -r          # 前台 + 写入 SQLite
sudo rasdaemon -e             # 一次性开启 RAS trace 事件
sudo rasdaemon -d             # 一次性关闭 RAS trace 事件
sudo rasdaemon -p --status <HEX> --ipid <HEX> --smca \
                --family <F> --model <M> --bank <B>   # AMD SMCA 后处理
sudo systemctl start rasdaemon

辅助工具:

  • ras-mc-ctl(Perl 实现):DIMM 标签、错误统计、布局打印、SQLite 检索、厂商平台错误查询、mainboard 标签导入(Dell / HPE / Lenovo / Supermicro / Gigabyte / ASUS / ASRock / Intel / Apple 等已在 labels/ 内置)。
  • contrib/edac-fake-injectcontrib/mc_event_triggercontrib/mem_fail_triggercontrib/qemu_einj.py:用于内核侧的 EDAC 注入、AER 注入、MCE 注入及 QEMU APEI 注入测试。

5. 输出与日志

  • 默认写 syslog;启 rsyslog 规则可分流到 /var/log/rasdaemon
  • 仓库自带 config/ 下的 rsyslog / syslog-ng / logrotate 模板。

三、具体功能(功能矩阵)

configure.ac 的 18+ 个开关统计,rasdaemon 支持如下事件域与功能:

1. 通用事件后端

  • ras-events.c 主事件循环,基于 libtraceevent + kbuffer;按 CPU 启动 pthread 多线程采集(/sys/kernel/debug/tracing/per_cpu/cpu*/trace_pipe_raw),后分发到各领域 handler。
  • trigger.c 注册 event_trigger(mc_event / aer_event / memory_failure_event)实现 trace 内核级过滤。
  • SQLite 存储层(ras-record.c)按事件类型分表,含完整 schema 字段(顶层事件字段、CPU、拓扑、内存位置等)。
  • ras-logger.h 提供 ALERT / CRIT / ERROR 三个日志级别。
  • ras-erst.c 支持 WHEA ERST(Error Record Serialization Table)持久化与回放。

2. CPU / MCE 域

  • 通用 ras-mce-handler.c
  • 专用解码器(mce-*.c):
    • Intel:P4/P6、Nehalem、Dunnington、SB、IVB、Haswell、Broadwell-DE/EPEX、Skylake-Xeon、KNL、Icelake/I10nm、Granite Rapids、Sierra Forest、Clearwater Forest。
    • AMD:K8、SMCA(含 Family/Model/MCA Bank 解码)、Ampere 旁路。
    • Zhaoxin:KH50000 等国产 x86。
  • 离线解码:rasdaemon -p --status/--ipid/--smca/--family/--model/--bank 可在没有 trace 的情况下对寄存器值解码。

3. 内存 / EDAC 域

  • ras-mc-handler.c 处理 mc_event
  • ras-page-isolation.c 将不可纠正错误所在页通过 soft_offline_page/hard_offline_page 隔离。
  • PFA(Predictive Failure Analysis):--enable-memory-ce-pfa / --enable-memory-row-ce-pfa,基于 Corrected Error 阈值在时间窗口内累计判断是否主动下线 DIMM/行。
  • ras-poison-page-stat.c 内存毒化页统计。

4. PCIe AER

  • ras-aer-handler.c 处理 aer_event,打印 PCI 设备名 + Vendor/Device ID。

5. ARM

  • ras-arm-handler.c 处理 arm_event,覆盖 AArch64 RAS 扩展。

6. CXL(Compute Express Link)— 当前重点投入

  • ras-cxl-handler.c 支持 CXL spec 3.0 / 3.1 / 3.2 的多种事件:
    • Common Event Record(CME / Header / Generic)
    • DRAM Event Record(含内存事件类型与 CXL 3.1 字段)
    • Memory Module Event
    • General Media Event
    • Component Identifier 格式化
    • 内存备用(Sparing)事件
    • CXL 内存阈值事件(corrected memory error threshold)
    • 线性缓存地址别名(linear cache address alias)

7. 其它内核事件

  • ras-extlog-handler.c —— BIOS 错误扩展日志。
  • ras-devlink-handler.c —— devlink 健康上报(NIC/交换机)。
  • ras-diskerror-handler.c —— 块设备 / SCSI sense 解码。
  • ras-memory-failure-handler.c —— memory_failure trace + 页面隔离。
  • ras-signal-handler.c —— 信号相关事件(如 SIGBUS 跟踪,2024 起加入)。
  • ras-non-standard-handler.c + 多个 non-standard-*.c —— 厂商非标准 SAE / OEM 解码(HiSilicon/Ampere/NVIDIA/Jaguar/Yitian)。
  • ras-reri-handler.c(2026 新增)—— RISC-V RERI(RAS Error Report Register Interface,RISC-V 配置文件扩展)。
  • ras-cpu-isolation.c —— 基于统计的 CPU 在线/下线自动隔离(--enable-cpu-fault-isolation)。

8. 集成

  • ABRT 报告(--enable-abrt-report):通过 UNIX socket 把事件提交到 ABRT daemon(ras-report.c)。
  • OpenBMC 统一 SEL(--enable-openbmc-unified-sel):向 OpenBMC 写入 IPMI SEL,BMC 上层可直接消费。
  • unified-sel.c 处理 AER Uncorrectable 写入 SEL。

四、业界使用情况

注:环境内网络受限(WebSearch/WebFetch 被拒),以下信息来自仓库自身证据(CI 矩阵、spec、git log、提交作者机构、协作者署名),并结合行业一般认识。

1. Linux 发行版打包

CI 工作流显示官方明确适配 Ubuntu(含 x86_64 / aarch64 / ppc64le)Fedora rawhide(mock + RPM)openEuler LTS(aarch64)。在以下发行版仓库内可直接安装:

  • Fedora / RHELrasdaemonedac-utils 之后的官方包,spec 文件已写明 Requires: dmidecode hwdata perl-DBD-SQLite libtraceevent,并提供 systemd unit。
  • openEuler:作为国产服务器 OS 的标配,专门有 aarch64 编译矩阵。
  • Ubuntu / Debian:在 universe/main 中提供 rasdaemon 包。
  • SUSE / openSUSE:通过 devel:languages:perl / hardware 仓库。
  • Arch Linux(AUR):社区打包。

2. 服务器与硬件厂商

  • Huawei(华为):多位维护者(mchehab+huawei@kernel.org),贡献了 CXL handler、海思 HiSilicon HIP08/HiSilicon common 解码、Yitian 解码、内存 PFA、CPU 隔离、CXL memory sparing 等重要功能;OpenEuler CI 也由其驱动。是该项目的实质主推厂商。
  • Ampere Computing(Ampere Altra / Altra Max / AmpereOne):贡献 non-standard-ampere.c
  • NVIDIA(Grace / BlueField / DGX):贡献 non-standard-nvidia.c
  • 嘉楠耘智 / Jaguar Micro(国产 RISC-V/AI 加速):贡献 non-standard-jaguarmicro.c
  • 海光(Hygon)Zhaoxin KH50000 系列:贡献 non-standard-zhaoxin.cmce-zhaoxin-kh50000.c
  • OpenBMC 生态:与开源 BMC 固件(Intel、Huawei、Wiwynn 等)联动。
  • Linux 基金会 / kernel.orgMauro Carvalho Chehab(内核 EDAC 子系统维护者)长期主导。
  • Qualcomm(高通):早期贡献部分 trace event 框架代码(ras-events.c 头注释标注 2016 Qualcomm)。

3. 数据中心 / 公有云

  • 作为 Linux 内核 推荐的 RAS 事件采集标准(内核文档 Documentation/trace/events-ras.rstrasdaemon README 互引),主流服务器 OS 默认安装。
  • 飞腾、海光、鲲鹏等国产 ARM/x86 服务器 几乎全部预装,作为 OEM 验收必查项。
  • 公有云厂商(华为云、阿里云、腾讯云等)在大规模 ARM 实例上用于 CXL/NVMe 故障归因。

4. 开发与社区

  • 主仓 GitHub:github.com/mchehab/rasdaemon,GitLab 镜像 gitlab.com/mchehab_kernel/rasdaemon,Infradead 镜像 git.infradead.org/users/mchehab/rasdaemon.git
  • 邮件列表 linux-edac@vger.kernel.org 是上游协同渠道。
  • 代码遵循 Linux Kernel Coding Stylescripts/checkpatch.pl 校验),所有提交需 Signed-off-by:(DCO 1.1)。

五、近期发展与项目活跃度(基于 git log 2025–2026)

最近一年最显著的工作:

  1. NVIDIA 非标准事件解码non-standard-nvidia.c,2026)。
  2. Intel 新一代 CPU 支持:Granite Rapids、Sierra Forest、Clearwater Forest(2025)。
  3. Zhaoxin CPU MCE 解码(2025)。
  4. RISC-V RERI 处理器(2026,ras-reri-handler.cJingyu Li <joey.li@spacemit.com>,算能 Spacemit 贡献),意味着项目正式支持 RISC-V 架构。
  5. CXL spec 3.2 支持:memory sparing、CME 维护子类、hdr_maint_op_sub_class、corrected memory error threshold 等。
  6. Poison page statisticsmemory CE statisticspanic MCE via ERSTdmidecode 适配 RISC-Vrsyslog/syslog-ng/logrotate 配置文件bash/zsh completions
  7. 修整 SDR 文件命名、安装说明、构建兼容性问题(如 sqlite 关闭时仍可编译)。

六、核心源码地图(快速导读)

路径 作用
rasdaemon.c 主入口、argp 解析、-p 离线解码入口
ras-events.c/h libtraceevent 初始化、CPU pthread 采集、事件分发
types.h 内核风格的位操作宏与共用类型
ras-record.c/h SQLite 持久化层(每事件类型一张表)
ras-mc-handler.c EDAC/MC 事件
ras-mce-handler.c + mce-*.c MCE 总入口 + 各代 CPU 家族解码
ras-aer-handler.c PCIe AER
ras-arm-handler.c ARM 硬件错误
ras-cxl-handler.c CXL 3.0/3.1/3.2
ras-extlog-handler.c 旧式 Extended Log
ras-non-standard-handler.c + non-standard-*.c 厂商非标准 OEM 解码
ras-devlink-handler.c devlink 健康
ras-diskerror-handler.c SCSI/块设备
ras-memory-failure-handler.c memory_failure trace + 页面隔离
ras-page-isolation.c 内存页自动隔离(offline)
ras-poison-page-stat.c 内存毒化页统计
ras-signal-handler.c 信号事件(SIGBUS 等)
ras-cpu-isolation.c 故障 CPU 隔离(--enable-cpu-fault-isolation
ras-reri-handler.c RISC-V RERI(2026 新增)
ras-report.c ABRT 上报
ras-erst.c ERST 记录序列化与 panic MCE 解码
unified-sel.c OpenBMC 统一 SEL
util/ras-mc-ctl.in Perl 写的查询/标签/统计 CLI
contrib/ 注入测试脚本
labels/{dell,lenovo,supermicro,...} 各 OEM 主板 DIMM 拓扑
misc/rasdaemon.spec.in RPM spec 模板
config/ rsyslog/syslog-ng/logrotate 模板
man/rasdaemon.1.in 主 manpage

七、一句话总结

rasdaemon 是 Linux 服务器硬件健康监测的"事实标准"用户态框架:从最初的 edac-utils 替代品,演化为覆盖 x86 / AMD / ARM / RISC-V / CXL / PCIe / 国产芯片非标准错误的统一采集器,配套 SQLite 持久化、PFA 预测、页面/CPU 自动隔离、ABRT / OpenBMC SEL 上报,并以 mock / RPM / dist 矩阵多平台发布;由 Linux 内核 EDAC 维护者 Mauro 主导,华为、 Ampere、NVIDIA、嘉楠、海光、OpenBMC 社区等持续贡献。


附:阅读参考

  • README.mdNEWSINSTALLCLAUDE.mdSECURITY.mdChangeLog(项目根目录)
  • configure.ac(功能开关权威列表)
  • .github/workflows/ci.yml(CI 编译矩阵 → 反映官方支持的发行版与架构)
  • misc/rasdaemon.spec.in(RPM 依赖与运行依赖)
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐