Pil*_*box 22 boot systemd runlevel systemd-boot
在通过大量帖子、Youtube 视频和有关 systemd 问题的“文档”中搜索了大量内容后,我仍然不知所措。
链接(https://wiki.archlinux.org/index.php/systemd#Create_custom_target)看起来很有希望,但有点含糊(对我来说)。
如何创建自定义 systemd 目标(即: foo.target ),以便可以使用选择的 .service 单元启动?
我只是想创建一个自定义目标来快速启动一个 X 程序。我很乐意排除所有我不需要的服务。
提前致谢!
小智 24
通读man 5 systemd.unit
并man 5 systemd.target
告诉我们单元文件用于定义目标以及 systemd 的所有其他内容。没有专门关于如何创建target 的文档,因此很难确定应该如何完成,但这与创建服务并没有太大区别。
创建目标时,您需要从 systemd 服务目录创建指向该target.wants
目录的符号链接。然后你可以设置/启动你的目标。根据您的示例,它的外观如下所示。
这是目标的单元文件。如果以 graphics.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
Run Code Online (Sandbox Code Playgroud)
解释从 systemd 联机帮助页中获取的选项;
Description
-- 描述目标。你应该明白Requires
-- 目标的硬依赖。在启动自己的服务之前,您应该让基本系统启动Wants
-- 软依赖。目标不需要这些来启动。Conflicts
-- 如果一个单位在另一个单位上有冲突设置,启动前者将停止后者,反之亦然。After
-- 在这些服务之后启动AllowIsolate
-- 真的取决于你和你的环境。详细信息可在联机帮助页中找到systemd.unit(5)
这是您将链接为目标创建/需要的服务的目录。它相当于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=
指令中。
小智 9
前面的答案中没有提到的是,为了让自定义 systemd 目标在启动时像 multi-user.target 一样工作,您必须以某种方式将其指定为启动过程的一部分。
基本上你想要做的是检查你当前的默认值是什么:systemctl get-default
。它很可能是graphical.target
或multi-user.target
。
然后,您需要/etc/systemd/system
在新的默认目标中创建符号链接,并确保您的目标是引导过程的扩展。
ln -s /etc/systemd/system/foo.target /etc/systemd/system/default.target
Run Code Online (Sandbox Code Playgroud)
检查:
systemctl daemon-reload
systemctl get-default
Run Code Online (Sandbox Code Playgroud)
如果multi-user.target
是您以前的默认值,您将需要在您的自定义单元中对其进行配置,如下所示,如 m32 所提到的:
[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
Run Code Online (Sandbox Code Playgroud)
请注意,此处重要的一点是 multi-user.target 被指定为 Requires。有关所有含义的详细信息,请参阅 @m32 的答案。
您在这里所做的是使用您的自定义单元扩展启动过程。将其设置为 systemd 的默认值会指示 systemd 在启动时加载该单元。然后,该目标的配置会拉动任何其他目标,直到达到最基本的目标为止。至少我现在是这么理解的。
Wants=
然后,就像其他答案中提到的那样,您可以在指令中指定您的单元foo.target
并将其添加WantedBy=foo.target
到单元的安装部分。请注意,您仍然需要激活您想要在启动时使用的任何单元systemd enable foobar.service
。
总结一下:
有关运行级别的文档有更多详细信息:https ://www.landoflinux.com/linux_runlevels_systemd.html
归档时间: |
|
查看次数: |
27577 次 |
最近记录: |