如何通过添加新层将 tar.gz 包安装到 Yocto?

How to install tar.gz package to Yocto by adding new layer?

我是 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是为设备安装平台的包,我对源代码了解不多,所以不知道是否需要包含许可证?或者如何知道这个包需要许可证才能安装?

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

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

先谢谢你,我已经尽力研究了很多文档,但我很困惑,有大量信息需要消化。

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

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

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

将配方命名为 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_CLASSEShere 所述,系统使用它来了解应该以何种类型打包数据。 the data 是指您使用 do_install 安装的数据。该数据根据您的 PACKAGE_CLASSES 变量打包,例如打包到 deb 文件。它与所有其他食谱包一起用于构建最终的 rootfs。

  3. 是的,如果您正在将 tar 文件安装到映像中,然后将其解压缩以安装所有 deb 文件,例如 dpkg。您可以使用 bin_package class 来做到这一点,现在必须更改配方:

  • 解压缩 tar 文件并提供本地 files 文件夹中的 deb 文件。

  • 将所有 deb 个文件添加到 SRC_URI

  • 继承bin_packageclass

  • 指定要打包的文件。

你的食谱应该是这样的:

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安装的所有东西都添加到image文件夹中

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

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

指定它们:

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

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