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

树莓派U-Boot启动分区选择与RAUC适配问题咨询

树莓派U-Boot适配RAUC切换启动分区方案

核心问题解答:指示已启动分区的U-Boot变量

从你提供的fw_printenv输出来看,**raucslot**是直接标识当前启动槽位的变量(当前值为A),对应关系为:

  • raucslot=A → 对应启动分区mmcblk0p1(boot_A)和根分区mmcblk0p3(rootfs_A)
  • raucslot=B → 对应启动分区mmcblk0p2(boot_B)和根分区mmcblk0p4(rootfs_B)

另外BOOT_DEV变量(当前值mmc 0:1)直接指定了当前启动的MMC分区,不过RAUC通常通过raucslot来统一管理槽位切换逻辑。


实现启动分区动态切换的具体步骤

1. 修改boot.scr脚本,支持动态选择启动分区

当前boot.scr硬编码从mmc 0:1加载内核,需改为根据raucslot变量动态选择分区:

fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs

# 根据raucslot变量切换对应boot分区
if test "${raucslot}" = "A"; then
    setenv boot_part 1
else
    setenv boot_part 2
fi

fatload mmc 0:${boot_part} ${kernel_addr_r} @@KERNEL_IMAGETYPE@@
if test! -e mmc 0:${boot_part} uboot.env; then saveenv; fi;
@@KERNEL_BOOTCMD@@ ${kernel_addr_r} - ${fdt_addr}

2. 配置RAUC切换槽位时同步更新U-Boot变量

RAUC完成更新并触发槽位切换后,需通过fw_setenv同步更新U-Boot变量:

  • 切换到B槽时执行:
    fw_setenv raucslot B
    fw_setenv BOOT_DEV "mmc 0:2"
    
  • 切换回A槽时执行:
    fw_setenv raucslot A
    fw_setenv BOOT_DEV "mmc 0:1"
    

可将上述命令集成到RAUC的post-update钩子脚本中,实现自动同步。

3. 调整系统挂载配置,动态挂载对应boot分区

修改/etc/fstab,取消硬编码的/dev/mmcblk0p1挂载,改为根据槽位动态挂载:

  1. 创建挂载脚本/usr/local/bin/mount-boot-slot.sh:
    #!/bin/bash
    SLOT=$(fw_printenv raucslot | cut -d'=' -f2)
    if [ "$SLOT" = "A" ]; then
        BOOT_PART="/dev/mmcblk0p1"
    else
        BOOT_PART="/dev/mmcblk0p2"
    fi
    mount $BOOT_PART /boot
    
  2. 给脚本添加执行权限:
    chmod +x /usr/local/bin/mount-boot-slot.sh
    
  3. 修改/etc/fstab,注释原/boot挂载行,添加:
    /usr/local/bin/mount-boot-slot.sh /boot auto defaults,x-systemd.requires=uboot-env.service 0 0
    

4. 验证切换效果

  • U-Boot阶段:重启后进入U-Boot控制台,执行printenv raucslot和printenv BOOT_DEV,确认变量与当前槽位匹配
  • 系统阶段:进入系统后执行df -h /boot,查看挂载的分区是否与当前槽位对应

内容的提问来源于stack exchange,提问作者Antoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:45:09