Yocto-根据映像类型选择正确的配置文件

Yocto-根据映像类型选择正确的配置文件,yocto,Yocto,在我相当标准的Yocto构建中,我包含了openssh。它的配置文件,/etc/ssh/sshd_config,对于生产映像和开发映像自然应该是不同的(例如,您希望在开发映像上使用root登录,而不是在生产映像上使用root登录)。 生产和开发图像是我的图层下的recipes core/images中的不同配方(.bb文件),其中还包括一些其他内容。 为了实现sshd\u config文件的定制,我在我的层下创建了recipes connectivity/openssh目录,其中包含openss

在我相当标准的Yocto构建中,我包含了
openssh
。它的配置文件,
/etc/ssh/sshd_config
,对于生产映像和开发映像自然应该是不同的(例如,您希望在开发映像上使用root登录,而不是在生产映像上使用root登录)。 生产和开发图像是我的图层下的
recipes core/images
中的不同配方(.bb文件),其中还包括一些其他内容。 为了实现
sshd\u config
文件的定制,我在我的层下创建了
recipes connectivity/openssh
目录,其中包含
openssh\uu%.bbappend
,仅包含以下内容:

SUMMARY = "OpenSSH configuration"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
files
目录中,我有自己的
sshd\u conf
。这很好,使用的是我的文件,而不是openssh的默认文件。但是,我怎么能有两个单独的文件来影响两个不同的rootfs呢? 我见过的最接近的是,而且似乎太简单而不真实。我已经尝试使用我的文件夹图像名,但我得到的只是两个生成的图像中的默认conf文件。第二个答案是合理的,但我不能替换来自其他配方的文件(如果我错了,请纠正我),所以这可能是OP的一个非常具体的情况。 运行安装后脚本不是一个选项,因为rootfs在目标上是只读的。 研究手册中的_append _xxxx内容并没有把我推向正确的方向

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


谢谢。

在目前为止我得到的善意帮助和其他一些答案的帮助下,我找到了一个可行的解决方案

在我的层中有
recipes connectivity/openssh/openssh\%.bbappend
,包含以下内容:

do_install_append () {
    rm ${D}${sysconfdir}/ssh/sshd_config
}
这将删除原始
openssh
配方安装的
sshd\u config
文件

接下来,在我的层中还有两个额外的配方:
recipes-core/openssh\u-conf\u-prod/openssh\u-conf\u-dev\u 0.1.bb
recipes-core/openssh\u-conf\u-prod/openssh\u-conf\u-prod\u 0.1.bb
。在
files
子目录下的两个配方目录中,都有一个
opensshd_conf
文件,对于
dev
prod
不同。
.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
}
(*)注意开头的
取决于

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

当然,在我的配方的
recipes core/images
目录下的
prod
dev
图像文件包括相关的
openssh\u conf\u dev
openssh\u conf\u prod
配方,例如
core\u image\u EXTRA\u INSTALL\u append
变量

总之,流程是:

  • 正在按照映像配方的要求安装openssh
  • sshd\u config
    正在被
    openssh
    的新
    .bbappend
    配方删除
  • 每种类型的映像都会调用自己的配方,从而将正确的配置文件添加到正确的文件夹中

  • 我不确定这有多优雅,但它确实起到了作用。

    在目前为止我得到的善意帮助和其他几个答案的帮助下,我找到了一个可行的解决方案

    在我的层中有
    recipes connectivity/openssh/openssh\%.bbappend
    ,包含以下内容:

    do_install_append () {
        rm ${D}${sysconfdir}/ssh/sshd_config
    }
    
    这将删除原始
    openssh
    配方安装的
    sshd\u config
    文件

    接下来,在我的层中还有两个额外的配方:
    recipes-core/openssh\u-conf\u-prod/openssh\u-conf\u-dev\u 0.1.bb
    recipes-core/openssh\u-conf\u-prod/openssh\u-conf\u-prod\u 0.1.bb
    。在
    files
    子目录下的两个配方目录中,都有一个
    opensshd_conf
    文件,对于
    dev
    prod
    不同。
    .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
    }
    
    (*)注意开头的
    取决于

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

    当然,在我的配方的
    recipes core/images
    目录下的
    prod
    dev
    图像文件包括相关的
    openssh\u conf\u dev
    openssh\u conf\u prod
    配方,例如
    core\u image\u EXTRA\u INSTALL\u append
    变量

    总之,流程是:

  • 正在按照映像配方的要求安装openssh
  • sshd\u config
    正在被
    openssh
    的新
    .bbappend
    配方删除
  • 每种类型的映像都会调用自己的配方,从而将正确的配置文件添加到正确的文件夹中

  • 我不确定这有多优雅,但它确实起到了作用。

    也许这可以帮助你,一个解决方案就是使用。另一个解决方案是在local.conf中创建一个自定义变量,比如说
    is_PROD=“1”
    ,然后您可以在图像配方中使用类似的内容:
    SRC_URI+=“${@”file://conf1“如果bb.utils.to_boolean(d.getVar('IS_PROD'))else”file://conf2“}”
    @Nayfe,我不想在local.conf中设置此项,因为这两个图像都是同一个文件@danlor,也许我可以使用两个单独的配方添加一个替换文件的
    pkg\u postinst{PN}(){}
    ,并将它们添加到不同的图像配方中?我会试试的。谢谢您的建议。您可以在
    do\u install()
    中执行相同的操作,在
    sshd\u config
    中重命名conf1或conf2。您还可以调整d