做工业边缘设备的同行经常面临这个问题:给 ARM 工控机定制 Linux 系统镜像,是用 Yocto 还是 Buildroot?两者都成熟,但适用场景不同。本文实战对比给嵌入式工程师、BSP 工程师参考。
两者的本质差异
Yocto
- 项目级框架(OpenEmbedded + Poky + 自定义 layer)
- 用 BitBake 编译
- 高度可定制(每个包都能控制)
- 学习曲线陡
- 编译慢(全编译 1-3 小时)
Buildroot
- 基于 Makefile 的简单构建系统
- 配置类似 kernel menuconfig
- 学习曲线平
- 编译快(全编译 30 分钟以内)
- 灵活性低于 Yocto
第一步:Buildroot 快速上手
# 下载 Buildroot
git clone git://git.buildroot.net/buildroot
cd buildroot
# 选择默认配置(如 raspberrypi4)
make list-defconfigs
make raspberrypi4_64_defconfig
# 定制
make menuconfig
# 编译
make -j$(nproc)
# 输出在 output/images/
ls output/images/
# sdcard.img / Image / rootfs.tar 等
Buildroot 的优势:
- 单一配置文件控制全部
- 复用 .config 跨项目快
- 输出干净易理解
第二步:Buildroot 加自定义包
添加自家协议运行时:
package/edge-gateway/Config.in:
config BR2_PACKAGE_EDGE_GATEWAY
bool "edge-gateway"
depends on BR2_USE_MMU
help
Industrial edge gateway runtime.
package/edge-gateway/edge-gateway.mk:
EDGE_GATEWAY_VERSION = 1.0.0
EDGE_GATEWAY_SITE = $(call github,example,edge-gateway,$(EDGE_GATEWAY_VERSION))
EDGE_GATEWAY_DEPENDENCIES = openssl libmodbus
define EDGE_GATEWAY_BUILD_CMDS
$(MAKE) -C $(@D) CC="$(TARGET_CC)"
endef
define EDGE_GATEWAY_INSTALL_TARGET_CMDS
$(INSTALL) -m 0755 $(@D)/edge-gateway $(TARGET_DIR)/usr/local/bin/
endef
$(eval $(generic-package))
package/Config.in 加:
source "package/edge-gateway/Config.in"
menuconfig 里启用 + 重新编译。
第三步:Yocto 快速上手
# Clone Poky(参考实现)
git clone -b kirkstone git://git.yoctoproject.org/poky
cd poky
# 配置环境
source oe-init-build-env
# 编辑 conf/local.conf 选 MACHINE
echo 'MACHINE = "raspberrypi4-64"' >> conf/local.conf
# 编译
bitbake core-image-minimal
# 输出在 tmp/deploy/images/$MACHINE/
ls tmp/deploy/images/raspberrypi4-64/
Yocto 的优势:
- 可定制颗粒度细
- layer 架构便于复用
- 大厂支持好(NXP / TI / Renesas 都有 BSP layer)
第四步:Yocto 自定义 layer
# 创建 layer
bitbake-layers create-layer ../meta-edge
# 加 recipe
mkdir -p ../meta-edge/recipes-edge/edge-gateway
meta-edge/recipes-edge/edge-gateway/edge-gateway_1.0.0.bb:
SUMMARY = "Industrial edge gateway runtime"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=..."
SRC_URI = "git://github.com/example/edge-gateway.git;branch=main"
SRCREV = "v1.0.0"
DEPENDS = "openssl libmodbus"
S = "${WORKDIR}/git"
inherit cmake
FILES_${PN} += "/etc/edge-gateway"
添加 layer 到构建:
bitbake-layers add-layer ../meta-edge
第五步:选型对比
按几个维度:
学习曲线
- Buildroot:1-2 周上手
- Yocto:1-2 个月上手
编译时间
- Buildroot:30 分钟以内(全编译)
- Yocto:1-3 小时(全编译,含 SDK)
镜像大小
- Buildroot:通常更小(精简)
- Yocto:可控但通常稍大
可维护性
- Buildroot:单 .config 易管理
- Yocto:layer 架构灵活但复杂
大厂支持
- Yocto:NXP / TI / Renesas 等 BSP 完整
- Buildroot:社区维护为主
适用场景
选 Buildroot 的场景
- 团队小 / 时间紧
- 镜像需求简单(少量包)
- 单一硬件平台
- 快速迭代
选 Yocto 的场景
- 团队大 / 长期项目
- 复杂依赖管理
- 多硬件平台支持
- 大厂 BSP 直接用
- 商业产品级(含 SDK + 升级)
第六步:典型工控机的 BSP
主流国产 ARM 工控机厂家的 BSP:
- 飞凌嵌入式 OK 系列:Yocto + Buildroot 双轨
- 米尔电子 MYS 系列:主要 Yocto
- 创龙 TL 系列:Yocto
- 友善电子(Allwinner / Rockchip):自研 + Buildroot
选板子时看厂家 BSP,跟着走可省一倍时间。
第七步:A/B 分区集成
A/B 分区方案要在系统镜像构建时考虑(参考前一篇):
Buildroot
# 在 BR2_ROOTFS_POST_BUILD_SCRIPT 里生成 A/B 镜像
BR2_ROOTFS_POST_BUILD_SCRIPT="board/example/post-build.sh"
脚本里:
#!/bin/bash
# 把 rootfs 复制成 A 和 B 两份
cp -r $TARGET_DIR $TARGET_DIR.A
cp -r $TARGET_DIR $TARGET_DIR.B
Yocto
# image recipe 里
IMAGE_FSTYPES += "wic"
WKS_FILE = "ab-partition.wks"
wks 文件定义分区结构。
第八步:OTA 集成
两者都支持 OTA:
Buildroot + swupdate
BR2_PACKAGE_SWUPDATE=y
swupdate 是常用 A/B OTA 工具。
Yocto + RAUC
RAUC(Robust Auto-Update Controller)是 Yocto 生态常用 OTA。
IMAGE_INSTALL += "rauc"
第九步:交叉编译 SDK
Yocto 能输出 SDK:
bitbake -c populate_sdk core-image-minimal
# 输出 sdk installer
ls tmp/deploy/sdk/
Buildroot 输出 toolchain:
# 配置后
make sdk
# 输出在 output/images/<arch>-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz
SDK 让应用开发跟 OS 解耦。
第十步:CI/CD 集成
两者都能集成 CI:
# GitLab CI 示例
build-image:
image: ubuntu:22.04
before_script:
- apt-get update && apt-get install -y build-essential git wget
script:
- make buildroot-config
- make -j$(nproc)
artifacts:
paths:
- output/images/sdcard.img
cache:
paths:
- dl/ # Buildroot 下载缓存
- output/ # 构建中间产物
Yocto 的 sstate cache 可以显著加速:
SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
DL_DIR ?= "${TOPDIR}/downloads"
工程化建议
生产实战经验:
- 小团队 / 紧时间:Buildroot 优先
- 大团队 / 长期 / 多平台:Yocto 优先
- 跟着工控机厂家 BSP 走
- A/B 分区 + OTA 必须早集成
- CI/CD + sstate cache 大幅加速
我们这套方案 Zenova EdgeOS光伏储能边缘固件系统跟主流 Yocto / Buildroot BSP 兼容。基础 License ¥400/台起。
下一步建议
- 跑通 Buildroot 或 Yocto 最小镜像
- 加自定义包(应用 + 配置)
- 集成 A/B 分区
- 集成 OTA(swupdate / RAUC)
- CI/CD 自动化

17

被折叠的 条评论
为什么被折叠?



