在 Yocto ext4 映像中设置 Linux 功能
Posted
技术标签:
【中文标题】在 Yocto ext4 映像中设置 Linux 功能【英文标题】:Setting Linux Capabilities in Yocto ext4 Image 【发布时间】:2018-10-26 20:26:48 【问题描述】:我打算使用“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 不应该是必需的。
所以,总结一下我的问题:
-
如何获得使用 ext4 rootfs 映像制作的 sdcard 映像的功能?
我想使用一种不需要使用“sudo”的方式。
我正在使用 Yocto Krogoth,目前无法升级。
【问题讨论】:
挂载ext4镜像的时候,可能要加上-o user_xattr
?
@Nayfe 感谢您的评论。我只是尝试过,但不幸的是并没有什么不同。
有任何理由留在 Krogoth 吗?也许在 qemu 板上的 Rocko 上尝试同样的事情来检查它之后是否修复?您也可以在freenode irc 上加入#yocto 频道以获取更多帮助。
@Nayfe 升级 Yocto 可以帮助解决 fakeroot setcap 问题,因为这里有一个修复该问题的补丁:link
主要问题仍然是在从 IMAGE_ROOTFS 目录复制到 ext4 映像时,对 poky/meta/classes/image_types.bbclass 中的 mkfs.ext4 的调用会丢失功能。即使在 Sumo AFAIK 中,这一点也没有改变。
【参考方案1】:
您是否真的在最终图像或 yocto 构建的 rootfs 文件夹中对其进行了测试?
我对 rootfs 文件夹中的文件运行 getcap,但没有设置任何内容。
因为 yocto 使用伪 lib 来拦截 chown、chmod 调用,在 sqlite db 中跟踪它们(使用 LD_PRELOAD 进行拦截)。
所以这个属性不是为“rootfs”文件夹中的文件设置的,而是在创建 image/rootfs 时添加的。
你可以在配方中使用 setcap,你必须添加
DEPENDS = "libcap-native"
在你的食谱中。
【讨论】:
以上是关于在 Yocto ext4 映像中设置 Linux 功能的主要内容,如果未能解决你的问题,请参考以下文章
在 Ubuntu 16.04 中设置 PYTHONPATH 以使 Docker 映像正常运行