在 Yocto ext4 映像中设置 Linux 功能

Rog*_*gue 5 linux embedded-linux ext4 yocto linux-capabilities

我打算使用“setcap”对 Yocto 映像中包含的二进制文件设置一些功能。由于某种原因,这里提到的解决方案对我不起作用: Linux features with yocto 。我已经通过在 rootfs 创建目录中的二进制文件上运行“getcap”来检查这一点:

getcap ${IMAGE_ROOTFS}/usr/bin/mybinary
Run Code Online (Sandbox Code Playgroud)

不返回任何内容。我也没有在最终运行的 SD 卡映像中找到这些功能。

接下来我尝试使用 IMAGE_PREPROCESS_COMMAND 的方法。我将 setcap 命令封装在小型 shell 函数中,例如:

my_setcap_function() {
    sudo setcap cap_ipc_owner+ep ${IMAGE_ROOTFS}/usr/bin/mybinary
}
Run Code Online (Sandbox Code Playgroud)

并将函数名称附加到 IMAGE_PREPROCESS_COMMAND。这有效到现在在 {IMAGE_ROOTFS} 目录中的二进制文件上运行 getcap 确实显示了正确的上限设置。但是我仍然没有获得最终运行的 SD 卡映像中的功能。

此外,如果我使用 -o 循环将 rootfs ext4(用于创建最终的 sdcard 映像)安装在目录上,我看不到二进制文件的功能。在我看来,当使用 mkfs.ext4 创建 ext4 时,这些功能会以某种方式丢失。

我必须将 sudo 附加到 setcap,否则它会抱怨“无法设置 CAP_SETFCAP 有效功能:不允许操作”。虽然我的理解是 IMAGE_PREPROCESS_COMMAND 命令是使用 fakeroot 运行的,所以不需要这个 sudo 。

所以,总结一下我的问题:

  1. 如何获取使用 ext4 rootfs 映像制作的 sdcard 映像的功能?
  2. 我想使用一种不需要使用“sudo”的方式。

我正在使用 Yocto Krogoth,目前无法升级。

小智 0

您是否真的在最终映像或 yocto 构建的 rootfs 文件夹中测试了它?

我对 rootfs 文件夹中的文件运行 getcap,但没有设置任何内容。

因为 yocto 使用伪 lib 来拦截 chown、chmod 调用,所以在 sqlite db 中跟踪它们(使用 LD_PRELOAD 进行拦截)。

因此,这个属性不是为“rootfs”文件夹中的文件设置的,而是在创建 image/rootfs 时添加的。

你可以在配方中使用setcap,你必须添加

DEPENDS = "libcap-native"
Run Code Online (Sandbox Code Playgroud)

在你的食谱中。