嵌入式 Linux Mender OTA 实战全指南
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
嵌入式 Linux Mender OTA 实战全指南
前言
在嵌入式 Linux 项目中,OTA(Over-The-Air)升级是保障设备长期可维护性与安全性的关键能力。Mender 是一套开源且可商用的端到端 OTA 方案,提供了客户端、升级包格式、分区策略以及云端管理平台。本篇文章将以实战为核心,详细介绍如何在 Yocto 环境中集成 Mender,实现从构建 .mender
升级包到设备自动更新的完整流程。
一、Mender 架构概览
Mender OTA 由三部分组成:
-
mender-client(设备端)
- 运行在目标设备中,负责下载、校验、安装更新包,并在升级成功后确认状态。
-
Mender Server(云端/本地部署)
- 管理设备、分发 OTA 包、跟踪部署进度。
-
构建集成工具
meta-mender
:Yocto 集成层,自动完成 OTA 分区布局、客户端集成、升级包生成。mender-artifact
:打包升级包的命令行工具。
数据流:
Mender Server ⇄ mender-client → 备用 rootfs 分区
二、OTA 核心机制
1. 分区策略(A/B 分区)
- 两个功能相同的 rootfs 分区(slot A / slot B)
- 一个 data 分区存放持久化数据
- 当前运行的分区不参与升级,更新写入备用分区
2. Bootloader 变量与回滚机制
upgrade_available=1
:标记试运行状态bootcount
:记录试运行启动次数mender_boot_part
:指定启动分区- 如果试运行阶段没有确认(commit),Bootloader 自动回滚到旧分区
3. 升级成功的判断
- 试运行系统启动 → mender-client 启动 → 成功运行并上报状态 → 执行 commit → 清除
upgrade_available
与bootcount
三、Yocto 集成 Mender
1. 加入 meta-mender
在 bblayers.conf
中添加:
${TOPDIR}/sources/meta-mender/meta-mender-core \
(可选:meta-mender-demo
、meta-mender-qemu
)
2. 配置 local.conf
INHERIT += "mender-full"
IMAGE_FSTYPES += "mender"MENDER_FEATURES_ENABLE += "mender-image mender-uboot" # 或 mender-grubMENDER_STORAGE_DEVICE = "/dev/mmcblk2"
MENDER_BOOT_PART_SIZE_MB = "64"
MENDER_DATA_PART_SIZE_MB = "1024"
MENDER_PARTITION_ALIGNMENT_MB = "4"MENDER_DEVICE_TYPE = "imx8mp-lpddr4-ocean"
MENDER_ARTIFACT_NAME = "ocean-1.0.0"MENDER_SERVER_URL = "https://hosted.mender.io"
MENDER_TENANT_TOKEN = "<your-tenant-token>"
3. 生成签名密钥(可选)
openssl genrsa -out mender-artifact-priv.key 3072
openssl rsa -in mender-artifact-priv.key -outform PEM -pubout -out mender-artifact-pub.key
在 local.conf
中添加:
MENDER_ARTIFACT_SIGNING_KEY = "${TOPDIR}/keys/mender-artifact-priv.key"
MENDER_ARTIFACT_VERIFY_KEY = "${TOPDIR}/keys/mender-artifact-pub.key"
4. 构建镜像
bitbake core-image-base
产物:
tmp/deploy/images/<machine>/<image>.mender # OTA 包
tmp/deploy/images/<machine>/<image>.sdimg # 烧录镜像
四、Mender Server 端部署与上传
1. Hosted Mender(官方云)
- 注册账号 → 获取 Tenant Token
- 在
local.conf
中配置MENDER_SERVER_URL
和MENDER_TENANT_TOKEN
2. 自建 Mender Server(开源版)
- 使用 Docker Compose 部署
- 官方仓库:https://github.com/mendersoftware/mender-server
3. 上传 OTA 包
使用 mender-cli:
mender-cli login --username <email> --password '<pwd>' --server hosted.mender.io
mender-cli artifacts upload \--description "ocean 1.0.0" \--compatible-devices imx8mp-lpddr4-ocean \tmp/deploy/images/<machine>/<image>.mender
五、设备端运行
-
烧录
.sdimg
到设备 -
设备启动后 mender-client 会向 Server 注册
-
在 Server 上为设备分配 OTA 包并部署
-
升级流程:
- 下载 OTA 包(传输阶段)
- 写入备用 rootfs(写入阶段)
- 设置 Bootloader 变量
- 重启试运行
- commit 成功 → 升级完成
六、实战注意事项
- 空间规划:A/B 分区会使 rootfs 占用翻倍
- 设备类型匹配:
MENDER_DEVICE_TYPE
必须与 OTA 包兼容字段一致 - 引导方式选择:U-Boot vs GRUB
- 网络容错:利用断点续传避免大文件下载失败
- 安全性:生产环境务必开启签名验证
七、对比 RAUC
特性 | Mender | RAUC |
---|---|---|
OTA 平台 | 有(Server) | 无(需自建) |
分区管理 | 自动(meta-mender) | 手动配置 |
升级包格式 | .mender Artifact | .raucb Bundle |
回滚机制 | 内置 | 支持(需配置) |
差分更新 | 商业版支持 | 可配合外部实现 |
八、结语
Mender 在 Yocto 项目中的集成非常成熟,通过 meta-mender
层可以快速构建出支持 A/B 分区、回滚机制、签名验证的嵌入式 OTA 系统。结合 Hosted Mender 或自建 Server,就能形成一套安全、可维护、可扩展的 OTA 方案。
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry