You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:57:25