Linux系统systemd

时间:2020-01-09 10:37:28  来源:igfitidea点击:

systemd,它是系统和服务管理器,负责控制如何在Linux上启动,停止和管理服务。通过提供按需服务启动和更好的事务依赖控制,systemd大大减少了启动时间。作为系统用户,我们可以将关键服务优先于次要服务。

Linux的systemd比System V init更好吗?

  • 配置比System Vinit有时复杂的shell脚本更简单,更合理,systemd具有用于配置参数的单元配置文件

  • 服务之间存在显式依赖关系,而不是两位数字代码,后者仅设置脚本运行的顺序。

  • 轻松设置每个服务的权限和资源限制,这对安全性很重要

  • systemd可以监视服务并在需要时重新启动它们

  • 对于每种服务和系统本身都有看门狗

  • 服务以并行方式启动,从而减少了启动时间

了解目标,服务和单位

在我们了解systemd的工作原理之前,我们需要了解一些基本术语

  • 首先,目标是一组服务,类似于但比System V运行级别更通用。有一个默认目标是在引导时启动的服务组。

  • 其次,服务是可以启动和停止的守护程序,非常类似于SystemV服务。

  • 最后,一个单元是一个配置文件,描述了目标,服务以及其他一些内容。单位是包含属性和值的文本文件。

Units

配置的基本项目是Unit文件。Unit文件位于三个不同的位置:

  • /etc/systemd/system:本地配置

  • /run/systemd/system:运行时配置

  • /lib/systemd/system:分布范围的配置

-/usr/lib/systemd/system /:包含rpm中包含的默认systemd单元配置

当寻找一个单位时,systemd会按顺序搜索目录,一旦找到匹配项就停止,允许我们通过将同名单位放置在/etc/systemd /系统。我们可以通过创建一个空文件或者链接到/dev/null的本地文件来完全禁用一个单元。

说明:

/etc/systemd/system包含用户需要在systemd单元上设置的任何自定义和/或者更永久的配置。建议在此处放置自定义配置,因为它不会在软件包更新时丢失。

所有单位文件都以标记为[Unit]的部分开头,其中包含基本信息和相关性,例如:

[Unit]
Description=D-Bus System Message Bus
Documentation=man:dbus-daemon(1)
Requires=dbus.socket

systemd单位文件中的"需求","需求"和"冲突"之间有什么区别?

单位依赖性通过RequiresWantsConflicts表示:

  • Requires:该单元所依赖的单元列表,该列表在启动该单元时启动

  • 想要:一种较弱的形式:要求:列出的单元已启动,但如果其中任何一个失败,则当前单元不会停止

  • Conflicts:负相关性:启动该单元时,列出的单元将停止,相反,如果启动其中一个单元,则该单元将停止

处理依赖关系会生成应启动(或者停止)的单元的列表。关键字之前之后确定启动它们的顺序。停止顺序与开始顺序相反:

  • 之前:此单元应在列出的单元之前启动

  • After:此单元应在列出的单元之后启动

在以下示例中,After指令确保在网络之后启动Web服务器:

[Unit]
Description=Lighttpd Web Server
After=network.target

在没有之前或者之后指令的情况下,这些单元将并行启动或者停止,而无需特别订购。

服务

服务是可以启动和停止的守护程序,等同于System V服务。例如,lighttpd.service。

服务单元的" [服务]"部分描述了其运行方式。这是来自lighttpd.service的相关部分:

[Service]
ExecStart=/usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf -D
ExecReload=/bin/kill -HUP $MAINPID

这些是启动和重新启动服务时要运行的命令。我们可以在此处添加更多配置点,因此请参考systemd.service的手册页。

目标

目标是对服务进行分组的另一种类型的单位(或者其他类型的单位)。这是一种仅具有依赖关系的单元。目标的名称以.target结尾,例如,multi-user.target。目标是所需的状态,其作用与System V运行级别相同。

systemd如何引导系统?

现在我们可以看到systemd如何实现引导程序。由于/sbin/init被符号链接到/lib/systemd/systemd,因此内核运行systemd。它运行默认目标default.target,该目标始终是指向所需目标的链接,例如用于文本登录的multi-user.target或者用于图形环境的graphical.target。例如,如果默认目标为multi-user.target,则将找到以下符号链接:

/etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target

可以通过在内核命令行上传递system.unit = <new target>来覆盖默认目标。我们可以使用systemctl找出默认目标,如下所示:

# systemctl get-default
multi-user.target

启动诸如multi-user.target之类的目标会创建一棵依赖树,该依赖树使系统进入工作状态。在典型的系统中,multi-user.target取决于basic.target,而basic.target取决于sysinit.target,后者取决于需要尽早启动的服务。我们可以使用systemctl list-dependencies打印图形。

如何创建自己的systemd服务单元文件?

下面是一个基于systemd的示例服务单元文件。其中:我们称为自定义脚本

# vim /etc/systemd/system/set_clock.service
[Unit]
Description=Syncing system and hardware clock
[Service]
Type=forking
ExecStart=/usr/bin/boot.clock_fix start
ExecStop=/usr/bin/boot.clock_fix stop
RemainAfterExit=true
[Install]
WantedBy=multi-user.target

[Unit]部分仅包含描述,因此在使用systemctl和其他命令列出时可以正确显示。没有依赖关系;正如我所说,这非常简单。

[Service]部分指向可执行文件,并有一个标志表明它可以分叉。如果它更简单并且在前台运行,则systemd将为我们进行守护进程,并且不需要'Type = forking'。

[Install]部分使它依赖于multi-user.target,以便在系统进入多用户模式时启动我们的服务器。

接下来,我们需要刷新systemd内容

# systemctl daemon-reload

启动并检查服务状态

# systemctl start set_clock
# systemctl status set_clock.service
â set_clock.service - Syncing system and hardware clock
Loaded: loaded (/etc/systemd/system/set_clock.service; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2016-11-16 12:37:20 IST; 9s ago
Process: 7964 ExecStop=/etc/init.d/boot.clock_fix stop (code=exited, status=0/SUCCESS)
Process: 7979 ExecStart=/etc/init.d/boot.clock_fix start (code=exited, status=0/SUCCESS)
Main PID: 1338 (code=exited, status=0/SUCCESS)
Nov 16 12:37:13 Ban17-inst01-a boot.clock_fix[7979]: Set Sys time according to Hardware Clock
Nov 16 12:37:20 Ban17-inst01-a systemd[1]: Started Syncing system and hardware clock.

此时,它将仅按命令启动和停止,如图所示。要使其具有持久性,我们需要向目标添加永久性依赖关系。这是本单元[安装]部分的目的,它表示启用此服务后,它将依赖于multi-user.target,因此将在引导时启动。

我们可以使用systemctl enable启用它,如下所示:

# systemctl enable set_clock.service