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

Yocto SYSTEMD_SERVICE to install a parameterized service ("@.service")

我需要将 WireGuard 配置为在嵌入式 Linux 设备上启动时启动 VPN。

我的食谱安装了一个 /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 不知道如何在 [=19= 之后扩展 "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 的评论,我设法将我的 "systemd.bbclas" 与 Github 进行了比较,并注意到 systemd_populate_packages() 的变化似乎解决了问题。

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

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

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

我也曾尝试使用我的配置文件(在 Y​​octo rocko 中)启用 OpenVPN,但没有成功。 最后,我通过提供 OpenVPN 配方扩展而不是自定义扩展使其工作。所以,openvpn_%.bbappend 文件看起来像:

inherit systemd
SYSTEMD_SERVICE_${PN} = "openvpn@clientprofile.service"
SYSTEMD_AUTO_ENABLE = "enable"

do_install_append() {
    install -d ${D}${sysconfdir}/openvpn/
    ln -sf /data/etc/openvpn/clientprofile.conf ${D}${sysconfdir}/openvpn/clientprofile.conf
}

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