1

我是新手,yocto 在imx6q嵌入式系统上构建。

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

  • /etc/网络/接口
  • /etc/问题
  • /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

4 回答 4

5

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

/etc/network/interfaces示例为例,第一步是确定哪个配方安装了该文件。

从 bitbake 提示符:

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

所以这告诉我们/etc/network/interfaces是由init-ifupdownreceipe安装的。

文件搜索显示这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

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

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

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

.bbappendthen 只需要包含一行来启用 bitbake 来获取新文件interfaces

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

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

于 2019-02-11T03:06:21.650 回答
2

这取决于要修改的文件。例如,如果您在 poky 目录中搜索“interfaces”,您会在“meta/recipes-core/init-ifupdown/init-ifupdown-${PV}/”中找到它。您只需要在您的元中创建一个名为 init-ifupdown-${PV}.bbappend 的配方,重新创建在 poky 中看到的路径(recipes-core/init-ifupdown/)。这个配方可以包含一行:

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

然后你用你想要的'interfaces'文件创建一个'files'文件夹。

对于“问题”,就像在 /etc 目录(profile、fstab、...)中找到的其他内容一样,它是相同的过程,源代码位于 poky/meta/recipes-core/base-files/ 中。

对于 init.d 脚本,使用“update-rc”类。

于 2019-02-09T23:35:18.817 回答
1

您的配方不是“图像配方”(它不应该用于 hello world),因此在这种情况下您不能使用任务 do_rootfs 和 do_image。澄清一下:图像配方是 .bb 文件,您可以使用 bitbake 或 devtool 构建图像(在您的情况下,一些包含 imx6q,您可以使用 找到它们bitbake-layers show-recipes "*-image-*")。

看起来您正在寻找的确实是一种覆盖 do_install 的方法,该方法安装了提到的文件。然后找到安装这些文件的配方并在顶层创建bbappend文件。此 bbappend 文件可能包含do_install_append任务,您可以在其中放置install <file> <dir>行(注意,cp不推荐使用,一切都应使用安装工具完成)。

于 2019-02-10T22:26:40.573 回答
1

为使用 Xilinx/Petalinux 的人们添加基于 Carsten Hansen 原始答案的额外评论。

在 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,系统应该会填充您的新文件。

于 2021-05-10T15:06:08.427 回答