RAUC安装进程D-Bus监控异常:keepWatchdogAlive未触发及配置疑问
问题分析与修复方案
一、RAUC进度相关文档翻译
处理进度数据
RAUC安装器通过D-Bus接口暴露安装进度信息。进度以de.pengutronix.rauc.Installer接口的Progress属性形式提供,该属性是一个字典,包含两个字段:
percentage:0-100的整数,表示当前安装进度百分比message:字符串,描述当前执行的具体步骤(如"验证bundle完整性"、"写入目标分区"等)
当进度更新时,RAUC会发送PropertiesChanged信号。
Progress属性参考
Progress属性属于de.pengutronix.rauc.Installer接口,类型为a{sv}(字符串到变体的字典),具体键值对如下:
percentage:整数类型,范围0-100,标识安装进度百分比message:字符串类型,描述当前安装阶段的操作内容
安装过程中该属性会持续更新,每次更新都会触发PropertiesChanged信号。
二、核心问题排查与修复
1. DBus监控过滤条件错误
你的dbus-monitor过滤规则缺少RAUC的服务名和对象路径,导致无法捕获到目标信号。正确的过滤应该包含RAUC服务名de.pengutronix.rauc和对象路径/de/pengutronix/rauc/Installer。
修改monitor_dbus函数中的dbus-monitor调用:
stdbuf -oL dbus-monitor --system "type='signal',interface='$DBUS_INTERFACE',member='$DBUS_MEMBER',sender='de.pengutronix.rauc',path='/de/pengutronix/rauc/Installer'" |
2. 消息拼接逻辑错误
原脚本中每次读取一行就清空message,但PropertiesChanged信号是多行内容,导致无法完整匹配到Progress字段。需要修改循环逻辑,直到捕获到完整的信号块再处理:
monitor_dbus() { stdbuf -oL dbus-monitor --system "type='signal',interface='$DBUS_INTERFACE',member='$DBUS_MEMBER',sender='de.pengutronix.rauc',path='/de/pengutronix/rauc/Installer'" | while read -r line; do message="$message$line" # 空行代表一个信号块结束 if [ -z "$line" ]; then if echo "$message" | grep -q "Progress"; then keepWatchdogAlive fi message="" fi done }
3. 看门狗启动冲突
原脚本中使用watchdog -t 10 $WATCHDOG_DEVICE启动了看门狗守护进程,这会和手动喂狗逻辑冲突。应该关闭守护进程,直接通过sysfs节点控制看门狗:
# 停止看门狗守护进程(忽略未启动的情况) systemctl stop watchdog 2>/dev/null # 设置10秒超时 echo 10 > /sys/class/watchdog/$WATCHDOG_DEVICE/timeout # 启用看门狗 echo 1 > /sys/class/watchdog/$WATCHDOG_DEVICE/enable
4. 验证RAUC D-Bus可用性
先手动执行以下命令,确认RAUC的D-Bus信号是否能被捕获:
dbus-monitor --system "type='signal',interface='de.pengutronix.rauc.Installer',member='PropertiesChanged'"
然后在另一个终端执行rauc install <bundle路径>,观察是否有信号输出。如果没有,检查RAUC编译时是否启用了D-Bus支持,以及配置文件中是否正确设置了D-Bus参数。
三、完整修复后的脚本示例
DBUS_INTERFACE="de.pengutronix.rauc.Installer" DBUS_MEMBER="PropertiesChanged" WATCHDOG_DEVICE="watchdog0" # 根据实际设备修改 RAUC_BUNDLE_DIR="/path/to/bundles" # 根据实际路径修改 keepWatchdogAlive() { echo "1" > /dev/$WATCHDOG_DEVICE echo "Keep Watchdog alive" } monitor_dbus() { stdbuf -oL dbus-monitor --system "type='signal',interface='$DBUS_INTERFACE',member='$DBUS_MEMBER',sender='de.pengutronix.rauc',path='/de/pengutronix/rauc/Installer'" | while read -r line; do message="$message$line" if [ -z "$line" ]; then if echo "$message" | grep -q "Progress"; then keepWatchdogAlive fi message="" fi done } echo "Configuring Watchdog ... " systemctl stop watchdog 2>/dev/null echo 10 > /sys/class/watchdog/$WATCHDOG_DEVICE/timeout echo 1 > /sys/class/watchdog/$WATCHDOG_DEVICE/enable echo "Starting D-Bus monitor. Waiting for $DBUS_MEMBER signals on $DBUS_INTERFACE ... " monitor_dbus & DBUS_MONITOR_PID=$! echo "Starting Update Agent script ... " if [ -d "$RAUC_BUNDLE_DIR" ]; then if [ -n "$(ls -A "$RAUC_BUNDLE_DIR")" ]; then for bundle in "$RAUC_BUNDLE_DIR"/* do rauc install "$bundle" keepWatchdogAlive done else echo "No rauc bundles found in $RAUC_BUNDLE_DIR" fi else echo "Directory $RAUC_BUNDLE_DIR does not exist." fi # 清理收尾 kill $DBUS_MONITOR_PID echo 0 > /sys/class/watchdog/$WATCHDOG_DEVICE/enable
内容的提问来源于stack exchange,提问作者ano
相关产品推荐
相关产品推荐

