yocto_soc适配指导

yocto_soc

基于 openEuler Embedded 24.03 LTS 的 openUBMC Yocto BSP 层,面向 Aspeed AST2600 的 BMC 平台。

仓库架构

yocto_soc/
├── meta-aspeed/              # SoC BSP 层 (collection: openubmc-aspeed)
│   └── conf/machine/
│       ├── ast2600.conf      # AST2600 EVB 参考机器
│       └── include/
│           ├── aspeed.inc    # Aspeed 家族通用配置
│           └── ast2600.inc   # AST2600 专用配置
│
├── meta-ubmc/                # 单板 BSP 层 (collection: yocto_soc, priority 60)
│   ├── conf/machine/
│   │   ├── ummc.conf         # UMMC 单板 (eMMC 启动,A/B 双根文件系统)
│   │   └── umtd.conf         # UMTD 单板 (SPI flash/MTD 启动)
│   ├── recipes-bsp/u-boot/   # U-Boot 补丁与单板差异化配置
│   ├── recipes-core/         # 镜像、包组、busybox、systemd、udev
│   ├── recipes-kernel/linux/ # 内核补丁 (PECI、GNR、MTD、netfilter)
│   ├── recipes-ubmc/initrdscripts/  # initramfs 脚本 (mmc vs mtd)
│   └── dynamic-layers/       # 对其他层的条件式 bbappend
│
├── .oebuild/                 # oebuild 平台定义
│   ├── manifest.yaml         # 远程仓库版本锁定
│   └── platform/
│       ├── ummc.yaml         # 平台定义: UMMC
│       ├── umtd.yaml         # 平台定义: UMTD
│       └── ast2600.yaml      # 平台定义: AST2600 EVB
│
└── setup_oee.sh              # 一键编译与 SDK 打包脚本

双层设计

层级 Collection 依赖 职责
meta-aspeed openubmc-aspeed core SoC 级 BSP:AST2600 机器、tuning、U-Boot/内核 provider 声明
meta-ubmc yocto_soc openubmc-aspeed openeuler 板级覆盖:存储类型、U-Boot env、initramfs、补丁

单板配置(ummc.confumtd.conf)通过 require 继承 ast2600.conf,然后叠加板级差异化配置。

平台变体

