【问题标题】:How to install tar.gz package to Yocto by adding new layer?如何通过添加新层将 tar.gz 包安装到 Yocto?
【发布时间】:2021-10-19 02:29:40
【问题描述】:

我是 Yocto 的新手,所以我可能有一些错误和误解,如果你能提供帮助,我不胜感激。

所以,我想在我的自定义映像中添加一个新包(tar 文件)。

我已按照手册中的步骤和步骤以及一些在线说明进行操作。运行时:“bitbake mylayer”,图层构建良好,但构建图像时出现此错误,这是日志文件:

DEBUG: Executing python function rootfs_deb_bad_recommendations
DEBUG: Python function rootfs_deb_bad_recommendations finished
DEBUG: Executing python function extend_recipe_sysroot
NOTE: Installed into sysroot: []
NOTE: Skipping as already exists in sysroot: ['depmodwrapper-cross', 'apt-native', 'dpkg-native', 'pseudo-native', 'update-rc.d-native', 'prelink-native', 'makedevs-native', 'ldconfig-native', 'opkg-util$
DEBUG: Python function extend_recipe_sysroot finished
DEBUG: Executing python function do_rootfs
NOTE: ###### Generate rootfs #######
NOTE: Installing the following packages: apt busybox copy-uefiimg-to-sda coreutils dpkg e2fsprogs-resize2fs libfontconfig1 libfreetype6 libglib-2.0-0 gptfdisk libjemalloc2 kernel-module-axi-dma-sensor ku$
ERROR: Unable to install packages. 
Reading package lists...
Building dependency tree...
Reading state information...
Package mypackage is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'mylayer' has no installation candidate

DEBUG: Python function do_rootfs finished
ERROR: Function failed: do_rootfs

这里是 mylayer.bb:

SUMMARY = ""
LICENSE = "CLOSE"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += "file://mypackage.tar"

另外,我已经在 conf/local.conf 中包含了这个包:

IMAGE_INSTALL_append += " mylayer"

所以除了想办法解决这个问题之外,我还有一些问题:

  1. 我读过一些 .bb 的例子,他们提到了 LIC_FILES_CHKSUM。 mypackage.tar.gz是为设备安装平台的包,对源码了解不多,不知道是否需要包含license?或者如何知道这个包需要许可证才能安装?

  2. 在我在网上找到的一些答案中,有人说我需要包含PACKAGE_CLASSES ?= "package_deb"(他们想安装 .deb 文件),所以在我的情况下我可能需要PACKAGE_CLASSES ?= "package.tar" 对吗?我试过改变变量,但还是不成功。

  3. mypackage.tar 包含一些 deb 文件。如果我无法安装 mypackage.tar,我可以安装这些 .deb 文件吗?我可以把它都放在 mylayer.bb 中吗?

在此先感谢您,我已经尽力研究了很多文件,但我很困惑,还有大量信息需要消化。

【问题讨论】:

    标签: yocto yocto-recipe


    【解决方案1】:

    首先,在回答您的问题之前

    让我为您提一些最佳实践建议:

    将配方重命名为与您的压缩包相关的重要名称。

    将配方命名为 mylayer 会使 Yocto 用户感到困惑,因为还有术语 layer

    关于你的食谱:

    不需要FILESEXTRAPATHS,因为配方路径会自动添加到 Yocto 路径中。

    FILESEXTRAPATHS.bbappend 文件所必需的。

    你需要重写do_install任务函数,它默认什么都不做。

    do_install 是确保您的来源包含在最终图像中的首要任务。

    此外,当将压缩源文件指定为SRC_URI 时,yocto 会自动对其进行解压缩。

    这是提到here

    那么,你的食谱应该是这样的:

    SUMMARY = ""
    LICENSE = "CLOSED"
    
    # Prevent Yocto from decompressing the file
    SRC_URI = "file://mypackage.tar;unpack=0"
    
    do_install(){
        # Create the opt folder into the final image, ${D} is ${WORKDIR}/image
        install -d ${D}/opt
        # Copy the compressed file there; You can change permissions as you want
        install -m 0755 ${WORKDIR}/mypackage.tar ${D}/opt
    }
    
    # Very important to specify what you installed in (do_install)
    FILES_${PN} = "/opt/*"
    

    现在,当您运行 IMAGE_INSTALL_append += " mylayer" 时,您的文件将被安装。

    关于您的问题:

    1. 您提到您的压缩文件包含.deb 文件,我假设不需要许可证校验和。另外,我知道您可能想指向SRC_URI[md5sum] 或其他校验和以获取完整包。本地文件也不需要它,它用于检查在线资源的完整性。

    2. PACKAGE_CLASSES 如提到的here,被系统用来知道数据应该以什么类型打包。 the data 是指您使用do_install 安装的数据。该数据根据您的 PACKAGE_CLASSES 变量打包,例如,deb 文件。这与所有其他配方包一起用于构建最终的 rootfs。

    3. 是的,如果您要将tar 文件安装到映像中,然后将其解压缩以安装所有deb 文件,例如dpkg。您可以使用 bin_package 类来执行此操作,现在必须更改配方:

    • 解压tar文件,在本地files文件夹中提供deb文件。

    • 将所有deb文件添加到SRC_URI

    • 继承bin_package

    • 指定要打包的文件。

    你的食谱应该是这样的:

    SUMMARY = ""
    LICENSE = "CLOSED"
    
    SRC_URI = "file://deb_file1.deb \
           file://deb_file2.deb"
    
    # No need to `do_install` , it is invoked by the (bin_package) class
    
    FILES_${PN} = ""
    

    重要:

    关于FILES_${PN},需要将deb安装的所有内容添加到镜像文件夹中

    例如,如果你的 deb 文件安装了这个:

    /usr/bin/hello
    /etc/hello.cfg
    

    指定它们:

    FILES_${PN} = "/usr/bin/*"
    FILES_${PN} += "/etc/*"
    

    使用*,因此如果其他deb 文件将文件安装到与其他文件相同的文件夹中,它将包含所有文件。

    【讨论】:

    • 非常感谢您的回答。我做了你写的,包已经安装到图像中了!仍然出现一个警告,我不太明白:do_rootfs: The license listed BSD-3c was not in the licenses collected for the recipe libubox. 有没有办法摆脱这个警告?还是不重要?
    • if you are installing the tar file into the image and then unpack it to install all deb files, for example, with dpkg 我认为这将是我的下一步,我想问一下我的想法是否正确:如果我会按照您对问题 3 的指示进行操作,那么我会能够将deb 文件直接安装到映像,而不必为每个deb 文件运行dpkg
    • 所以我还有一个问题:这些 deb 文件实际上是相互依赖才能安装的,例如 file_deb1.deb 需要在 file_deb2.deb 之前安装。如果我为SRC_URI 编写正确的顺序,这些文件会按顺序安装吗?非常感谢。
    • 我不认为它们是按顺序安装的。您可以检查类的来源:git.yoctoproject.org/cgit.cgi/poky/plain/meta/classes/…,我认为它会检查文件所在的${S} 的所有内容并安装它们。它可以按字母顺序排列。你可以测试一下
    • 我已经重建了包但是得到了错误:Error do_unpack: Unpack failure for URL: ´file://file_deb1.deb´. Error: do_unpack. Function failed: base_do_unpack你知道我做错了什么可能性吗?我已将inherit bin_package 和更多文件夹添加到FILES_${PN}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2018-11-29
    • 2018-07-24
    • 1970-01-01
    • 2013-04-20
    • 2018-02-07
    相关资源
    最近更新 更多