树莓派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挂载,改为根据槽位动态挂载:
- 创建挂载脚本
/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 - 给脚本添加执行权限:
chmod +x /usr/local/bin/mount-boot-slot.sh - 修改
/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
相关产品推荐
相关产品推荐

