正常流程

    • 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载
    • 安全下电,拔掉硬盘和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. KingbaseES R6 主备流复制集群创建级联复制案例

    案例环境: 数据库: test=# select version(); version -------------------------------------------------------- ...

  2. Windows DNS服务器策略

    Windows 2016开始微软在Windows服务器中引入了针对DNS服务器的策略.可以方便灵活的控制DNS服务器响应客户端的请求.这里举个例子,阻止某个网段的DNS查询.思路是这样的,定义一个网段 ...

  3. paddleocr安装与图片识别快速开始

    本文首发我的个人博客:paddleocr安装教程快速开始 1. 安装Python环境 wget https://mirrors.huaweicloud.com/python/3.8.5/Python- ...

  4. windows下 Rust 环境配置

    搭建 Visual Studio Code 开发环境 首先,需要安装最新版的 Rust 编译工具和 Visual Studio Code. Rust 编译工具:https://www.rust-lan ...

  5. 配置 Containerd 在 harbor 私有仓库拉取镜像

    官方文档地址:https://github.com/containerd/cri/blob/master/docs/registry.md 严格来说,这个具体可分为两部分 1.在k8s中使用Conta ...

  6. proxysql 开启http监控页面的方法

    update global_variables set variable_value='true' where variable_name='admin-web_enabled'; LOAD ADMI ...

  7. k8s ingress-nginx 使用 snippet 添加自定义配置 (比如:新增请求头)

    比如在有些时候我们需要在 server 里或者 location 里添加一些参数,例如添加包体大小限制.添加跨域配置.添加自定义header.处理响应header等等.遇到这些需求的时候,我们开始怀念 ...

  8. Centos7搭建 KVM 环境

    注意:使用KVM管理虚拟机分命令行和图形化界面两种方式,这里最后一步安装的工具是图形化管理工具 安装前准备 验证CPU是否支持KVM 如果结果中有vmx(Intel)或svm(AMD)字样,就说明CP ...

  9. PAT (Basic Level) Practice 1031 查验身份证 分数 15

    一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...

  10. C#-12 转换

    一 什么是转换 转换是接受一个类型的值并使用它作为另一个类型的等价值的过程. 下列代码演示了将1个short类型的值强制转换成byte类型的值. short var1 = 5; byte var2 = ...