返回

Yocto multilib 下保持符号链接的难题:如何解决最终映像中符号链接缺失问题?

Linux

Yocto 中 multilib 下保持符号链接的难题

背景

在使用 Yocto 中的 multilib 功能时,一个常见的挑战是如何在最终映像文件系统中保持符号链接。multilib 允许针对不同架构(例如 32 位和 64 位)构建同一个包。虽然包本身构建成功,但符号链接可能会在最终映像中缺失。

问题

当使用 multilib 功能构建 libpam 库时,我们期望在最终映像中包含 64 位和 32 位版本的符号链接 /lib64/libpam.so/lib/libpam.so。然而,我们发现 32 位符号链接 /lib/libpam.so 缺失。

原因

在启用 multilib 时,Yocto 具有一个机制来删除具有相同名称但位于不同文件夹中的符号链接。此机制旨在避免符号链接冲突。

解决方法

有两种方法可以解决此问题:

方法 1:使用 %files -n

在包的 .spec 文件中,使用 %files -n 宏显式指定要包含在最终映像中的文件。例如,在 lib32-libpam.spec 中添加以下行:

%files -n lib32-libpam
%defattr(-,-,-,-)
%dir "/lib"
"/lib/libpam.so"

这将强制 Yocto 在最终映像中包含 32 位符号链接 /lib/libpam.so

方法 2:禁用符号链接删除

也可以通过禁用 Yocto 删除符号链接的机制来解决此问题。为此,修改 Yocto 配置文件 /etc/yocto-conf.d/local.conf,并添加以下行:

MULTILIB_REMOVE_SYMLINKS_FROM_IMAGE = "false"

这将阻止 Yocto 删除具有相同名称的符号链接,从而确保在最终映像中保留 32 位符号链接。

总结

通过使用 %files -n 宏或禁用符号链接删除机制,我们解决了在使用 multilib 功能时最终映像文件系统中缺少符号链接的问题。这确保了同时包含 64 位和 32 位版本的符号链接。

常见问题解答

问:为什么符号链接在 multilib 中会缺失?
答:Yocto 具有一个机制来删除具有相同名称但位于不同文件夹中的符号链接,以避免冲突。

问:使用 %files -n 宏时,如何指定符号链接的正确位置?
答:使用 %dir 宏指定符号链接所在文件夹,然后使用绝对路径指定符号链接本身。

问:禁用符号链接删除是否会影响其他功能?
答:否,禁用此机制不会影响其他 Yocto 功能。

问:除了解决符号链接问题之外,multilib 功能还有哪些优点?
答:multilib 允许构建针对不同架构的包,从而减少最终映像的大小和复杂性。

问:是否还有其他方法可以解决符号链接问题?
答:本文中介绍的方法是首选方法,但也可以探索创建自定义镜像脚本或修改文件系统布局等其他选项。