使用Linux setcap命令在Yocto构建期间设置功能

时间:2017-04-18 15:50:32

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

我正在使用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

此配方工作正常,只是它使用来自我的主机系统(Ubuntu 14.04 64位)的 setcap 命令,该命令位于“ / sbin / 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内部以及闪存后的目标上保存。

2 个答案:

答案 0 :(得分:1)

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

PACKAGECONFIG_class-native = "attr"

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

我发现它已经为目标包配置了

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

抱歉令人不安。

答案 1 :(得分:0)

我暂不发表评论,请点击此处。

命令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 /工作/ x86_64的-LINUX /的libcap天然/ 2.25-R0 / SYSROOT-DESTDIR / buildarea3 / kkang / cgp9 /建立/ 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 /建立/ qemumips64-Apr24 / TMP / sysroots / x86_64的-LINUX / usr / sbin目录/ setcap