UMMC(U-Boot + MMC)— 基于 eMMC 的 BMC

  • 存储:eMMC,GPT 分区表
  • 启动ast2600_openbmc_spl_emmc_defconfig,U-Boot 存放在 MMC
  • 根文件系统:双冗余 ext4 分区(rofs-a / rofs-b),通过 root=PARTLABEL= 切换 A/B
  • 读写分区:ext4 /var 分区,/etc 使用 overlay
  • U-Boot 环境变量:1MB,存放在 MMC 上(/dev/mmcblk0p1
  • 恢复出厂:GPIO 触发(factory-reset-toggle),重新格式化 rwfs
  • Initramfsubmc-mmc-init.sh — 等待 mmcblk0 出现、修复 GPT、挂载 rofs + rwfs + overlay

UMTD(U-Boot + MTD)— 基于 SPI Flash 的 BMC

  • 存储:SPI flash,通过 MTD 子系统访问
  • 启动ast2600_openbmc_spl_defconfig,SPL 从 flash 加载
  • 根文件系统:Squashfs 只读(rofs MTD 分区)
  • 读写分区:JFFS2 读写覆盖(rwfs MTD 分区)
  • U-Boot 环境变量:128KB,存放在 MTD u-boot-env 分区
  • 更新:initramfs 支持 TFTP/HTTP 下载
  • Initramfsubmc-mtd-init.sh — 查找 MTD 分区、支持恢复出厂、overlayfs

构建系统(oebuild)

使用 openEuler Embedded 的 oebuild 工具链:

  1. oebuild init <工作区名> -b openEuler-24.03-LTS
  2. oebuild update — 拉取配置的仓库
  3. yocto_soc 克隆到 <工作区>/src/yocto_soc
  4. yocto_soc/.oebuild/platform/ 下的平台 YAML 复制到 <工作区>/src/yocto-meta-openeuler/.oebuild/platform/
  5. yocto_soc/.oebuild/manifest.yaml 内容追加到 <工作区>/src/yocto-meta-openeuler/.oebuild/manifest.yaml
  6. oebuild generate -p <平台名> — 生成 BitBake 编译目录
  7. cd build/<平台名> 进入编译目录
  8. oebuild bitbake openeuler-image-obmc
  9. oebuild bitbake u-boot-aspeed-sdk
  10. oebuild bitbake openeuler-image-obmc -c populate_sdk

平台 YAML 结构

# .oebuild/platform/<名称>.yaml
type: platform
machine: <机器名>               # 对应 meta-ubmc/conf/machine/<机器名>.conf
toolchain_type: EXTERNAL_TOOLCHAIN:arm
repos:
  - yocto_soc                  # 本仓库
  - metaBMC                    # MetaBMC 基础层
layers:
  - yocto_soc/meta-aspeed
  - yocto_soc/meta-ubmc
  - metaBMC/meta-openeuler
  - metaBMC/meta-aspeed
local_conf: |
  OPENEULER_PREBUILT_TOOLS_ENABLE = "no"
  DISTRO_FEATURES:append = " kernel6"
  INIT_MANAGER = "systemd"
  ROOT_HOME = "/home/root"
  PREFERRED_VERSION_linux-openeuler = "6.6%"

一键构建

脚本会自动完成:创建编译用户、安装系统依赖、配置 Docker、安装 oebuild、初始化工作区、拉取仓库、编译及打包 SDK。

四个参数必须提供有效值;未指定时将自动使用以下默认值:

参数 默认值 含义
-user user 编译用户名
-pwd user 编译用户密码
-init oee_workspace 工作区名称
-board ummc 目标单板
sudo ./setup_oee.sh                                           # 默认: user/user/oee_workspace/ummc
sudo ./setup_oee.sh -board umtd                               # 仅切换单板为 UMTD,其余保持默认
sudo ./setup_oee.sh -board ast2600                            # 仅切换单板为 AST2600 EVB
sudo ./setup_oee.sh -user myuser -pwd mypass -init myws      # 自定义用户、密码、工作区名(单板默认 ummc)

也可通过环境变量指定:

sudo env PRODUCT_NAME=umtd TARGET_USER=user TARGET_PASS=user INIT_NAME=oee_workspace ./setup_oee.sh

产物:/home/<用户>/<工作区>/build/<单板>/sdk/oee_sdk_<时间戳>.zip,包含:

  • u-boot-spl.binu-boot.binu-boot-env.bin
  • fitImage-core-image-tiny-initramfs-<单板>.img
  • oee_rootfs.tar.gz
  • ARM 交叉工具链安装脚本

如何修改 yocto_soc 做 UMMC 适配

本节面向想以此仓库为起点、开发自己 AST2600 + eMMC BMC 平台的开发者。

1. 理解机器覆盖机制

Yocto 的 MACHINEOVERRIDES 是关键机制。每个单板文件设置:

MACHINEOVERRIDES =. "ummc:"    # meta-ubmc/conf/machine/ummc.conf

这使得 :ummc 后缀在所有配方中生效:

# 只对 ummc 机器生效
SRC_URI:append:ummc = " file://u-boot-ummc.cfg"
PACKAGE_INSTALL:append:ummc = " ubmc-mmc-init "

2. 新建平台和机器

以新增 myboard 为例:

a) 创建平台定义

# .oebuild/platform/myboard.yaml
type: platform
machine: myboard
toolchain_type: EXTERNAL_TOOLCHAIN:arm
repos:
  - yocto_soc
  - metaBMC
layers:
  - yocto_soc/meta-aspeed
  - yocto_soc/meta-ubmc
  - metaBMC/meta-openeuler
  - metaBMC/meta-aspeed
local_conf: |
  OPENEULER_PREBUILT_TOOLS_ENABLE = "no"
  DISTRO_FEATURES:append = " kernel6"
  INIT_MANAGER = "systemd"
  ROOT_HOME = "/home/root"
  PREFERRED_VERSION_linux-openeuler = "6.6%"

