【问题标题】:Yocto - select the right configuration file based on image typeYocto - 根据图像类型选择正确的配置文件
【发布时间】:2019-10-23 13:56:50
【问题描述】:

在我相当标准的 Yocto 构建中,我包含了 openssh。它的配置文件,/etc/ssh/sshd_config,对于生产和开发镜像来说自然应该是不同的(例如,一个想在开发镜像上以 root 登录,而不是在生产镜像上)。 生产和开发图像是我层下recipes-core/images 中的不同配方(.bb 文件),其中还包括一些其他内容。 为了实现sshd_config文件的自定义,我在我的层下创建了recipes-connectivity/openssh目录openssh_%.bbappend,内容如下:

SUMMARY = "OpenSSH configuration"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

files 目录中,我有自己的sshd_conf。这很好用,我的文件被用来代替 openssh 的默认文件。但是,我怎么能拥有两个单独的文件来影响两个不同的结果 rootfs? 我见过的最接近的是this question,而this answer 似乎太简单了,难以置信。我已经尝试将我的图像名称用于文件夹,但我得到的只是两个生成的图像构建中的默认 conf 文件。第二个答案很合理,但是我无法替换来自其他配方的文件(如果我错了,请纠正我),所以对于有效的 OP,这可能是一个非常具体的案例。 运行安装后脚本不是一个选项,因为 rootfs 在目标上是只读的。 学习手册中的 _append_xxxx 内容并没有将我推向正确的方向。

希望有人可以分享一些经验,因为这似乎是一个非常简单的问题,应该有一些内置的解决方案。

谢谢。

【问题讨论】:

  • 一种解决方案是使用overlay bbclass。另一种解决方案是在 local.conf 中创建一个自定义变量,比如说IS_PROD = "1",然后你可以在你的图像配方中使用类似这样的东西:SRC_URI += "${@ "file://conf1" if bb.utils.to_boolean(d.getVar('IS_PROD')) else "file://conf2" }"
  • @Nayfe,我不想在 local.conf 中设置这个,因为它是两个图像的同一个文件。 @danlor,也许我可以使用两个单独的配方,添加一个替换文件的pkg_postinst_${PN}() {},并将它们添加到不同的图像配方中?会尝试的。感谢您的建议。
  • 你可以在do_install()中做同样的事情来重命名sshd_config中的conf1或conf2。您还可以在 ROOTFS_POSTPROCESS_COMMAND 中使用 echo/sed 调整默认文件

标签: yocto


【解决方案1】:

在我目前收到的热心帮助和其他几个答案的帮助下,我找到了一个可行的解决方案。

在我的图层中有recipes-connectivity/openssh/openssh_%.bbappend,其内容如下:

do_install_append () {
    rm ${D}${sysconfdir}/ssh/sshd_config
}

这将删除由原始openssh 配方安装的sshd_config 文件。

接下来,我的层中有两个额外的配方:recipes-core/openssh_conf_prod/openssh_conf_dev_0.1.bbrecipes-core/openssh_conf_prod/openssh_conf_prod_0.1.bb。在files 子目录下的两个配方目录中,都有一个opensshd_conf 文件,devprod 不同。 .bb 配方在这两种情况下是相同的,不过:

DEPENDS = "openssh"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"

SRC_URI = "file://sshd_config"

S = "${WORKDIR}"

do_install() {
    install -d ${D}${sysconfdir}/ssh
    install ${WORKDIR}/sshd_config ${D}${sysconfdir}/ssh
}

(*) 注意开头的DEPENDS

recipe 所做的只是验证是否存在要将文件复制到的目标目录,并将其在 files 目录下的文件复制到目标 rootfs。

当然,我的食谱的recipes-core/images 目录下的proddev 图像文件包括每个相关的openssh_conf_devopenssh_conf_prod 食谱,例如CORE_IMAGE_EXTRA_INSTALL_append 变量。

总结一下,流程是:

  1. openssh 正在按照映像配方的要求安装。
  2. sshd_config 正在被 openssh 的新 .bbappend 配方删除。
  3. 每种类型的图像都会调用自己的配方,从而将正确的配置文件添加到正确的文件夹中。

我不确定这有多优雅,但确实可以。

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2020-09-04
    • 2012-01-04
    • 2014-01-14
    • 2014-01-22
    相关资源
    最近更新 更多