4 定制镜像

可以定制镜像以满足特定要求。本节介绍几种方法,并给出相应指导。

4 使用 local.conf 定制镜像

最简单的镜像定制方式,可能是通过 build/conf/local.conf 配置文件添加软件包。此方法仅适合本地使用,通常只能添加软件包,不如创建 自己的定制镜像灵活。通过本地变量添加软件包时,这些变量变化会对每次构建 生效,因此影响所有镜像,未必符合实际需求。

要通过本地配置文件向镜像添加软件包,将 IMAGE_INSTALL 变量与 :append 运算符配合使用:

IMAGE_INSTALL:append = " strace"

请注意语法,尤其是左引号之后、软件包名之前的前导空格,本例软件包为 strace。必须显式保留此空格,因为 :append 不会自动添加。

此外,为避免顺序问题,应使用 :append 而不是 +=。前者无条件追加 变量,可避免镜像配方和 .bbclass 文件通过 ?= 等运算符设置变量 造成的顺序问题,确保追加操作生效。

最简单形式的 IMAGE_INSTALL:append 会影响全部镜像。也可以扩展语法, 使变量只作用于特定镜像,例如:

IMAGE_INSTALL:append:pn-core-image-minimal = " strace"

此例仅向 core-image-minimal 添加 strace。

也可以通过 CORE_IMAGE_EXTRA_INSTALL 变量采用类似方式添加软件包。 此变量只影响 core-image-* 镜像。

4 通过自定义 IMAGE_FEATURES 和 EXTRA_IMAGE_FEATURES 定制镜像

另一种方法是使用 IMAGE_FEATURES 和 EXTRA_IMAGE_FEATURES 启用或禁用高层镜像功能。两者功能基本相同,但推荐在配方中使用 IMAGE_FEATURES;临时修改则在 Build Directory 中的 build/conf/local.conf 使用 EXTRA_IMAGE_FEATURES, 永久修改放在发行版 configuration file 中。

理解这些功能最好的参考是 meta/classes-recipe/image.bbclass。该类列出了 可用的 IMAGE_FEATURES,多数映射到软件包组,部分则对应一般配置, 例如 read-only-rootfs。

该文件检查 IMAGE_FEATURES 的内容,再相应映射或配置功能。根据这些 信息,构建系统自动将适当的软件包或配置加入 IMAGE_INSTALL。 实际上,可以通过扩展该类或创建自定义类,配合专用镜像 .bb 文件启用 额外功能。

在本地配置文件中使用 EXTRA_IMAGE_FEATURES。通过独立位置启用功能, 可以避免覆盖镜像配方通过 IMAGE_FEATURES 启用的功能。 meta/conf/bitbake.conf 会把 EXTRA_IMAGE_FEATURES 的值加到 IMAGE_FEATURES。

以选择 SSH 服务器为例说明这些变量的用法。Yocto Project 提供 Dropbear 和 OpenSSH 两种 SSH 服务器。Dropbear 是适合资源受限环境的精简实现,OpenSSH 则是广为使用的标准实现。默认情况下,core-image-sato 使用 Dropbear, core-image-full-cmdline 包含 OpenSSH,core-image-minimal 不含 SSH 服务器。

可以定制镜像以改变默认行为。编辑配方中的 IMAGE_FEATURES,或在 build/conf/local.conf 或发行版 configuration file 中使用 EXTRA_IMAGE_FEATURES,让镜像包含 ssh-server-dropbear 或 ssh-server-openssh。

备注

Yocto Project 附带镜像功能的完整列表,见参考手册的 “镜像功能” 一节。

4 使用自定义 .bb 文件定制镜像

也可以创建自定义配方,将额外软件定义为镜像的一部分。所需两行的形式如下:

IMAGE_INSTALL = "packagegroup-core-x11-base package1 package2"
inherit core-image

通过自定义配方定义软件,可以完全控制镜像内容。IMAGE_INSTALL 中 务必使用正确的软件包名称,即 OpenEmbedded 名称而不是 Debian 名称, 例如使用 glibc-dev,而非 libc6-dev。

另一种创建自定义镜像的方式是基于已有镜像。例如,要以 core-image-sato 为基础增加 strace,可将 meta/recipes-sato/images/core-image-sato.bb 复制为新的 .bb 文件,并在副本末尾添加:

IMAGE_INSTALL += "strace"

4 使用自定义软件包组定制镜像

对于复杂的自定义镜像,最佳方式是创建自定义软件包组配方,用于构建一个或 多个镜像。meta/recipes-core/packagegroups/packagegroup-base.bb 是很好的 软件包组配方示例。

该配方通过 PACKAGES 列出要生成的软件包组软件包。 inherit packagegroup 设置适当默认值,并为 PACKAGES 中每个 软件包自动添加 -dev、-dbg 和 -ptest 配套软件包。

备注

inherit packagegroup 应放在配方靠前位置,务必在 PACKAGES 语句之前。

对于 PACKAGES 中的每个软件包,可以通过 RDEPENDS 和 RRECOMMENDS 指定父任务软件包应包含的软件包列表。 packagegroup-base.bb 后面的内容提供了示例。

以下简短示例在 packagegroup-custom.bb 中定义一个假设的软件包组,展示 相同的基本组成。PN 是引用完整名称 packagegroup-custom 的标准 缩写方式:

DESCRIPTION = "My Custom Package Groups"

inherit packagegroup

PACKAGES = "\
    ${PN}-apps \
    ${PN}-tools \
    "

RDEPENDS:${PN}-apps = "\
    dropbear \
    portmap \
    psplash"

RDEPENDS:${PN}-tools = "\
    oprofile \
    oprofileui-server \
    lttng-tools"

RRECOMMENDS:${PN}-tools = "\
    kernel-module-oprofile"

上例创建了 packagegroup-custom-apps 和 packagegroup-custom-tools 两个软件包组,并列出了各自的依赖和推荐依赖。要用它们构建镜像,需要将 其中一个或两个加入 IMAGE_INSTALL。其他形式的镜像依赖见本节其他部分。

4 定制镜像主机名

默认情况下,镜像中的主机名配置(/etc/hostname)与机器名称相同。例如, MACHINE 为 "qemux86" 时,写入 /etc/hostname 的名称也是 "qemux86"。

可以通过追加文件或配置文件修改 base-files 配方的 "hostname" 变量, 定制主机名。追加文件中使用:

hostname = "myhostname"

配置文件中使用:

hostname:pn-base-files = "myhostname"

某些情况下修改 "hostname" 默认值很有用。例如,需要对镜像进行大量测试, 希望将测试镜像与使用普通默认主机名的已有镜像区分开,可以将默认主机名设为 "testme",使所有镜像使用此名称。测试完成、不再需要为测试重建镜像后, 即可方便地恢复默认值。

另外,将此变量清空后,镜像文件系统将没有默认主机名。配置文件中的示例如下:

hostname:pn-base-files = ""

文件系统不提供默认主机名的做法适用于虚拟机等使用动态主机名的环境。