U-Boot 到底怎么切换升级分区?A/B 启动、环境变量与自动回滚 讲解
B站 嵌入式孙老师博主个人介绍博主书籍-京东购买链接*Yocto项目实战教程加博主微信进技术交流群jerrydevU-Boot 到底怎么切换升级分区A/B 启动、环境变量与自动回滚做 A/B 升级时。例如瑞芯微 NXP 高通平台升级最容易混淆的是要不要新增U_BOOT_CMD()bootcmd、bootargs、环境变量分别负责什么Linux 写完备用分区后怎么让 U-Boot 启动它新系统启动失败怎么切回旧分区实际核心只有一句话升级程序负责“写哪个分区”U-Boot 环境变量负责“下次启动哪个分区”。完整链路如下当前运行 A │ ├── 升级程序写入 B │ ├── 设置 boot_slotB │ └── 重启 ↓ U-Boot 启动 B │ ├── 系统正常确认 B └── 多次失败回滚 A一、先分清 U-Boot 的三类机制机制典型写法触发方式主要作用驱动U_BOOT_DRIVER()设备树匹配驱动硬件设备命令U_BOOT_CMD()用户输入命令执行一段 C 代码环境变量setenv/saveenv启动脚本或用户修改控制启动行为1.U_BOOT_DRIVER处理设备例如staticconststructudevice_idadc_key_bus_match[]{{.compatibleadc-keys},{},};U_BOOT_DRIVER(adc_key_bus){.nameadc_key_bus,.idUCLASS_SIMPLE_BUS,.of_matchadc_key_bus_match,.bindadc_key_bus_bind,};设备树adc-keys { compatible adc-keys; };匹配关系DTS compatible ↓ of_match ↓ U_BOOT_DRIVER ↓ bind / probe它解决的是这个硬件节点由哪个驱动处理。2.U_BOOT_CMD注册命令例如staticintdo_hello(structcmd_tbl*cmdtp,intflag,intargc,char*constargv[]){printf(Hello U-Boot\n);return0;}U_BOOT_CMD(hello,1,0,do_hello,print hello message,);命令行执行hello Hello U-Boot它解决的是输入某条命令后执行哪段代码。3. 环境变量控制启动流程例如setenv boot_slot Bsetenv upgrade_available1saveenv常见启动变量变量作用bootcmdU-Boot 最终执行的启动脚本bootargs传给 Linux 内核的参数boot_slot选择 A 或 Bbootcount记录启动尝试次数bootlimit最大允许失败次数upgrade_available是否正在试启动新系统A/B 升级大多数情况下只需要环境变量不需要重新写命令。二、A/B 升级需要哪些配置1. 分区布局一个简单布局分区用途boot内核、DTB、启动文件rootfs_a当前系统rootfs_b备用升级系统data用户数据uboot-env可选保存 U-Boot 环境示例mmcblk0p1 boot mmcblk0p2 rootfs_a mmcblk0p3 rootfs_b mmcblk0p4 data升级状态当前系统rootfs_a 升级目标rootfs_b 回滚目标rootfs_a2. 建议的环境变量变量示例含义boot_slotA下一次启动的槽rollback_slotA失败后返回的槽upgrade_available0是否正在测试新系统bootcount0已尝试启动次数bootlimit3最大失败次数rootfs_a_part2A 分区号rootfs_b_part3B 分区号默认值boot_slotA rollback_slotA upgrade_available0 bootcount0 bootlimit3 rootfs_a_part2 rootfs_b_part3Linux 下检查分区lsblk-oNAME,SIZE,FSTYPE,PARTLABEL,PARTUUID,MOUNTPOINTScat/proc/cmdlineU-Boot 下检查part list mmc0printenvbootcmdprintenvbootargs3. 设备号、标签和 PARTUUID 怎么选写法示例评价固定设备号/dev/mmcblk0p3简单但设备号可能变化分区标签/dev/disk/by-partlabel/rootfs_b适合 Linux 升级程序PARTUUIDrootPARTUUIDxxxx适合 U-Boot 传给内核建议升级程序写分区使用 PARTLABEL 内核查找 rootfs使用 PARTUUID三、U-Boot 如何完成分区选择和回滚1. 根据boot_slot选根分区select_rootfs\if test \${boot_slot}\ \A\; then \setenv rootfspart ${rootfs_a_part}; \else \setenv rootfspart ${rootfs_b_part}; \fi\0执行结果boot_slotrootfspartA2B3流程boot_slot │ ├── A → rootfs_a_part └── B → rootfs_b_part2. 生成 Linux 根文件系统参数推荐使用PARTUUIDprepare_rootfs\part uuid mmc 0:${rootfspart} rootuuid; \setenv bootargs \${bootargs_base} \rootPARTUUID${rootuuid} rootwait rw\\0逻辑rootfspart ↓ 读取对应分区 PARTUUID ↓ 生成 bootargs ↓ Linux 挂载对应 rootfs但要注意root不一定来自bootargs它也可能在位置常见场景extlinux.confdistro bootboot.scrU-Boot 脚本FIT Image内核、DTB、配置打包boot.imgAndroid/Rockchip 启动方式环境变量传统 U-Boot 启动检查cat/proc/cmdlinecat/boot/extlinux/extlinux.conf源码中搜索grep-Rroot/dev/mmcblk.grep-RCONFIG_BOOTCOMMAND.grep-RCONFIG_EXTRA_ENV_SETTINGS.3. 试启动计数check_upgrade\if test \${upgrade_available}\ \1\; then \setexpr bootcount ${bootcount} 1; \saveenv; \fi\0状态关系upgrade_available行为0正常启动不计数1bootcount加 14. 超过次数后回滚rollback_upgrade\echo Rollback to slot ${rollback_slot}; \setenv boot_slot ${rollback_slot}; \setenv upgrade_available 0; \setenv bootcount 0; \saveenv\0完整判断check_upgrade\if test \${upgrade_available}\ \1\; then \setexpr bootcount ${bootcount} 1; \echo Trial boot ${bootcount}/${bootlimit}; \if test ${bootcount} -gt ${bootlimit}; then \run rollback_upgrade; \else \saveenv; \fi; \fi\0流程upgrade_available1 ↓ bootcount 1 ↓ bootcount bootlimit ┌────┴────┐ │ │ 否 是 │ │ 启动新系统 切回 rollback_slot5. 接入原来的bootcmd先查看printenvbootcmd假设原来是bootcmdrun distro_bootcmd保存原始启动逻辑normal_bootcmdrun distro_bootcmd重新组合bootcmd run check_upgrade; run select_rootfs; run prepare_rootfs; run normal_bootcmd最终启动链路bootcmd │ ├── check_upgrade │ └── 试启动计数或回滚 │ ├── select_rootfs │ └── 选择 A/B │ ├── prepare_rootfs │ └── 生成 rootPARTUUID │ └── normal_bootcmd └── 执行原有启动流程四、Linux 与 U-Boot 如何形成升级闭环1. Linux 写入非活动分区假设当前运行 Afindmnt /升级程序应写 Bddifsystem.ext4\of/dev/disk/by-partlabel/rootfs_b\bs4Mconvfsync升级顺序必须是写备用分区 ↓ 刷新数据 ↓ 校验镜像 ↓ 修改 boot_slot ↓ 重启对应命令fw_setenv rollback_slot A fw_setenv boot_slot B fw_setenv upgrade_available1fw_setenv bootcount0syncreboot不要反过来错误顺序 先设置 boot_slotB 再写 rootfs_b否则写入中途掉电U-Boot 可能启动一个不完整的系统。2. 新系统启动后确认成功新系统启动到 Shell不代表升级成功。建议至少检查检查项目的根文件系统确认挂载正常关键驱动确认硬件可用网络确认通信正常核心应用确认业务正常数据分区确认数据可访问版本号确认升级版本正确确认成功后fw_setenv rollback_slot B fw_setenv upgrade_available0fw_setenv bootcount0示例脚本#!/bin/shset-euslot$(fw_printenv-nboot_slot)systemctl is-active--quietapplication.service mountpoint-q/ fw_setenv rollback_slot${slot}fw_setenv upgrade_available0fw_setenv bootcount0echoSlot${slot}marked successful完整闭环Linux A 运行 ↓ 写入 Linux B ↓ 设置 boot_slotB ↓ U-Boot 启动 B ↓ B 执行健康检查 │ ├── 成功 │ ├── 清除 upgrade_available │ └── B 成为稳定槽 │ └── 失败 └── U-Boot 回滚 A3. 环境变量持久化必须先验证U-Boot 中测试setenv ota_test1234saveenvresetprintenvota_testLinux 中继续测试fw_printenv ota_test fw_setenv ota_test5678再次进入 U-Bootprintenvota_test预期结果ota_test5678只有这样才能证明U-Boot saveenv 和 Linux fw_setenv ↓ 读写同一份环境需要确认配置必须一致U-Boot 环境存储位置CONFIG_ENV_OFFSET环境大小CONFIG_ENV_SIZELinux 配置fw_env.config磁盘布局WIC/GPT 保留区域如果 offset 配错可能覆盖GPT loader U-Boot boot 分区 rootfs总结A/B 升级不是一条 U-Boot 命令而是一套状态切换机制分区负责保存系统 环境变量负责保存状态 bootcmd 负责选择系统 Linux 负责确认成功 U-Boot 负责失败回滚普通 A/B 升级通常只需要已有命令setenv saveenv run test setexpr part mmc booti只有涉及特殊硬件或私有状态存储时才需要新增U_BOOT_CMD(...)真正需要优先确认的是核心问题检查内容环境能否保存saveenv后重启是否还在root 参数来自哪里bootargs、extlinux、boot.scr 或 boot.imgLinux 与 U-Boot 是否一致fw_setenv与saveenv是否操作同一区域这三点确认后A/B 升级的主体就清楚了写备用分区、切换启动槽、健康检查、失败回滚。

