0

我是 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 中吗?

在此先感谢您,我已尝试尽可能多地研究文档,但我感到很困惑,并且有大量信息需要消化。

4

1 回答 1

0

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

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

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

将配方命名为mylayer混淆 Yocto 用户,因为也有这个词layer

关于你的食谱:

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

FILESEXTRAPATHS它是.bbappend文件所必需的。

您需要覆盖do_install任务功能,默认情况下它什么也不做。

do_install是确保您的源包含在最终图像中的第一项基本任务。

除此之外,当将压缩的源文件指定为 时SRC_URI,yocto 会自动解压缩它。

这里提到了这一点。

所以,你的食谱应该是这样的:

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正如这里提到的,系统使用它来知道数据应该以什么类型打包。the data我的意思是你安装的do_install数据。该数据会根据您的PACKAGE_CLASSES变量进行打包,例如deb归档。这与所有其他配方包一起用于构建最终的 rootfs。

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

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

  • 将所有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添加到image文件夹中

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

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

指定它们:

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

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

于 2021-08-17T16:19:56.800 回答