正常流程

    • 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载
    • 安全下电,拔掉硬盘和TEC,再上电
    • 硬件端
    • drv_fault_check_init 初始化 并绑定硬件回调 drv_fault_check_callback
    • drv_fault_check_proc 发送告警事件通过ens框架回调给alarm_process模块中
    • 非硬件端
    • 初始化磁盘挂载检测任务fault_manage_mount_check_thread线程检测磁盘状态
    • fault_check.h 中 FAULT_DATA_COLLECT funcdatacollect; // 注册函数
    • global_fault_info_init 绑定所有非硬件故障检测函数
    • fault_check_task_process 中 下段代码调用检测函数检测并返回不同故障的状态
    ret = sub_item_fault->item_cfg.funcdatacollect(index, sub_item_fault->item_cfg.sub_fault_id,
    &status_curr);
    • alarm_report函数,通过此函数处理故障信息并更新状态,然后写入故障日志
    • 最后发布一个警告事件给注册的其他方法中
    • 去执行 通过ens框架提前注册好的事件
    • 执行到 process_alarm_event_func 函数中调用hal层提供的接口去执行
    • dev_set_led_color 函数
    • 最终执行的是hal_set_led_color函数 执行切换不同灯的状态

故障架构

http://image.huawei.com/tiny-lts/v1/images/a46a8e1f44cfbe69d77d5ebb3e5751f2_683x428.png@900-0-90-f.png

  • 故障检测和告警解耦。
  • 硬件和非硬件的故障检测解耦。
  • 告警主体归一。

检测流程

  1. 驱动侧启动,拉起驱动故障检测进程。
  2. OM侧ensd进程启动,ensd进程加载故障检测动态库并进行故障检测模块的初始化,在这个过程中会初始化非硬件相关的故障检测线程,同时会加载驱动提供的硬件故障检测动态库,该动态库初始化的过程中会和驱动故障检测进行连接;同时ensd进程加载告警处理动态库并进行告警处理模块的初始化,在这个过程中会初始化告警屏蔽处理线程。
  3. 故障检测模块中会进行相关非硬件故障的检测,发现故障时会通过告警上报接口上报给告警处理模块,告警处理模块生成相应的告警。
  4. 驱动侧的故障检测进程对硬件进行检测,发现故障会将故障上报给ensd进程中的故障检测模块进行处理,改模块会将故障上报给告警模块处理。

3、 各检测项实现
这边只列出硬件无关的故障检测项,硬件相关的在驱动侧实现。

  1. 磁盘挂载
    通过脚本mount_check.sh实现
  2. NFS
    通过脚本nfs_operate.sh生成的nfs_status_info文件实现NFS的故障检测功能
  3. 磁盘空间
    通过linux的df和awk命令来判断磁盘空间是否占满,目前检测的目录有: ‘/’、‘/tmp’、‘/home/data’、‘/home/log’、‘/opt’、‘/var/lib/docker’。
  4. 证书过期

告警

  1. ensd进程中硬件故障检测任务和非硬件故障检测任务将检测的故障上报给告警任务,告警任务处理故障生成告警并保存。
  2. 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;

驱动故障检测动态库提供的接口(驱动提供)

  1. 初始化接口
    INT32 drv_fault_check_init();

  2. 设置故障上报回调函数接口
    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()初始化一个新的进程保证硬件那边可以健康
    • 重写适配接口,让屏蔽告警调用取消对应的信号报警

ENS框架下一次控制灯的调试记录的更多相关文章

  1. SPI 核软件调试记录

    SPI 核软件调试记录 1.首先说说int SpiFlashWaitForFlashReady(void)这一函数,基本上其它函数在执行的时候,都会事先执行一次此函数.    因为此函数的作用主要是用 ...

  2. Video Timing Controller v6.1软件调试记录

    Video Timing Controller v6.1软件调试记录 GUI配置: . case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlace ...

  3. Video Test Pattern Generator(7.0)软件调试记录

    Video Test Pattern Generator(7.0)软件调试记录 . XVidC_VideoMode XVIDC_VM_576_50_I = XVIDC_VM_720x576_50_I ...

  4. MA82G5D16AS16 主频调试记录

    MA82G5D16AS16 主频调试记录 当 SCKS 设置 为 MCKDO / 128 时 MCU 的电流为 0.58mA,100UF 电容可以维持 0.5S,大概可以满足. 但是需要注意外围的线路 ...

  5. Apusic中间件结合MyEclipse进行远程调试记录

    Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...

  6. mybatis框架-查询用户表中的记录数

    之前已经搭建过mybatis框架了,现在我们要用mybatis框架真正的干点事情了. 这是这个简单web项目的整体架构. 我们使用mybatis框架查询用户表中的记录数: 这是用户类: package ...

  7. PWM控制灯亮暗的verilog实现

    PWM的全称为Pulse-Width Modulation(脉冲宽度调制),即调节脉冲的占空比.当输出的脉冲频率一定时,输出的脉冲占空比越大,相当于输出的有效电平越大,这样也就简单实现了由FPGA来控 ...

  8. http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

    http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

  9. 基于freescale i.Mx6(ARM)的阿里云oss调试记录

    交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.111 ...

  10. [ZJCTF 2019]EasyHeap | house of spirit 调试记录

    BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...

随机推荐

  1. Knative部署应用以及应用的更新、应用的分流(二)

    1. 应用的更新 1.1 更新hello-example应用 1.更新应用的环境变量 可通过命令行的方式亦可以通过读取配置文件的方式,这里主要来看命令行的方式 [root@kn-server-mast ...

  2. GB/T 28181联网系统通信协议结构和技术实现

    技术回顾 在本文开头,我们先一起回顾下GB/T28181联网系统通信协议结构: 联网系统在进行视音频传输及控制时应建立两个传输通道:会话通道和媒体流通道. 会话通道用于在设备之间建立会话并传输系统控制 ...

  3. rtmp/rtsp/hls公网测试地址

    相信大家在调试播放器的时候,都有这样的困惑,很难找到合适的公有测试源,以下是大牛直播整理的真正可用的直播地址源. 其中,rtmp和rtsp的url,用https://github.com/daniul ...

  4. 通过IIS部署Flask项目

      本文主要介绍在Windows Server 2012R2上通过IIS部署Flask项目的过程,以及对TTFB延迟大问题的思考.关于如何申请云服务器,注册(子)域名,备案,开放云服务器端口,获取SS ...

  5. Linux安装gitlab仓库

    linux安装gitlab仓库 注:此安装方式是安装在docker上 1. 安装docker 可根据链接文档进行操作安装 https://www.cnblogs.com/cherish-sweet/p ...

  6. 异步编程promise

    异步编程发展 异步编程经历了 callback.promise.async/await.generator四个阶段,其中promise和async/await使用最为频繁,而generator因为语法 ...

  7. Xcode模拟器simulators安装

    启动Xcode 后打开菜单Xcode->Preferences...再点击Downloads就可以看到Xcode默认支持的iOS各版本 模拟器,如果还没有安装,只需要点击后面的下载箭头标识,Xc ...

  8. 20_IO

    IO框架 一. 流的概念 概念:内存与存储设备之间传输数据的通道 水借助管道传输:数据借助流传输 二. 流的分类 按方向[重点] 输入流:将<存储设备>中的内容读入到<内存>中 ...

  9. 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)

    好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...

  10. MatrixOne Linux 编译文档

    MatrixOne Linux 编译文档 编译环境 硬件环境 操作系统 内存 CPU 磁盘 Windows环境下的Linux虚拟机 Linux version 3.10.0-1160.el7.x86_ ...