相关新闻

GEO内容发了一堆,AI却视而不见,究竟是哪里出了偏差?

GEO内容发了一堆,AI却视而不见,究竟是哪里出了偏差?

面对生成式AI搜索的强势崛起,不少品牌投入大量精力做GEO,却发现精心布局的内容依然被大模型无视,流量与曝光远不及预期。这种投入与回报的偏差,正成为当下营销人共同的困惑。我们不妨从源头梳理,看看问题究竟卡在了哪一…

2026/7/27 5:39:42 阅读更多 →
Gemini代码生成避坑指南:3类致命错误导致项目延期,90%开发者至今未察觉

Gemini代码生成避坑指南:3类致命错误导致项目延期,90%开发者至今未察觉

更多请点击: https://intelliparadigm.com 第一章:Gemini代码生成避坑指南:3类致命错误导致项目延期,90%开发者至今未察觉 Gemini在代码生成场景中表现亮眼,但未经审慎验证的输出正悄然成为项目交付风险的隐形推手。以…

2026/7/27 21:41:58 阅读更多 →
黑神话:悟空修改器下载 手残必备

黑神话:悟空修改器下载 手残必备

下载链接 从工程视角看《黑神话:悟空》本地内存修改工具的技术实现与生态差异 引言 《黑神话:悟空》作为一款基于Unreal Engine 5开发的硬核动作角色扮演游戏,其战斗系统对玩家的操作精度和反应速度提出了较高要求。在单机游戏领域&#x…

