正常流程

    • 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载
    • 安全下电,拔掉硬盘和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. day35-IO流02

    JavaOI流02 4.常用的类 4.1文件字节流输入流-FileInputStream InputStream抽象类是所有类字节输入流的超类 InputStream常用的子类: FileInputS ...

  2. Windows Server体验之应用兼容性按需功能

    Windows Server默认仅能支持几个有图形界面的应用包括注册表编辑器regedit.记事本notepad.任务管理器taskmgr.时间设置control timedate.cpl.区域设置c ...

  3. 从Java 9 到 Java 17 新特性梳理

    Java 9 新的创建集合的方法  // [1, 2, 3, 4]  List<Integer> integers = List.of(1, 2, 3, 4);  // {1,2,3}   ...

  4. KubeOperator界面,集群详情中的存储,存储提供商

    点击"添加",假设选择的类型是rook-ceph,表示的是在这个k8s集群里创建rook-ceph集群,而不是显示已经存在的集群 意味着可以使用这种办法在k8s集群里创建rook- ...

  5. CentOS7.x安装VNC

    VNC需要系统安装的有桌面,如果是生产环境服务器,安装时使用的最小化安装,那么进行下面操作安装GNOME 桌面. # 列出的组列表里有GNOME Desktop. yum grouplist #安装 ...

  6. nginx反向代理Grafana

    官方文旦地址:https://grafana.com/tutorials/run-grafana-behind-a-proxy/ 一级路径 只需要修改nginx配置文件 # this is requi ...

  7. 第一个Django应用 - 第二部分:Django数据库配置,模型和后台

    汇总操作 注:polls为应用名 1.执行命令:python manage.py migrate,生成默认的数据库表等 2.修改应用的models.py文件,添加数据库表模型等 3.INSTALLED ...

  8. linux系统排查数据包常用命令

    1.查看当前系统中生效的所有参数 sysctl -a 2.统计处于TIME_WAIT状态的TCP连接数 netstat -ant|grep TIME_WAIT|wc -l 3.统计TCP连接数 net ...

  9. Docker容器优雅重启

    默认情况下,当 Docker 守护进程终止时,它将关闭正在运行的容器.您可以配置守护程序,以便容器在守护程序不可用时保持运行.此功能称为live-restore.live-restore选项有助于减少 ...

  10. 7.prometheus监控多个MySQL实例

    mysqld_exporter集中部署 集中部署,就是说我们将所有的mysqld_exporter部署在同一台服务器上,在这台服务器上对mysqld_exporter进行统一的管理,下面介绍一下集中部 ...