Yocto - select 基于图像类型的正确配置文件
Yocto - select the right configuration file based on image type
在我非常标准的 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 的默认文件。但是我怎么能有两个单独的文件来影响两个不同的结果根文件系统呢?
我见过的最接近的是 , and 似乎太简单了,不可能是真的。我试过使用我的图像名称作为文件夹,但我得到的只是两个生成的图像构建中的默认 conf 文件。第二个答案接缝合理,但 AFAIK 我无法替换来自其他食谱的文件(如果我错了请纠正我),所以对于有效的 OP 来说这可能是一个非常具体的案例。
运行 post-install 脚本不是一个选项,因为 rootfs 在目标上是只读的。
研究手册中的 _append_xxxx 内容也没有将我推向正确的方向。
希望有人可以分享一些经验,因为这似乎是一个非常简单的问题,应该有一些内置的解决方案。
谢谢。
凭借迄今为止收到的帮助和其他几个答案,我找到了可行的解决方案。
在我的图层中有 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.bb
和 recipes-core/openssh_conf_prod/openssh_conf_prod_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
}
(*) 注意开头的DEPENDS
。
配方所做的只是验证有一个目标目录可以将文件复制到,并将它在 files
目录下的文件复制到目标 rootfs。
然后,当然,我食谱的 recipes-core/images
目录下的 prod
和 dev
图像文件包含每个相关的 openssh_conf_dev
或 openssh_conf_prod
食谱,例如 CORE_IMAGE_EXTRA_INSTALL_append
变量。
总而言之,流程是:
openssh
正在按照图像配方的要求进行安装。
sshd_config
正在被 openssh
的新 .bbappend
配方删除。
- 每种图像调用自己的配方,将正确的配置文件添加到正确的文件夹。
我不确定这有多优雅,但它确实起作用了。
在我非常标准的 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 的默认文件。但是我怎么能有两个单独的文件来影响两个不同的结果根文件系统呢?
我见过的最接近的是
希望有人可以分享一些经验,因为这似乎是一个非常简单的问题,应该有一些内置的解决方案。
谢谢。
凭借迄今为止收到的帮助和其他几个答案,我找到了可行的解决方案。
在我的图层中有 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.bb
和 recipes-core/openssh_conf_prod/openssh_conf_prod_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
}
(*) 注意开头的DEPENDS
。
配方所做的只是验证有一个目标目录可以将文件复制到,并将它在 files
目录下的文件复制到目标 rootfs。
然后,当然,我食谱的 recipes-core/images
目录下的 prod
和 dev
图像文件包含每个相关的 openssh_conf_dev
或 openssh_conf_prod
食谱,例如 CORE_IMAGE_EXTRA_INSTALL_append
变量。
总而言之,流程是:
openssh
正在按照图像配方的要求进行安装。sshd_config
正在被openssh
的新.bbappend
配方删除。- 每种图像调用自己的配方,将正确的配置文件添加到正确的文件夹。
我不确定这有多优雅,但它确实起作用了。