2026/7/26 22:20:38 阅读更多 →

最新新闻

600万年薪抢疯了!大模型人才火爆,小白也能入局,速收藏!

600万年薪抢疯了!大模型人才火爆,小白也能入局,速收藏!

大厂争抢AI人才,大模型算法成热招岗位第一,AI科学家月薪破10万。企业看重实干能力,博士实习日薪超千元。AI人才分三类:A类核心技术人才,B类应用开发人才,C类AI使用者。普通理工科学生可切入B类,…

2026/7/28 17:19:48 阅读更多 →
##将一个字符的前n个字符左旋##判断一个字符串是否为另外一个字符串旋转之后的字符串。

##将一个字符的前n个字符左旋##判断一个字符串是否为另外一个字符串旋转之后的字符串。

实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 思路如下:先将要左旋的k个字符逆置,然后将k个字符之后的字符逆置,左后将整个字符串逆置。1.逆置字符串的函数void reverse(char …

2026/7/28 17:19:48 阅读更多 →
基于线段树的RMQ

基于线段树的RMQ

每个节点维护的是区间的最小值#include <cstdio> #include <iostream> #include <vector> #include <cmath> #include <queue> #include <algorithm> #include <cstring>typedef long long ll; const int INF 1e6; const int maxn…

2026/7/28 17:19:48 阅读更多 →
基础Demo_02数据运算符(学习笔记)

基础Demo_02数据运算符(学习笔记)

算术运算图中代码 public class Demo01_YurnSuan {public static void main(String[] args){System.out.println(10 20); // 30System.out.println(10 - 20); // -10System.out.println(10 * 20); // 200System.out.println(10 / 20); // 整数与整数运算,结果还是整数System.o…

2026/7/28 17:19:48 阅读更多 →
如何选择适合自己的编程语言?这个操作厉害了

如何选择适合自己的编程语言?这个操作厉害了

Twitter上流传的《编程语言选择指导图》&#xff0c;非常具有参考性。大家可以通过这张图做个小测试&#xff0c;看看自己更适合哪种编程语言。 学习编程&#xff0c;首先要选择一门编程语言&#xff0c;但是初学者往往在这个环节产生迷茫&#xff0c;不知道该如何选择。 下面的…

2026/7/28 17:19:48 阅读更多 →
TPIC7710EVM评估模块实战:从硬件解析到软件控制,掌握汽车电子ASIC开发

TPIC7710EVM评估模块实战:从硬件解析到软件控制,掌握汽车电子ASIC开发

1. 项目概述与EVM核心价值 对于从事汽车电子&#xff0c;特别是车身控制模块&#xff08;BCM&#xff09;或底盘电子系统开发的工程师来说&#xff0c;拿到一颗功能复杂的专用集成电路&#xff08;ASIC&#xff09;时&#xff0c;第一件事往往不是直接画原理图、做PCB&#xff…

2026/7/28 17:18:48 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档&#xff0c;可以直接使用&#xff01;系统支持图片、视频、摄像头等多种方式检测裂缝&#xff0c;功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像&#xff01; pubg绝地求生目标检测数据集 1分类&#xff1a;e_body&#xff0c;14905个标签&#xff0c;txt格式 共计14244张图&#xff0c;99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别&#xff1a; allies enemy tag图片总量&#xff1a;7247张训练集&#xff1a;5139张验证集&#xff1a;1425张测试集&#xff1a;683张标注状态&#xff1a;全部已标注&#xff0c;即拿即用数据格式&#xff1a;支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