在 Yocto 构建期间使用 Linux setcap 命令设置功能
Use Linux setcap command to set capabilities during Yocto build
我正在使用 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 内部和闪烁后的目标。
我还不能发表评论所以在这里发表评论。
命令setcap应该由libcap-native提供。并请仔细检查它是否存在于 tmp/work/x86_64-linux/libcap-native/2.25-r0/image/:
$ 查找 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 配方中
PACKAGECONFIG_class-native = "attr"
由于生成的二进制文件(setcap 和 getcap)依赖于 libattr,因此必须手动配置。
我发现它已经为目标包配置好了
PACKAGECONFIG ??= "attr ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}"
抱歉打扰了。
我正在使用 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 内部和闪烁后的目标。
我还不能发表评论所以在这里发表评论。
命令setcap应该由libcap-native提供。并请仔细检查它是否存在于 tmp/work/x86_64-linux/libcap-native/2.25-r0/image/:
$ 查找 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 配方中
PACKAGECONFIG_class-native = "attr"
由于生成的二进制文件(setcap 和 getcap)依赖于 libattr,因此必须手动配置。
我发现它已经为目标包配置好了
PACKAGECONFIG ??= "attr ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}"
抱歉打扰了。