在 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 功能的主要内容,如果未能解决你的问题,请参考以下文章

如何在虚拟机中运行 YOCTO LINUX 操作系统

如何查看Ubuntu/Linux 系统的初始安装时间

在 Ubuntu 16.04 中设置 PYTHONPATH 以使 Docker 映像正常运行

如何在 yocto 中编译 linux-raspberrypi 内核?

Yocto - 增加 rootfs 的大小

无法使用 Yocto 生成适用于 Windows 的 SDK