【问题标题】:How to overwrite linux system files into the yocto filesystem?如何将linux系统文件覆盖到yocto文件系统中?
【发布时间】:2019-07-03 11:27:33
【问题描述】:

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

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

  • /etc/network/interface
  • /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
}

【问题讨论】:

    标签: linux yocto recipe rootfs


    【解决方案1】:

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

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

    然后您创建一个“文件”文件夹,其中包含您想要的“接口”文件。

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

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

    【讨论】:

    • 我完全理解。但我想把它做成我自己的层食谱。只有一个。
    • 这不是要走的路。当文件由现有配方提供时,最好扩展此配方(创建 bbappend)以对其进行自定义。所有这些个性化食谱(以及您从头开始创建的食谱)都必须在您自己的元数据中。
    • 您的解决方案有效,但它包含一个错字:冒号应放在等号旁边才能正常工作::=
    【解决方案2】:

    您的配方不是“图像配方”(它不应该用于 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,一切都应使用安装工具完成)。

    【讨论】:

    • 感谢您的回复,我是初学者,大致了解。最后,您的意思是制作图像配方吗?无论如何,我会按照你的方式去做。
    • @devj 不,“覆盖安装上述文件的某些配方的 do_install”意味着在您的情况下为 init-ifupdown 创建 bbappend。和我分享的链接一样。
    • @devj 我看不到您需要复制目录的位置。安装“正确”复制文件(cp + chown + chgrp) - 单个或多个(带 *),检查原始配方以获取示例 cgit.openembedded.org/openembedded-core/tree/meta/recipes-core/…
    【解决方案3】:

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

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

    来自 bitbake 提示:

    $ 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:"
    

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

    【讨论】:

    • 我需要在图片中添加init-ifupdown吗?还是init-ifupdown 会一直出现在图片中?
    • 如果您想使用建议的.bbappend 安装自定义interfaces 文件,那么是的,需要将init-ifupdown 添加到图像中
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-28
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多