PAYATHON 2026

Yocto 中哪些配置应放在 distro conf,哪些应放在 image recipe?

数据阿明

结论

把影响整个发行版的软件构建策略放在 distro conf;把某个镜像需要安装的软件包和镜像功能放在 image recipe。

判断时可以先看设置的影响范围:需要影响其他软件编译的设置,通常放在发行版配置或相关软件的 recipe 中;只决定当前镜像最终包含什么的设置,通常放在 image recipe 中。

你的 dev.conf 与 dev-image.bb 不必一一对应。如果 dev 和 user 只是预装工具不同,通常使用一个 distro 和两个 image recipe 就足够了。

为什么两种文件都能修改变量,却不能随意互换?

你给出的目录结构本身没有问题。两类文件都使用 BitBake 语法,但变量生效的上下文不同,这一点容易混淆。

BitBake 先读取全局配置,再为每个 recipe 创建一份基础配置的副本。因此:

  • 被选中的 distro conf 参与全局配置,其设置可以被各个 recipe 读取,具体效果还取决于 override、后续赋值和变量使用方式。
  • image recipe 中的普通变量赋值作用于该 image recipe 的上下文,不会自动传播到它依赖的软件 recipe。

例如,在 dev-image.bb 中修改 DISTRO_FEATURES,另一个库的 recipe 不会因此自动按新的 feature 重新配置编译。BitBake 解析流程

常见配置应该放在哪里?

配置意图通常放置的位置典型变量或方式
决定发行版支持哪些软件能力distro confDISTRO_FEATURES
统一选择软件 provider 或版本distro confPREFERRED_PROVIDER_*、PREFERRED_VERSION_*
指定某个镜像安装哪些包image recipeIMAGE_INSTALL
为某个镜像启用 SSH 服务、调试工具等功能image recipeIMAGE_FEATURES
调整单个软件的编译方式该软件的 recipe 或 .bbappend;发行版策略也可通过配置定向设置PACKAGECONFIG、构建参数等
临时调整本地构建build/conf/local.conf按需要设置相应变量

要注意区分 DISTRO_FEATURES 和 IMAGE_FEATURES:

  • DISTRO_FEATURES 表达发行版希望支持的能力,相关 recipe 可以据此选择编译选项或依赖;效果取决于 recipe 是否实现了对应支持。
  • IMAGE_FEATURES 表达镜像需要的功能,由镜像相关 class 转换成软件包选择或 root filesystem 配置。

在 DISTRO_FEATURES 中启用某项功能,并不意味着对应软件已经完整安装进镜像。Yocto 变量说明

如何调整你的 dev 和 user 配置?

只有预装软件不同:保留一个 distro,使用两个镜像

假设 dev 镜像需要额外的排查工具,user 镜像使用相同的发行版构建策略,那么两者可以基于同一个镜像基础。

下面是一种组织方式,项目中未必已有这些配置。

dev-image.bb:

require recipes-core/images/core-image-minimal.bb

IMAGE_INSTALL:append = " strace"
IMAGE_FEATURES:append = " tools-debug"

user-image.bb:

require recipes-core/images/core-image-minimal.bb

选择同一个 DISTRO 后,分别构建:

bitbake dev-image
bitbake user-image

开发镜像会额外请求安装 strace 和调试工具。两个镜像仍共享同一套发行版策略及相容的软件包构建结果。

公共软件较多时,可以用 packagegroup 管理包集合,再由两个 image recipe 分别引用。在 recipe 内使用 IMAGE_FEATURES 设置镜像功能;如果需要从配置文件统一追加镜像功能,可以使用 EXTRA_IMAGE_FEATURES,并留意其影响范围。Yocto 镜像定制指南

软件构建策略也不同:保留两个 distro

如果 dev 和 user 需要不同的 DISTRO_FEATURES、软件 provider 或其他发行版级策略,分别保留 dev.conf 和 user.conf 是合理的。

两份配置可以通过公共 .inc 文件共享设置,再各自保留差异。相应的 image recipe 仍只负责镜像组成。

distro 和镜像的选择相互独立。例如,在构建配置中设置:

DISTRO = "dev"

然后执行:

bitbake dev-image

文件名之间没有自动绑定关系。执行 bitbake user-image 不会因为名称相似就自动切换到 user.conf。

修改后如何确认配置生效?

可以查看目标 recipe 的最终变量值和赋值历史:

bitbake -e dev-image
bitbake -e user-image

重点检查 DISTRO、DISTRO_FEATURES、IMAGE_INSTALL 和 IMAGE_FEATURES。如果修改涉及某个库的编译,还应检查该库 recipe 的环境,不能只看 image recipe 中的值。BitBake 环境检查方式

示例使用支持冒号 override 语法的 BitBake 写法;旧分支需要采用对应语法。:append 不会自动补空格,因此示例中的前导空格需要保留。另外,user-image 这个名称不保证镜像适合生产使用,其最终功能仍受基础镜像、distro 和本地配置共同影响。

备注:内容仅供参考。