一、HAM架构介绍
1、背景
当汽车驾驶过程中,可能会出现断电、部件故障、操作人员失误、软件故障等等系统故障。QNX团队研发出高可用性框架为构建高效的HAM系统提供了可靠的软件基础设施,除了支持面向硬件的HAM解决方案(例如CompactPCI和自定义硬件)之外,您还拥有在整个系统中出现软件故障之前隔离甚至修复软件故障的工具。
2、什么是HAM
HAM(High Availability Manager)是一个“智能看门狗”——一个高弹性的管理进程,它可以在系统服务或进程失败或不再响应时监视您的系统并执行多级恢复。作为一个自我监控的管理者,HAM对内部故障具有弹性。不管出于什么原因,如果HAM本身被异常地停止,它可以通过移交给一个称为“监护人”的镜像进程,立即并完全地重建自己的状态。简单说,可以用守护机制做进程保活的。
3、HAM架构特性
- 系统稳定性
- 软件模块的隔离性
- 软件组件的动态升级
- HAM应用程序所需的许多特殊特性
二、HAM基本元素
参考使用文档:https://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.ham/topic/about.html
1、entities
- Self-attached entities:即通过主动调用HA ham_attach_self() ham_detach_self() 等API 使得自身受到HAM模块
- Externally attached entities : 即外部被动监测实体,如进程A说如果进程B死亡则通知我,则进程B被动的加入监测。
- Global entity: 并非一个具体的实体,指的是可以指定系统的任意感兴趣的事件,并在该事件发生时,设定特定的动作。
2、conditions
Condition
Description
CONDDEATH
进程中止
CONDABNORMALDEATH
进程异常中止
CONDDETACH
断开HAM
CONDATTACH
连接上HAM
CONDHBEATMISSEDHIGH
进程失去心跳达最大次数
CONDHBEATMISSEDLOW
进程失去心跳达最小次数
CONDRESTART
进程重新启动
CONDSTATE
进程状态发生变化
CONDANY
任何condition改变
CONDRAISE
将检测状况报告给HAM
3、action
Action
Description
ham_action_restart()
重启
ham_action_execute()
执行一段脚本
ham_action_notify_pulse()
发送PULSE事件
ham_action_notify_signal()
发送系统信号事件
ham_action_waitfor()
等待
ham_action_log()
输出日志
ham_action_notify_signal_node()
ham_action_notify_pulse_node()
ham_action_heartbeat_healthy()
三、ham-monitor.conf文件分析
- ham-monitor.conf位置 : qnx_svp/dist/g9ph-aarch64/svp/etc/
- 预编译阶段:
qnx_svp/dist/g9ph-aarch64/svp/目录下的etc、lib、bin三个文件夹拷贝到apps/qnx_ap/prebuilt/emmc_bu/对应的etc、lib、bin三个文件夹目录下。 - 启动流程:
- 在create_images.sh 文件中加入下面两个命令即可拉起svp.init.sh
TOPDIR=0`;pwd)
source $TOPDIR/../../../prebuilt/emmc_bu/svp/etc/svp.init.sh - svp.init.sh 会把相关svp的sh脚本执行起来
无法复制加载中的内容
备注: ham-monitor.conf的参数可以在svp.startup.sh中找到启动
ham-monitor.conf 文件内容
@processes
i2c1:json:{"name":"i2c-rcar-A-p0xe6508000-i320-v","restart_script":"/proc/boot/i2c-rcar-A -p0xe6508000 -i320 -v --u 1","pulse":10}
i2c2:json:{"name":"i2c-rcar-A-p0xe6510000-i318-v","restart_script":"/proc/boot/i2c-rcar-A -p0xe6510000 -i318 -v --u 2","pulse":11}
sdmmc_emmc:json:{"name":"devb-sdmmc-rcar_gen3blkdirectio=no,maxio=512,cache=16m,noatime,ra=256k:512k,rapolicy=aggressive,commit=none,naming=0#@cambounce=128kmemname=below4Gcamnopriv,quiet,cache,asyncsdioidx=2,emmc,bw=8,timing=hs200diskname=mmc@0sdmmcpartitions=on","restart_script":"/proc/boot/devb-sdmmc-rcar_gen3 blk directio=no,maxio=512,cache=16m,noatime,ra=256k:512k,rapolicy=aggressive,commit=none,naming=0#@ cam bounce=128k mem name=below4G cam nopriv,quiet,cache,async sdio idx=2,emmc,bw=8,timing=hs200 disk name=mmc@0 sdmmc partitions=on","pulse":12}
devc_serscif2:json:{"name":"devc-serscif-E-F-b115200-c66666666-t14scif1-u2","restart_script":"/proc/boot/devc-serscif -E -F -b115200 -c 66666666 -t 14 scif1 -u2","pulse":13}
slogger2:json:{"name":"slogger2","restart_script":"/proc/boot/slogger2","pulse":14}
screen:json:{"name":"screen-c/usr/lib/graphics/rcarm3/graphics.conf","restart_script":"/sbin/screen -c /usr/lib/graphics/rcarm3/graphics.conf","pulse":16}
..................
参数讲解:
screen:json: {
"name":"screen-c/usr/lib/graphics/rcarm3/graphics.conf",
"restart_script":"/sbin/screen -c /usr/lib/graphics/rcarm3/graphics.conf",
"pulse":16
}
screen: 在QNX环境中二进制命令 (QNX环境目前没有添加,需要手动加入,路径在binscan_info.txt中)
name : 作为存储启动screen屏幕的key数值
screen -c /usr/lib/graphics/rcarm3/graphics.conf : 在QNX环境下启动屏幕的命令
restart_script : 执行重新启动
/sbin/screen -c /usr/lib/graphics/rcarm3/graphics.conf : 在QNX环境下启动屏幕的命令
pulse : 发送重启PULSE事件
16 : 第16个事件
网友评论