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.conf、umtd.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 - Initramfs:
ubmc-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 只读(
rofsMTD 分区) - 读写分区:JFFS2 读写覆盖(
rwfsMTD 分区) - U-Boot 环境变量:128KB,存放在 MTD
u-boot-env分区 - 更新:initramfs 支持 TFTP/HTTP 下载
- Initramfs:
ubmc-mtd-init.sh— 查找 MTD 分区、支持恢复出厂、overlayfs
构建系统(oebuild)
使用 openEuler Embedded 的 oebuild 工具链:
oebuild init <工作区名> -b openEuler-24.03-LTSoebuild update— 拉取配置的仓库- 将
yocto_soc克隆到<工作区>/src/yocto_soc - 将
yocto_soc/.oebuild/platform/下的平台 YAML 复制到<工作区>/src/yocto-meta-openeuler/.oebuild/platform/ - 将
yocto_soc/.oebuild/manifest.yaml内容追加到<工作区>/src/yocto-meta-openeuler/.oebuild/manifest.yaml oebuild generate -p <平台名>— 生成 BitBake 编译目录cd build/<平台名>进入编译目录oebuild bitbake openeuler-image-obmcoebuild bitbake u-boot-aspeed-sdkoebuild 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.bin、u-boot.bin、u-boot-env.binfitImage-core-image-tiny-initramfs-<单板>.imgoee_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.bb 将 ubmc-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.conf和umtd.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.bbappend 的 SRC_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 .patch 到 SRC_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_%.bbappend 的 SRC_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_DIR 和 DL_DIR 可大幅缩短增量构建时间。需在 build/<单板>/compile.yaml 中将本地目录映射进 Docker 容器(setup_oee.sh 中已有 sstate 映射逻辑)。
依赖
- oebuild(pip3 安装):
pip3 install oebuild --user - MetaBMC:
https://atomgit.com/openeuler/MetaBMC.git - Docker(用于构建隔离)
- 外部 ARM 工具链(通过
EXTERNAL_TOOLCHAIN:arm设置)