在我的标准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文件。第二个答案似乎很合理,但是AFAIK我无法替换来自其他配方的文件(如果我错了,请更正我),因此对于有效的OP来说,这可能是一个非常特殊的情况。
不能选择运行安装后脚本,因为rootfs在目标计算机上是只读的。
学习手册中的_append_xxxx东西也没有将我推向正确的方向。
希望有人可以分享一些经验,因为这似乎是一个非常简单的问题,应该有一些内置的解决方案。
谢谢。
答案 0 :(得分:0)
借助到目前为止所获得的友好帮助以及其他一些答案,我已经找到了可行的解决方案。
在我的图层中,recipes-connectivity/openssh/openssh_%.bbappend
的内容如下:
do_install_append () {
rm ${D}${sysconfdir}/ssh/sshd_config
}
这将删除原始sshd_config
食谱安装的openssh
文件。
接下来,在我的图层中还有另外两个食谱: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。
然后,我食谱的prod
目录下的dev
和recipes-core/images
图像文件当然包括下面的每个相关openssh_conf_dev
或openssh_conf_prod
食谱,例如CORE_IMAGE_EXTRA_INSTALL_append
变量。
最后,流程为:
openssh
正在根据映像配方的要求进行安装。sshd_config
的新.bbappend
配方正在删除openssh
。我不确定这有多优雅,但确实可以。