Yocto SYSTEMD_SERVICE 安装参数化服务(“@.service”)

Posted

技术标签:

【中文标题】Yocto SYSTEMD_SERVICE 安装参数化服务(“@.service”)【英文标题】:Yocto SYSTEMD_SERVICE to install a parameterized service ("@.service") 【发布时间】:2019-06-09 09:52:38 【问题描述】:

我需要配置 WireGuard 以在嵌入式 Linux 设备上启动 ***。

我的食谱安装了一个/etc/wireguard/wg0.conf,非常类似于通过 Internet 找到的示例。

然后我尝试在我的wireguard.bb 上启用 SystemD 上的服务:

SYSTEMD_SERVICE = "wg-quick@wg0.service"
SYSTEMD_AUTO_ENABLE = "enable"

但是bitbake 给我一个错误:

ERROR: Function failed: SYSTEMD_SERVICE_my-conf value wg-quick@wg0.service does not exist

我检查了临时目录和文件wg0.conf 出现在正确的位置,但似乎bitbake 的SYSTEMD_SERVICE 不知道如何扩展@ 符号后的“wg0”。

如果我尝试没有接口名称 (wg0):

SYSTEMD_SERVICE = "wg-quick@.service"

Bitbake 很高兴并最终确定了我的食谱,但这不是systemd 所期望的。启动没有接口的服务是没有意义的......


然后我尝试了另一种方法,将“wireguard”包本身从配置(“wireguard-conf”包)中分离出来,并在“wireguard”上添加了DEPENDSRDEPENDS

由于我的 wireguard-conf.bb 配方不包含“wg-quick@.service”文件(它来自依赖项“wireguard”),因此情况变得更糟。


嗯,

我不知道如何正确修复它,任何建议将不胜感激。


其他信息

我在这个项目中使用的是 Yocto 2.0.3(不希望更新它)。

感谢@TomasNovotny cmets,我设法将我的“systemd.bbclas”与 Github 进行了比较,发现systemd_populate_packages() 的变化似乎解决了问题。

【问题讨论】:

您能否与SYSTEMD_SERVICE_$PN = "wg-quick@wg0.service" 核对一下(即 SYSTEMD_SERVICE 应该是特定于包的)。 是的@TomasNovotny,我查过了。它不能解决(甚至改变)问题。看来我的 Yocto 没有正确解析“@*”参数。感谢您的提问。 我简要检查了 rocko 版本,@xx.service 的东西在 postinstprerm 脚本中得到了正确处理。 @.service 也已安装。我记得在 jethro (?) 上缺少支持,所以我处理了在 do_install() 中启用模板服务的符号链接。你用的是哪个版本的oe?顺便说一句,我在systemd.bbclass 中看到了模板服务的处理。 你是对的@TomasNovotny。我的 Yocto 是一个相当旧的 2.0.3。我将我的 Yocto 的 systemd.bbclass 与 Github 的进行了比较,问题就在这里。既然你闻到了问题,请发布答案,以便我标记它。非常感谢! 【参考方案1】:

我还尝试使用我的个人资料(在 Yocto rocko 中)启用 Open***,但没有成功。 最后,我通过提供 Open*** 配方扩展而不是自定义扩展使其工作。所以,open***_%.bbappend 文件看起来像:

inherit systemd
SYSTEMD_SERVICE_$PN = "open***@clientprofile.service"
SYSTEMD_AUTO_ENABLE = "enable"

do_install_append() 
    install -d $D$sysconfdir/open***/
    ln -sf /data/etc/open***/clientprofile.conf $D$sysconfdir/open***/clientprofile.conf

如您所见,我使用的是指向我的个人资料的符号链接,而不是普通文件。您可以安装普通的 Open*** 配置文件而不是制作符号链接,它也可以正常工作。

【讨论】:

【参考方案2】:

它在较新的 OpenEmbedded 中工作(看起来像在 krogoth,2016 年 4 月发布的 2.1 版),它是由 this commit 引入的。它适用于我的 rocko(2017 年 10 月发布的 2.4 版)。根据 j4x 的评论,它在 jethro(2.0 版,2015 年 11 月)中不起作用。

对于较旧的(并且当前不受支持的 OpenEmbeddeds),您可以尝试向后移植补丁或处理符号链接以启用 do_install() 中的服务。

另外请注意,SYSTEMD_SERVICE_$PN 变量是特定于包的,因此必须添加 _$PN 后缀 (see manual)。

【讨论】:

我只能说你也可以使用SYSTEMD_PACKAGES 来引用应该查找给定模板文件的包,如果它在其他地方发货。第二点与wireguard 配方有关,它将wg-quick@.service 留在错误的位置,使其对最终用户无用。在编写单元文件时应该在etc,lib/systemd/system,但我发现它只是在/lib/systemd(用于勇士版本)。这就是为什么它仍然不适用于较新版本的主要原因。 补丁修复了问题的实际根本原因:lists.openembedded.org/g/openembedded-core/message/140535

以上是关于Yocto SYSTEMD_SERVICE 安装参数化服务(“@.service”)的主要内容,如果未能解决你的问题,请参考以下文章

ManjaroKDE安装Yocto eSDK

如何在 Yocto 上安装 dlib 和更新 gcc

Yocto CAT874 安装ranger

从 Yocto SDK Build 安装时,QtCreator 认为 Qt5 QMake 安装无效

获取安装在Yocto bin_package中的库的依赖列表。

YOCTO-问题:nativesdk-qtbase:已安装文件/目录,但未以任何软件包提供]] << [