b) 创建机器配置

# meta-ubmc/conf/machine/myboard.conf
MACHINEOVERRIDES =. "myboard:"

require conf/machine/ast2600.conf

# 根据实际 flash 类型选择 U-Boot defconfig
UBOOT_MACHINE = "ast2600_openbmc_spl_emmc_defconfig"

IMAGE_FSTYPES = "tar.gz"
INITRAMFS_FSTYPES:append = " tar.gz "
MACHINE_EXTRA_RRECOMMENDS += " kernel-modules "

c) 添加单板 U-Boot 配置

meta-ubmc/recipes-bsp/u-boot/u-boot-aspeed-sdk_2019.04.bbappend 中追加:

UBOOT_ENV_SIZE:myboard = "0x100000"
UBOOT_ENV_TXT:myboard = "u-boot-env-myboard.txt"
SRC_URI:append:myboard = " file://u-boot-myboard.cfg \
             file://u-boot-env-myboard.txt \
             file://0001-Add-read-env-msg.patch \
"

将板级文件放入 meta-ubmc/recipes-bsp/u-boot/files/

  • u-boot-myboard.cfg — Kconfig 配置碎片(MMC、DM、BLK 等)
  • u-boot-env-myboard.txt — U-Boot 环境变量(bootcmd、分区布局)
  • fw_env_myboard.config — 用户态 fw_env 配置

d) 添加 initramfs 启动脚本

# core-image-tiny-initramfs.bbappend
PACKAGE_INSTALL:append:myboard = " ubmc-mmc-init "

ubmc-mmc-init.bbubmc-mmc-init.sh 安装为 initramfs 的 /init,其功能:

  • 从 cmdline 解析 root=PARTLABEL=<标签>
  • 等待 MMC 设备就绪
  • 按需修复 GPT
  • 以只读方式挂载 ext4 rofs 到 /mnt/rofs
  • 挂载 rwfs 分区到 rofs/var
  • 用 overlayfs 实现 /etc 持久化
  • 执行 switch_root 切换到最终根文件系统

修改 ubmc-mmc-init.sh 中的 MMC 设备路径、分区标签名或启动行为即可。现有默认标签为 rofs-a/rofs-b(根文件系统)、rwfs(数据分区)。

e) 添加内核补丁(按需)

meta-ubmc/recipes-kernel/linux/linux-openeuler.bbappend 中:

COMPATIBLE_MACHINE:append = "|myboard"
SRC_URI += "file://myboard-specific.patch"

f) 将平台定义注册到 oebuild 工作区

oebuild 从 <工作区>/src/yocto-meta-openeuler/.oebuild/platform/ 读取平台定义,而非直接从 yocto_soc。因此需手动传播:

cd <工作区>/src

# 复制平台 YAML 到 yocto-meta-openeuler
cp yocto_soc/.oebuild/platform/myboard.yaml yocto-meta-openeuler/.oebuild/platform/

# 合并 manifest
cat yocto_soc/.oebuild/manifest.yaml >> yocto-meta-openeuler/.oebuild/manifest.yaml

setup_oee.sh 已自动执行此传播,手动构建时需自行完成。

3. 适配检查清单

组件 需要修改的内容
平台定义 .oebuild/platform/<单板>.yaml,并传播到 yocto-meta-openeuler/.oebuild/platform/ + 合并 manifest.yaml
U-Boot defconfig 机器配置中的 UBOOT_MACHINE
U-Boot 环境变量布局 UBOOT_ENV_SIZE、env 文本文件、配置碎片
分区表 u-boot-env-<单板>.txt 中的 GPT 布局、fw_env.config
Initramfs 脚本 MMC 设备路径、分区标签名、恢复出厂 GPIO
内核设备树 机器配置中的 KERNEL_DEVICETREE
内核配置 recipes-kernel/linux/files/ 中添加配置碎片
内核补丁 添加新硬件支持补丁(PECI、I2C、GPIO 等)
镜像特性 IMAGE_FEATURES:remove / IMAGE_INSTALL:append
包组 packagegroup-ubmc-base.bb 配置通用运行时依赖
udev 规则 recipes-core/udev/ 中添加自定义规则

