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" 上添加了 DEPENDS
和 RDEPENDS
.
这变得更糟,因为我的 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)。
我也曾尝试使用我的配置文件(在 Yocto 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 配置文件而不是创建符号链接,它也可以正常工作。
我需要将 WireGuard 配置为在嵌入式 Linux 设备上启动时启动 VPN。
我的食谱安装了一个 /etc/wireguard/wg0.conf
与通过 Internet 找到的示例非常相似。
然后我尝试在我的 wireguard.bb
:
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" 上添加了 DEPENDS
和 RDEPENDS
.
这变得更糟,因为我的 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)。
我也曾尝试使用我的配置文件(在 Yocto 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 配置文件而不是创建符号链接,它也可以正常工作。