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”上添加了DEPENDS
和RDEPENDS
。
由于我的 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
的东西在 postinst
和 prerm
脚本中得到了正确处理。 @.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”)的主要内容,如果未能解决你的问题,请参考以下文章
从 Yocto SDK Build 安装时,QtCreator 认为 Qt5 QMake 安装无效