4. 编译命令

# 一键编译(自动传播平台定义)
sudo PRODUCT_NAME=myboard ./setup_oee.sh

# 或手动编译(需先完成步骤 f 的平台注册)
oebuild generate -p myboard
cd build/myboard
oebuild bitbake openeuler-image-obmc
oebuild bitbake u-boot-aspeed-sdk
oebuild bitbake openeuler-image-obmc -c populate_sdk

5. 关键参考文件

文件 作用
meta-aspeed/conf/machine/include/aspeed.inc Aspeed 通用:串口、FIT 镜像、U-Boot provider、WKS
meta-aspeed/conf/machine/ast2600.conf AST2600:DTB、flash 大小、SPL、initramfs 格式
meta-ubmc/conf/machine/ummc.conf UMMC 单板:eMMC U-Boot、离线构建路径、SDK 修复
meta-ubmc/conf/machine/umtd.conf UMTD 单板:SPI U-Boot,配置较简单
meta-ubmc/recipes-bsp/u-boot/files/u-boot-env-ummc.txt UMMC 的 U-Boot 环境变量(含 A/B 启动)
meta-ubmc/recipes-bsp/u-boot/files/u-boot-ummc.cfg UMMC 的 U-Boot Kconfig 碎片
meta-ubmc/recipes-ubmc/initrdscripts/files/ubmc-mmc-init.sh eMMC 的 initramfs init 脚本
.oebuild/platform/ummc.yaml 平台 YAML:层级、仓库、local.conf

镜像定制

本节面向在已有 UMMC/UMTD 平台基础上做增量修改的开发者,覆盖新增工具、裁剪组件、添加驱动、修改包配置、自研应用集成、用户权限、U-Boot/分区、systemd 服务、离线构建加速等常见需求。

新增工具到镜像

Yocto 中向镜像添加软件包有三种方式,按推荐优先级排列:

1) 加入包组(推荐,影响所有使用该包组的单板)

编辑 meta-ubmc/recipes-core/packagegroups/packagegroup-ubmc-base.bb,在 RDEPENDS:${PN} 中追加包名:

RDEPENDS:${PN} = "\
    glib-2.0 \
    rsyslog \
    ... \
    strace \
    ltrace \                # ← 新增工具
    "

现有包组已包含 strace,如需新增其他工具直接追加即可。包组中的包名需与 Yocto 配方名(即 .bb 文件中的 PN)一致。

2) 在镜像 bbappend 中追加(单板通用)

编辑 meta-ubmc/recipes-core/images/openeuler-image-obmc.bbappend

IMAGE_INSTALL:append = " tcpdump"

3) 按单板追加(仅对指定单板生效)

利用 MACHINEOVERRIDES 机制,在镜像 bbappend 中按单板名追加:

IMAGE_INSTALL:append:ummc = " usbutils"
IMAGE_INSTALL:append:umtd = " flashrom"

也可在单板机器配置文件中追加(如 meta-ubmc/conf/machine/ummc.conf):

MACHINE_EXTRA_RRECOMMENDS += " usbutils"

裁剪镜像特性与组件

1) 移除镜像特性(IMAGE_FEATURES)

meta-ubmc/recipes-core/images/openeuler-image-obmc.bbappend 或单板机器配置中:

# 镜像 bbappend(对所有单板生效)
IMAGE_FEATURES:remove = "obmc-bmcweb"

# 单板配置(仅对 ummc 生效)
IMAGE_FEATURES:remove:ummc = "obmc-bmcweb"

当前 ummc.confumtd.conf 已通过 IMAGE_FEATURES:remove = "obmc-bmcweb" 移除了 Web 服务。

2) 移除镜像中的包

IMAGE_INSTALL:remove = "webui-vue"

当前 openeuler-image-obmc.bbappend 已移除 webui-vue

