【问题标题】:Use Linux setcap command to set capabilities during Yocto build在 Yocto 构建期间使用 Linux setcap 命令设置功能
【发布时间】:2017-09-14 13:34:53
【问题描述】:

我正在使用 Yocto 1.8 构建一个 linux 系统。

我需要在构建过程中使用命令“setcap”来设置文件功能,这是通过 libcap 包配方引入的:http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-support/libcap/libcap_2.25.bb?h=master

问题是配方提供了 libcap 包,它只是库,以及另一个名为 libcap-bin 的子包,其中包含我需要使用的二进制文件。但是我无法在我的配方中构建或使用 libcap-bin-native 包作为依赖项(使用 DEPENDS 变量)。所以每次我调用“setcap”二进制文件时,Yocto 都会使用主机二进制文件(Ubuntu 14.04 64 位)而不是构建系统文件(因为它不存在)。

我需要知道如何在我的本地 sysroot 构建系统中包含从 libcap-bin 包构建的本地二进制文件,以便在配方执行期间使用。

使用 setcap 命令的示例配方:

DESCRIPTION = "Apply  CAPs on files"
SECTION = "bin"
LICENSE = "CLOSED"

do_install() {
    install -d ${D}${bindir}
    touch ${D}${bindir}/testacl
}

DEPENDS = "libcap libcap-native"

#New task will be added to each recipe to apply attributes inside ipks
fakeroot do_setcaps() {
    setcap 'cap_sys_admin,cap_sys_rawio+ep' ${WORKDIR}/packages-split/${PN}${bindir}/testacl
}

#Adding the new task  just before do_package_write_ipk task
addtask setcaps before do_package_write_ipk after do_packagedata

这个配方运行良好,除了它使用位于“/sbin/setcap”的主机系统(Ubuntu 14.04 64 位)中的 setcap 命令

依赖包 libcap-native 仅包含我本机 sysroot 中的库文件,但不包含二进制文件。

如果我在我的食谱中使用了这个:

DEPENDS = "libcap-bin"

我收到了这个错误:

ERROR: Nothing PROVIDES 'libcap-bin'

我也看到这个帖子在谈论同样的话题: Linux capabilities with yocto

但他使用的是 Yocto > 2.3 而我使用的是 Yocto 1.8 ,我现在无法更新。

有什么帮助吗?

PS:我已经更新了我的 yocto 构建系统,以在创建 IPK 期间保留 ACL 和扩展属性,它在 IPK 内、rootfs 内以及闪烁后保存在目标上。

【问题讨论】:

    标签: linux embedded-linux yocto openembedded linux-capabilities


    【解决方案1】:

    我找到了解决方案。 我不得不将它添加到 libcap 配方中

    PACKAGECONFIG_class-native = "attr"
    

    由于生成的二进制文件(setcap 和 getcap)取决于 libattr,因此必须手动配置。

    发现已经为目标包配置好了

    PACKAGECONFIG ??= "attr ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}"
    

    抱歉打扰了。

    【讨论】:

      【解决方案2】:

      我还不能评论,所以在这里评论。

      命令 setcap 应该由 libcap-native 提供。请仔细检查它是否存在于 tmp/work/x86_64-linux/libcap-native/2.25-r0/image/:

      $ find tmp/work/x86_64-linux/libcap-native/2.25-r0/sysroot-destdir/ -name setcap tmp/work/x86_64-linux/libcap-native/2.25-r0/sysroot-destdir/buildarea3/kkang/cgp9/builds/qemumips64-Apr24/tmp/sysroots/x86_64-linux/usr/sbin/setcap

      去掉前缀后可以在这里找到setcap:

      $ ls /buildarea3/kkang/cgp9/builds/qemumips64-Apr24/tmp/sysroots/x86_64-linux/usr/sbin/setcap /buildarea3/kkang/cgp9/builds/qemumips64-Apr24/tmp/sysroots/x86_64-linux/usr/sbin/setcap

      【讨论】:

      • 这就是问题所在,它不是由 libcap-native 提供的,因为它不是 libcap 包的一部分;它仅包含在 libcap-bin 包中。
      • libcap-bin 来自哪里?我在 libcap 配方中没有看到子包?
      • libcap recipe 继承 lib_package 类,它提供了一个 ${PN}-bin 子包。
      • @shatrix 作为您的描述“我需要在 build 期间使用命令“setcap”来设置文件功能”,在构建期间使用的所有命令都来自主机或来自 -native 包。在我的项目目录中,运行 $ find tmp/work/x86_64-linux/libcap-native/2.25-r0/sysroot-destdir/ -name setcap tmp/work/x86_64-linux/libcap-native/2.25-r0/sysroot-destdir /buildarea3/kkang/cgp9/builds/qemumips64-Apr24/tmp/sysroots/x86_64-linux/usr/sbin/setcap 去掉前缀后可以在这里找到setcap:/buildarea3/kkang/cgp9/builds/qemumips64-Apr24/tmp/ sysroots/x86_64-linux/usr/sbin/setcap
      猜你喜欢
      • 2018-10-26
      • 2012-04-08
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 2015-10-06
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多