You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto构建时安装预编译.ipk包遇do_unpack错误求助

问题:Yocto构建阶段安装预编译.ipk包时do_unpack报错

背景与操作步骤

因代码隔离政策要求,需在Yocto镜像构建阶段(非运行时)安装由Yocto编译生成的预编译.ipk包。参考Yocto文档采用bin_package类实现,以nano包为例操作如下:

  1. 通过meta-openembedded中的recipe编译nano源码,生成nano_6.2-r0_core2-64.ipk
  2. 将该.ipk文件移至/workdir/example2/poky/build/prebuild目录
  3. 创建测试recipe nano2.bb,内容如下:
SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=${BP}"

inherit bin_package

执行报错信息

执行bitbake nano2时触发do_unpack错误,日志如下:

DEBUG: Executing python function do_unpack
DEBUG: Executing python function base_do_unpack
NOTE: Unpacking /workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk to /workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/
tar (child): xz: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
ERROR: Bitbake Fetcher Error: UnpackError('Unpack command PATH="/workdir/example2/poky/build/tmp/sysroots-uninative/x86_64-linux/usr/bin:/workdir/example2/poky/scripts:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot/usr/bin/crossscripts:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/sbin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/bin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/sbin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/bin:/workdir/example2/poky/bitbake/bin:/workdir/example2/poky/build/tmp/hosttools" ar x /workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk data.tar.xz && tar --extract --no-same-owner -p -f data.tar.xz && rm data.tar.xz failed with return value 2', 'file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=nano2-1.0')
DEBUG: Python function base_do_unpack finished
DEBUG: Python function do_unpack finished

已确认信息

  • .ipk文件存在且路径正确
  • 解压目录已生成data.tar.xz文件
  • 在主机环境手动执行报错日志中的unpack命令,无任何错误

排查思路与解决方案

1. 核心问题定位

报错显示tar (child): xz: Cannot exec: No such file or directory,说明Bitbake构建环境的PATH中找不到xz工具。手动执行成功是因为主机环境的PATH包含xz,但Bitbake的任务执行在隔离的native sysroot环境中,该环境默认可能未包含xz。

2. 具体修复步骤

(1)添加native依赖

在nano2.bb中添加xz-native依赖,确保构建环境包含解压工具:

DEPENDS += "xz-native"

SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=${BP}"

inherit bin_package

(2)修正SRC_URI的subpath参数

${BP}对应nano2-1.0,但预编译.ipk是nano的产物,内部路径与nano2无关,移除subpath参数尝试:

SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk"

inherit bin_package

(3)调试构建环境PATH

若仍有问题,可在recipe中添加调试代码,确认xz是否在PATH中:

do_unpack_prepend() {
    echo "Current build PATH: $PATH"
    which xz || echo "xz not found in build environment"
}

SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk"
inherit bin_package

(4)手动实现解压逻辑(备选)

如果bin_package类的默认逻辑存在兼容性问题,可跳过该类,手动实现unpack和install任务:

inherit base

SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk"

do_unpack() {
    ar x ${WORKDIR}/nano_6.2-r0_core2-64.ipk data.tar.xz
    tar xJf data.tar.xz --no-same-owner -p
    rm data.tar.xz
}

do_install() {
    cp -r ${WORKDIR}/* ${D}
}

内容的提问来源于stack exchange,提问作者balrogwhip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:01:19