3) 从包组中移除(影响所有单板)

编辑 meta-ubmc/recipes-core/packagegroups/packagegroup-ubmc-base.bb,从 RDEPENDS:${PN} 中删除对应行:

# 将 strace 从包组中移除
RDEPENDS:${PN} = "\
    glib-2.0 \
    rsyslog \
    ... \
    "

添加内核驱动与模块

内核驱动的添加分为两种场景:已有内核源码中启用已有驱动,和添加自研/外部驱动。

1) 启用内核已有驱动 — 配置碎片(推荐)

meta-ubmc/recipes-kernel/linux/files/ 下新建 .cfg 文件(可放在 config/ast2600/ 子目录或 files/ 顶层),每个 .cfg 是一组内核配置选项:

# my_driver.cfg
CONFIG_MY_DRIVER=y
CONFIG_MY_DRIVER_DEBUG=n

然后在 meta-ubmc/recipes-kernel/linux/linux-openeuler.bbappendSRC_URI 中引用:

SRC_URI += " \
    file://0001-evb-remove-parts.patch \
    ... \
    file://config/ast2600/my_driver.cfg \        # ← 新增配置碎片
    "

现有碎片示例:modules.cfg(启用模块加载)、netfilter.cfg(iptables 相关模块)、fragment.cfg(内核配置片段)、add-mtdparts.cfg(MTD 分区支持,位于 files/ 顶层而非 config/ast2600/)。

2) 启用内核已有驱动 — 设备树补丁

若驱动需要在设备树中声明节点,添加 .patch 修改设备树源文件:

SRC_URI += " \
    ... \
    file://0001-enable-my-dts-node.patch \        # ← 新增 DTS 补丁
    "

现有示例:0001-enable-peci.patch 在 AST2600 EVB 设备树中启用 PECI0。

3) 添加自研/外部内核模块 — out-of-tree recipe

meta-ubmc/recipes-kernel/ 下新建配方目录,编写内核模块配方:

# meta-ubmc/recipes-kernel/my-module/my-module.bb
SUMMARY = "My custom kernel module"
LICENSE = "GPL-2.0-only"
LIC_FILES_CHKSUM = "file://COPYING;md5=..."

inherit module

SRC_URI = "git://example.com/my-module.git;protocol=https;branch=main"
SRCREV = "abcdef123456"

S = "${WORKDIR}/git"

# 编译产物自动安装到 /lib/modules/<内核版本>/extra/

然后在镜像中包含此模块:

# meta-ubmc/recipes-core/images/openeuler-image-obmc.bbappend
IMAGE_INSTALL:append = " my-module"

或加入包组:

# meta-ubmc/recipes-core/packagegroups/packagegroup-ubmc-base.bb
RDEPENDS:${PN} += "my-module"

4) 验证内核配置生效

进入编译目录后,可检查最终内核配置:

oebuild bitbake linux-openeuler -c menuconfig    # 交互式查看/修改
oebuild bitbake linux-openeuler -c diffconfig    # 与基准配置对比差异

定制要点速查

需求 修改位置 方式
新增通用工具 packagegroup-ubmc-base.bb RDEPENDS:${PN} 追加包名
新增单板特有工具 openeuler-image-obmc.bbappend IMAGE_INSTALL:append:<单板>
移除特性 openeuler-image-obmc.bbappend 或单板 .conf IMAGE_FEATURES:remove
移除包 openeuler-image-obmc.bbappend IMAGE_INSTALL:remove
移除包组中的包 packagegroup-ubmc-base.bb RDEPENDS:${PN} 删除行
启用内核已有驱动 linux-openeuler.bbappend 添加 .cfg 配置碎片到 SRC_URI
启用设备树节点 linux-openeuler.bbappend 添加 DTS .patchSRC_URI
添加外部内核模块 recipes-kernel/ 新建配方 inherit module,再加入镜像
修改现有包编译选项 对应包的 .bbappend PACKAGECONFIG / EXTRA_OECONF / 配置碎片
添加自研应用 recipes-apps/ 新建配方 inherit autotools / cmake / systemd
新增镜像用户/组 openeuler-image-obmc.bbappend EXTRA_USERS_PARAMS
修改 U-Boot 环境变量 recipes-bsp/u-boot/files/u-boot-env-*.txt 编辑 env 文本 + fw_env*.config
修改分区布局 u-boot-env-*.txt + ubmc-mmc-init.sh GPT 分区标签 + initramfs 挂载逻辑
开/关 systemd 服务 openeuler-image-obmc.bbappend 或包配方 SYSTEMD_AUTO_ENABLE
离线构建 单板 .conf 或平台 YAML local_conf BB_NO_NETWORK + PREMIRROR
加速构建 单板 .conf SSTATE_DIR + DL_DIR 共享路径
修改 SDK 工具链内容 openeuler-image-obmc.bbappend TOOLCHAIN_TARGET_TASK

