想知道node-health-monitor在哪里退出了,要查看日志。一读代码发现所有日志都是用DLT_LOG输出的,syslog默认位置/var/log下看不到任何有用的日志。于是搜索如何查看dlt日志,how to view dlt log,查到可以使用dlt-viewer查看DLT日志 。
该组件作用是通过SSH连接ECU,可视化呈现ECU上所有通过DLT输出的日志,如下图:
该组件为开源软件,可通过源代码编译后使用。参考文档:
https://pelux.io/software-factory/master/swf-blueprint/docs/articles/sdk/read-system-logs.html
源代码:
https://github.com/COVESA/dlt-viewer
dlt-viewer日志分析
首先映入眼帘的是nhm在请求pas服务时被拒绝,systemctl status pas-daemon发现该服务压根没启动。
systemctl enable pas-daemon启用服务后还是不行。
分析dlt-viewer日志发现:
ERROR1
pas服务在获取DBUS name时失败了。
查看nodestatemanager-daemon服务的配置文件,大致在如下四个位置:
/lib/systemd/system/nodestatemanager-daemon.service
其中针对dbus配置的行:
BusName=org.genivi.NodeStateManager
/etc/dbus-1/system.d/org.genivi.NodeStateManager.conf
该文件用于定义dbus总线的归属、目的地及接口。
其中:
需要跟代码中g_bus_own_name函数传入的bus name匹配。
一般跟own的值一致。
定义interface,取值与下面文件中的接口相一致:
/usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleConsumer.xml
另外还有两个接口定义文件,但不知道为什么不需要/etc/dbus-1/system.d/下没有对应的conf
/usr/share/dbus-1/interfaces/org.genivi.NodeStateManager.LifecycleControl.xml
org.genivi.NodeStateManager.LifecycleControl.xml
/usr/share/dbus-1/system-services/org.genivi.NodeStateManager.LifeCycleControl.service
[D-BUS Service]
Name=org.genivi.NodeStateManager
SystemdService = nodestatemanager-daemon.service
Exec=/bin/false
该文件用于定义dbus服务名及对应的systemd服务名和启动命令行。注意Name要与system服务service文件中定义的 BusName 匹配。
根据以上信息,结合persistence-admin源代码中的dbus配置文件,手动添加如下文件:
/etc/dbus-1/system.d/org.genivi.persistence.admin.conf
/usr/share/dbus-1/system-services/org.genivi.persistence.admin.service
同时在/lib/systemd/system/pas-daemon.service中添加:
BusName=org.genivi.persistence.admin
重启发现pas-daemon服务起来了,但node-health-monitor服务仍然没有起来。
继续查看dlt-viewer日志发现:
ERROR2
node-health-monitor服务也获取DBUS name失败。
按照解决ERROR1的方法对node-health-monitor进行dbus配置,结果不好用。
看node-health-monitor源代码发现,其使用的dbus类型为2,即session dbus,而之前的nodestatemanager-daemon和pas-daemon服务使用的dbus类型都是1,system dbus。
结果及总结
经过搜索system dbus和session dbus的区别和各自的配置方法,以及多番尝试,最后得出如下结论: