如何将linux系统文件覆盖到yocto文件系统中?

时间:2019-02-09 11:11:50

标签: linux yocto recipe rootfs

我是新来的,是在imx6q嵌入式系统上构建的。

我想在do_rootfs之后覆盖linux系统文件。例如,目标系统文件在下面。

  • / etc / network / interface
  • / etc / issue
  • /etc/init.d/rcS
  • /home/root/mytest.sh

所以,我做了定制层和定制配方。 helloworld二进制文件可以正常复制了。
但是,不会调用do_mytask函数。

我的代码有什么问题? 或任何其他用于我目的的方法。

#
# This file was derived from the 'Hello World!' example recipe in the
# Yocto Project Development Manual.
#
SUMMARY = "Simple helloworld application"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"

do_compile() {
         ${CC} helloworld.c -o helloworld
}

do_install() {
         install -d ${D}${bindir}
         install -m 0755 helloworld ${D}${bindir}
}   

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += " \
  file://interfaces \
  file://issue \
  file://mytest.sh \
"

addtask mytask after do_rootfs before do_image
do_mytask() {
         install -d ${D}/etc/network
         cp -af ${WORKDIR}/interfaces ${D}/etc/network/interfaces
         cp -af ${WORKDIR}/issue ${D}/etc/issue
}

4 个答案:

答案 0 :(得分:1)

取决于要修改的文件。例如,如果您在朴素的目录中搜索“接口”,则会在“元/配方核心/ init-ifupdown / init-ifupdown-$ {PV} /”中找到它。您只需要在元数据中创建一个名为init-ifupdown-$ {PV} .bbappend的配方,即可重新创建poky中可见的路径(recipes-core / init-ifupdown /)。该食谱可以包含一行:

FILESEXTRAPATHS_prepend: = "${THISDIR}/files:"

然后,使用所需的“ interfaces”文件创建一个“ files”文件夹。

对于“问题”,就像在/ etc目录(配置文件,fstab等)中找到的其他问题一样,其过程相同,其来源在poky / meta / recipes-core / base-files /中。 >

对于init.d脚本,请使用'update-rc'类。

答案 1 :(得分:1)

您的配方不是“图像配方”(并且不应用于问候世界),因此在这种情况下,您不能使用任务do_rootfs和do_image。需要澄清的一点是:图像配方是.bb文件,可用于通过bitbake或devtool构建图像(在您的情况下,某些包含imx6q,则可以使用bitbake-layers show-recipes "*-image-*"找到它们)。

看来您正在寻找一种真正的重写do_install的方法,该方法可以安装提到的文件。然后找到安装这些文件的配方,然后在顶层创建bbappend文件。此bbappend文件可能包含do_install_append个任务,您可以在其中放置install <file> <dir>行(请注意,不建议使用cp,所有操作都应通过安装工具完成)。

答案 2 :(得分:1)

根据 Carsten Hansen 为 Xilinx/Petalinux 工作人员的原始答案添加额外评论。

在 Petalinux 环境下,我们并没有真正的命令:oe-pkgdata-util,所以策略是在 Xilinx SDK 文件夹中进行搜索。根据文档,您可能将它安装在 /opt 下的 Linux 上。如果你这样做:

grep -r syslog-startup.conf .

您将看到 busybox 方法是安装 syslog-startup.conf 的方法。

您可以在以下位置创建名为 busybox_%.bbappend 的覆盖配方:

../project-spec/meta-user/recipes-core/busybox/

将修改后的 syslog-startup.conf 文件放在:

../project-spec/meta-user/recipes-core/busybox/files/syslog-startup.conf

通过 petalinux-build 重建。您还可以通过 petalinux-build -c rootfs 强制创建 rootfs,系统应该会填充您的新文件。

答案 3 :(得分:0)

您需要扩展提供要替换文件的配方。

/etc/network/interfaces为例,第一步是弄清楚哪个配方安装了该文件。

从位烘烤提示:

$ oe-pkgdata-util find-path /etc/network/interfaces
init-ifupdown: /etc/network/interfaces

因此,这告诉我们/etc/network/interfaces收据已安装init-ifupdown

文件搜索显示init-ifupdown是poky的一部分:

$ find . -name init-ifupdown*.bb
./poky/meta/recipes-core/init-ifupdown/init-ifupdown_1.0.bb

现在,由于您需要修改init-ifupdown的输出,因此需要通过自己创建一个类似命名的init-ifupdown扩展 .bbappend层。

您可以在以下位置创建新的.bbappend

my-layer/receipes-core/init-ifupdown/init-ifupdown_%.bbappend

%是一个通配符,可确保.bbappend适用于init-ifupdown食谱的所有将来版本,这可能是您想要的。

将您的自定义interfaces文件放在.bbappend下方的文件夹中:

my-layer/receipes-core/init-ifupdown/files/interfaces

.bbappend仅需要包含一行,以使bitbake能够拾取新的interfaces文件:

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

最后,对要替换的每个系统文件重复以上操作。