修改现有包的编译选项

很多情况下不需要新加包,只需调整已有包的编译行为。

1) 通过 PACKAGECONFIG 控制编译特性

在对应包的 .bbappend 中追加或移除特性选项:

# meta-ubmc/recipes-core/systemd/systemd_253.7.bbappend
PACKAGECONFIG:append = " iptc"           # ← 启用 iptables 支持
PACKAGECONFIG:remove = " networkd"       # ← 关闭 networkd

当前 systemd_253.7.bbappend 已追加 iptc

2) 通过 Busybox 配置碎片裁剪/新增命令

meta-ubmc/recipes-core/busybox/files/ 下新建 .cfg 文件:

# my_busybox.cfg
CONFIG_TELNETD=y
CONFIG_FEATURE_WGET_STATUSBAR=y

然后在 meta-ubmc/recipes-core/busybox/busybox_%.bbappendSRC_URI 中引用:

SRC_URI += " \
    file://devmem.cfg \
    file://my_busybox.cfg \            # ← 新增碎片
    "

现有示例:devmem.cfg 启用了 CONFIG_DEVMEM

3) 通过 EXTRA_OECONF 传编译参数

# meta-ubmc/dynamic-layers/openembedded-layer/recipes-support/fmt/fmt_%.bbappend
EXTRA_OECMAKE:append:ummc = " -DFMT_WERROR=OFF"

现有示例:fmt_%.bbappend 对 ummc 单板关闭了 fmt 的 WERROR。

添加自研应用

meta-ubmc/recipes-apps/ 下新建配方目录,根据应用类型选择不同的 inherit 类:

1) C/CMake 应用

# meta-ubmc/recipes-apps/my-app/my-app.bb
SUMMARY = "My BMC management daemon"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://LICENSE;md5=..."

inherit cmake systemd

SRC_URI = "git://gitcode.com/openUBMC/my-app.git;protocol=https;branch=main"
SRCREV = "v1.0.0"

S = "${WORKDIR}/git"

# 安装 systemd 服务单元
SYSTEMD_SERVICE:${PN} = "my-app.service"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"

DEPENDS = "glib-2.0 libgpiod"
RDEPENDS:${PN} = "glib-2.0 libgpiod"

2) 简单脚本/配置类应用

# meta-ubmc/recipes-apps/my-script/my-script.bb
SUMMARY = "Custom BMC setup script"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=..."

inherit allarch

SRC_URI = "file://my-setup.sh \
           file://my-setup.service"

S = "${WORKDIR}"

do_install() {
    install -d ${D}${bindir}
    install -m 0755 ${WORKDIR}/my-setup.sh ${D}${bindir}

    install -d ${D}${systemd_unitdir}/system
    install -m 0644 ${WORKDIR}/my-setup.service ${D}${systemd_unitdir}/system
}

SYSTEMD_SERVICE:${PN} = "my-setup.service"
SYSTEMD_AUTO_ENABLE:${PN} = "disable"

将源文件放在 meta-ubmc/recipes-apps/my-script/files/ 目录下。

加入镜像的方式与前述"新增工具"相同,在包组或镜像 bbappend 中追加包名。

自定义镜像用户与权限

