如何创建一个systemd目标?


16

在大量搜索大量帖子,Youtube视频以及有关systemd的“文档”之后,我仍然茫然不知所措。

链接(https://wiki.archlinux.org/index.php/systemd#Create_custom_target)很有希望,但是(对我而言)有点模糊。

如何创建一个自定义的systemd目标(即foo.target),以便可以使用选择的.service单元启动?

  1. 系统引导default.target(“ foo.target”的符号链接)
  2. “ foo.target”仅启动准系统X服务器和GUI程序,例如“ gvim”。

原因

我只是想为快速启动一个X程序创建一个自定义目标。我很乐意排除所有不需要的服务。

提前致谢!

Answers:


16

通读man 5 systemd.unitman 5 systemd.target告诉我们,单位文件用于定义目标以及所有其他systemd。没有专门针对如何创建目标的文档,因此很难确定应如何完成目标,但是与创建服务并没有太大区别。

创建目标时,需要从systemd services目录建立指向target.wants目录的符号链接。然后,您可以设置/启动目标。在您的示例中,外观如下所示。

/etc/systemd/system/foo.target

这是目标的单位文件。如果以graphical.target为例,我们可以使用它作为基础来创建自己的目标。

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

解释系统手册中的选项;

  • Description-描述目标。你应该明白
  • Requires-目标的严格依赖关系。您应该先启动基本系统,然后再启动自己的服务
  • Wants-软依赖性。目标不需要这些启动。
  • Conflicts -如果一个单元在另一个单元上设置了“冲突”,则启动前者将停止后者,反之亦然。
  • After -这些服务后启动
  • AllowIsolate-取决于您和您的环境。详细信息可在手册页中找到systemd.unit(5)

/etc/systemd/system/foo.target.wants/

这是目录,您将在其中链接为目标创建/需要的服务。它等效Wants=于单位文件中的选项。创建该目录,然后创建符号链接,如下所示:ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service。这将创建从系统目录中的bar.service到foo.target.wants目录的符号链接。


我认为为服务创建单位文件超出了此答案的范围,并且该问题肯定有更多记录,因此我暂时将其省略。创建单位文件时,只需将其符号链接到target.wants目录中或将其添加到Wants=指令中即可。


我按照上述步骤创建了一个新目标,并向我的服务中添加了一些目标。但是,这些服务都没有由systemd启动。是否有一个完整的示例来演示新添加的目标中的服务正常工作?
linuxfan

1
如果您正在寻找简单的步骤来设置自定义服务以在启动时运行,请参阅necromancer的堆栈文章
—ΡΙΙΡΑΧ17年

我将@linuxfan添加foo.target到的Requires字段和Before字段中multi-user.target,就像Requires: base.target foo.target。之后,我重新启动Arch Linux vm,foobar.service它将自动作为守护程序运行。
L_K

2
不错的答案,但实际上似乎并不像您期望的那样工作。1.仅仅因为它的需求不足,并不意味着该服务将从该目标开始。2. multi-user.target似乎具有某种使其工作的隐藏事物。
Otheus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.