那里有很多说明创建基本的systemd服务文件,但它们似乎(理应如此)指示您拨打systemctl daemon-reload
和systemctl enable
。如果您需要将服务添加到已安装但未启动的驱动器(想想系统编排),您将如何纯粹通过写入文件系统(文件、目录、符号链接)来实现这一点。
我确信会有一些“这取决于你的 X 住在哪里”,这没关系。这可能具有有限的(或没有)可移植性。我只是想确保我的计划有效。
该计划是:
- 写入服务文件
/usr/lib/systemd/system/
- 到它的符号链接来自
/etc/systemd/system/multi-user.target.wants/
答案1
您所建议的本质上是如何systemctl enable
工作的:它在[Install]
服务文件的部分中查找,并将符号链接添加到.target.wants
由 指示的适当目录WantedBy=
。根据手册systemd.unit
页,您还需要查看其他一些指令来复制systemctl
它是如何实现的:
Alias=
在与单元相同的目录中创建符号链接RequiredBy=
.target.requires
在适当的目录中创建符号链接Also=
安装相关单元(查看每个链接安装的单元)DefaultInstance=
添加带有实例单元默认名称的符号链接(例如-> )multi-user.target.wants/[email protected]
[email protected]
但是,除非您安装的文件系统适用于完全不同的体系结构,否则您可能不必手动创建这些文件系统。systemctl
即使当前未运行,也可以很好地安装/卸载单元文件,因此使用andsystemd
应该没有问题(用于在正确的目录根目录中运行);显然你不需要运行,因为没有守护进程!我在 Gentoo 安装结束时使用此方法来添加启动单元(如和 朋友),它对我来说没有任何问题。systemctl enable
disable
chroot
daemon-reload
systemd-networkd
答案2
systemctl enable
与标志一起使用--root
。该标志不仅设置单元搜索文件的根目录,还指示systemctl
直接对文件系统进行操作,而不是与系统守护进程通信。