我正在开发基于 yocto 的嵌入式 Linux。系统以只读方式安装,我想使用 systemd 管理数据分区中由 opkg 安装的应用程序。
为了做到这一点,我创建了一个目标,将 default.target 链接更改为指向我自己的目标。这是有效的,我可以运行 /etc/systemd/system/ 文件夹中安装的服务。
下一步是运行安装在路径如 /data/etc/systemd/system/ 的文件夹中的服务。
我在 systemd 文档中发现可以设置 SYSTEMD_UNIT_PATH 变量来扩展 systemd 正在查找服务的文件夹。但经过多次测试,我还没有找到正确设置此变量的方法,并且 systemd 从未找到我的服务。
你能帮我解决这个问题吗?
编辑:如果您有办法在不将其添加到内核命令行的情况下执行此操作,那将是完美的。
谢谢。
答案1
AFAIK仅当变量第一次出现时才SYSTEMD_UNIT_PATH
遵循该变量systemd
开始然后就不再这样了,即使您稍后通过systemctl set-environment
命令更改它。
此外,该变量实际上并不提供额外的路径来查找服务文件,而是完全覆盖标准路径。也就是说,当您启动一个systemd
在其环境中设置了该变量的实例时,该systemd
实例将仅在该路径中查找服务文件,而忽略通常的/etc/systemd
路径和所有其他较低优先级的路径。
从技术上讲,可能有几个或三个适合您的情况的复杂(和复杂)解决方案,但我认为迄今为止最好和最简单的解决方案就是像发行版供应商那样:将附加服务文件放入路径中/lib/systemd/
或路径下方。从本质上讲,该路径反映了该/etc/systemd
路径,并且正是为供应商放置自己的路径而设计的。systemd
单元文件的。毕竟,对于您的 Yocto 项目,您是发行版供应商。
答案2
来自 man systemd
$SYSTEMD_UNIT_PATH、$SYSTEMD_GENERATOR_PATH、$SYSTEMD_ENVIRONMENT_GENERATOR_PATH 控制 systemd 查找单元文件和生成器的位置。这些变量可能包含路径列表,以冒号(“:”)分隔。设置后,如果列表以空组件(“...:”)结尾,则该列表将添加到通常的路径集之前。否则,指定的列表将替换通常的路径集。
因此,如果您在 systemd 启动之前导出它,例如:
export SYSTEMD_UNIT_PATH="/mypath:"
/mypath 被添加到前面,然后你就可以在那里保存你的 systemd 文件