我打算使用“setcap”对Yocto镜像中包含的二进制文件设置一些功能。由于某种原因,此处提到的解决方案对我不起作用:
Linux capabilities with yocto
。我已经通过在rootfs创建目录中的二进制文件上运行“getcap”来进行检查:
getcap ${IMAGE_ROOTFS}/usr/bin/mybinary
不返回任何东西。在最终运行的sdcard镜像中也找不到该功能。
接下来,我尝试使用IMAGE_PREPROCESS_COMMAND方法。我将setcap命令包装在小型shell函数中,例如:
my_setcap_function() {
sudo setcap cap_ipc_owner+ep ${IMAGE_ROOTFS}/usr/bin/mybinary
}
并将函数名称附加到IMAGE_PREPROCESS_COMMAND。这样做的程度是,现在在{IMAGE_ROOTFS}目录中的二进制文件上运行getcap确实显示了正确的大写设置。但是,我仍然没有在最终运行的sdcard镜像中获得此功能。
另外,如果我使用-o循环将rootfs ext4(用于创建最终的sdcard镜像)挂载在目录上,那么我的二进制文件也看不到这些功能。
在我看来,当使用mkfs.ext4创建ext4时,这些功能会以某种方式丢失。
我必须将sudo附加到setcap上,因为否则它会抱怨说“无法设置CAP_SETFCAP有效功能:不允许操作”。尽管我的理解是IMAGE_PREPROCESS_COMMAND命令是使用fakeroot运行的,所以不需要此sudo。
因此,总结一下我的问题:
我正在使用Yocto Krogoth,目前无法升级。
最佳答案
您是否真的在最终镜像上或yocto构建的rootfs文件夹中对其进行了测试?
我在rootfs文件夹中的文件上运行getcap,那里没有任何设置。
由于yocto使用伪lib拦截chown,chmod调用,因此请在sqlite db中跟踪它们(使用LD_PRELOAD进行拦截)。
因此,不会为“rootfs”文件夹中的文件设置此属性,而是在创建图像/rootfs时添加。
您可以在配方中使用setcap,您必须添加
DEPENDS = "libcap-native"
在你的食谱中。