Yocto vs Buildroot:工业边缘嵌入式 Linux 镜像怎么选

做工业边缘设备的同行经常面临这个问题:给 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/台起。

下一步建议

  1. 跑通 Buildroot 或 Yocto 最小镜像
  2. 加自定义包(应用 + 配置)
  3. 集成 A/B 分区
  4. 集成 OTA(swupdate / RAUC)
  5. CI/CD 自动化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值