openeuler-image-obmc.bbappend 中通过 EXTRA_USERS_PARAMS 操作:

EXTRA_USERS_PARAMS += " group add -g 1002 hostconsole"
EXTRA_USERS_PARAMS += " user add -u 1003 -g hostconsole -s /bin/bash myadmin"
EXTRA_USERS_PARAMS += " user mod -p '\$6\$salt\$hash' myadmin"     # 设置密码(需用 crypt 格式;在 .bbappend 中 $ 必须转义为 \$,否则 BitBake 会尝试变量展开导致报错)

当前已添加 hostconsole 组(GID 1002)。密码必须用 crypt 格式,可用 openssl passwd -6 生成。注意:在 .bbappend 文件中,$ 必须转义为 \$(BitBake 将 \$ 解析为字面 $),否则 BitBake 会将其视为变量引用而报错。

修改 U-Boot 环境变量与分区布局

1) 修改 U-Boot 环境变量

编辑 meta-ubmc/recipes-bsp/u-boot/files/u-boot-env-ummc.txt(或 u-boot-env-umtd.txt),修改 bootcmd、bootargs、分区定义等:

bootcmd=run boot_rofs_a
bootargs=console=ttyS4,115200n8 root=PARTLABEL=rofs-a rootfstype=ext4 ro
mmcpart=0:6

修改后需确认:

  • UBOOT_ENV_TXT:<单板>u-boot-aspeed-sdk_2019.04.bbappend 中指向正确文件名
  • UBOOT_ENV_SIZE:<单板> 与实际 env 大小匹配(UMMC 当前为 0x100000 = 1MB)

2) 修改 eMMC 分区布局

分区由两层定义:

  • GPT 分区表:在 u-boot-env-ummc.txt 中通过 mmcpart 等变量描述,由 ubmc-mmc-init.sh 调用 sgdisk 创建
  • 挂载逻辑:在 meta-ubmc/recipes-ubmc/initrdscripts/files/ubmc-mmc-init.sh 中,按 PARTLABEL 标签挂载 rofs/rwfs

修改分区布局需同时更新:

  • u-boot-env-ummc.txt 中的分区定义
  • ubmc-mmc-init.sh 中的挂载逻辑(分区标签、挂载路径)
  • fw_env_ummc.config 中的 env 坏块偏移

自定义 systemd 服务启停

1) 控制包自带服务的开机自启

在包配方或 bbappend 中通过 SYSTEMD_AUTO_ENABLE 控制:

SYSTEMD_AUTO_ENABLE:${PN} = "enable"    # 开机自启
SYSTEMD_AUTO_ENABLE:${PN} = "disable"   # 安装但不自启

2) 按单板差异化控制

SYSTEMD_AUTO_ENABLE:${PN}:ummc = "enable"
SYSTEMD_AUTO_ENABLE:${PN}:umtd = "disable"

离线构建与加速

1) 离线构建

在单板机器配置(如 ummc.conf)或平台 YAML 的 local_conf 中:

BB_NO_NETWORK = "1"
BB_FETCH_PREMIRRORONLY = "1"

需先将所有源码包下载到本地镜像路径(DL_DIR 指定的目录),或准备 src.tar.gz 源码包(setup_oee.sh 中已有离线构建注释段,取消注释即可启用)。

2) 构建加速 — 共享 sstate 缓存

在单板配置中指定共享路径(当前 ummc.conf 已配置):

SSTATE_DIR = "/usr1/openeuler/global_sstate"
DL_DIR = "/usr1/openeuler/src/downloads"

多台机器共享同一 SSTATE_DIRDL_DIR 可大幅缩短增量构建时间。需在 build/<单板>/compile.yaml 中将本地目录映射进 Docker 容器(setup_oee.sh 中已有 sstate 映射逻辑)。

依赖

  • oebuild(pip3 安装):pip3 install oebuild --user
  • MetaBMChttps://atomgit.com/openeuler/MetaBMC.git
  • Docker(用于构建隔离)
  • 外部 ARM 工具链(通过 EXTERNAL_TOOLCHAIN:arm 设置)