正常流程
- 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载
- 安全下电,拔掉硬盘和TEC,再上电
- 初始化磁盘挂载检测任务fault_manage_mount_check_thread线程检测磁盘状态
- fault_check.h 中 FAULT_DATA_COLLECT funcdatacollect; // 注册函数 绑定所有非硬件故障检测函数
- 会发送一个告警事件通过ens框架回调给alarm_process模块中
- alarm_report函数,通过此函数处理故障信息并更新状态,然后写入故障日志
- 最后发布一个警告事件给注册的其他方法中
- 去执行 通过ens框架提前注册好的事件
- 执行到 process_alarm_event_func 函数中调用hal层提供的接口去执行
- dev_set_led_color 函数
- 最终执行的是hal_set_led_color函数 执行切换不同灯的状态
故障架构
- 故障检测和告警解耦。
- 硬件和非硬件的故障检测解耦。
- 告警主体归一。
检测流程
- 驱动侧启动,拉起驱动故障检测进程。
- OM侧ensd进程启动,ensd进程加载故障检测动态库并进行故障检测模块的初始化,在这个过程中会初始化非硬件相关的故障检测线程,同时会加载驱动提供的硬件故障检测动态库,该动态库初始化的过程中会和驱动故障检测进行连接;同时ensd进程加载告警处理动态库并进行告警处理模块的初始化,在这个过程中会初始化告警屏蔽处理线程。
- 故障检测模块中会进行相关非硬件故障的检测,发现故障时会通过告警上报接口上报给告警处理模块,告警处理模块生成相应的告警。
- 驱动侧的故障检测进程对硬件进行检测,发现故障会将故障上报给ensd进程中的故障检测模块进行处理,改模块会将故障上报给告警模块处理。
3、 各检测项实现
这边只列出硬件无关的故障检测项,硬件相关的在驱动侧实现。
- 磁盘挂载
通过脚本mount_check.sh实现 - NFS
通过脚本nfs_operate.sh生成的nfs_status_info文件实现NFS的故障检测功能 - 磁盘空间
通过linux的df和awk命令来判断磁盘空间是否占满,目前检测的目录有: ‘/’、‘/tmp’、‘/home/data’、‘/home/log’、‘/opt’、‘/var/lib/docker’。 - 证书过期
告警
- ensd进程中硬件故障检测任务和非硬件故障检测任务将检测的故障上报给告警任务,告警任务处理故障生成告警并保存。
- WEB发起告警查询请求,ESP请求告警模块,查询当前活动告警,得到结果后将结果返回给WEB
故障检测模块和告警模块之间的接口
UINT32 report(const void *info),其中info的结构为:
typedef struct {
UINT32 data_len; // 报文长度
UINT32 owner; // 上报的模块标识
UINT32 item_num; // 告警个数
} ALARM_MSG_INFO_HEAD;
typedef struct {
UINT16 fault_id; // 为LV1中告警id, 对应FAULT_LV2_MAPPING_STRU的fault_id_out
UINT16 sub_fault_id; // 子告警id
UINT16 fault_level; // 告警级别 FAULT_LEVEL_ENUM :紧急告警 严重告警 轻微告警
UINT16 reserved; // 4字节对齐
time_t raise_time_stamp; // 告警时间戳(元年到告警产生的秒数)
char fault_name[64]; // 告警名称
char resource[32]; // 告警实体
} ALARM_MSG_FAULT_INFO;
驱动故障检测动态库提供的接口(驱动提供)
-
初始化接口
INT32 drv_fault_check_init(); -
设置故障上报回调函数接口
typedef INT32(*DRV_FAULT_CHECK_PROC)(UINT8 *data, UINT32 data_len);
INT32 drv_fault_check_register_callback(DRV_FAULT_CHECK_PROC);
现在的情况
- 上电后健康指示灯应该为红色闪动,而指示灯还是绿色闪动
- 屏蔽报警没有做对应的处理
分析问题
- 通过简单的日志调试(ibma_edge/common.log)
- 发现 g_ext_infs 这个结构体在重启的时候,为 nil 空;
- 并且 ret 返回 非 0
- 当重启一个platform服务的时候,发现这个g_ext_infs又重启启动了一个进程,
- 但是在新的进程里面,这里,g_ext_infs的机构体为空
- 并且 pfn_set_led_color为空
- 排查发现,py中的hal在这个进程中可能是未初始化。
解决方案
- 重新调用devm_init()初始化一个新的进程保证硬件那边可以健康
- 重写适配接口,让屏蔽告警调用取消对应的信号报警