Systemd 是 Linux 系统的一个系统和服务管理器,它的目的是要取代传统的 init 系统,提高系统的启动速度和管理效率。Systemd 的特点有以下几个方面:
- Systemd 可以按需启动服务,减少系统资源消耗;
- Systemd 可以并行启动服务,解决服务之间的依赖关系,缩短系统启动时间;
- Systemd 使用 CGroup 跟踪和管理进程的生命周期,实现了服务之间的隔离和资源控制;
- Systemd 统一管理服务日志,使用二进制格式保存日志信息,提高了日志的安全性和可读性;
- Systemd 支持快照和系统恢复,可以在出现问题时恢复到之前的状态。
1.服务(service)和目标(target)
Systemd 的核心概念是 Unit(单元),它是系统资源的基本单位,可以是一个服务、一个设备、一个挂载点、一个定时器等。每个 Unit 都有一个对应的 Unit 文件(单元文件),用来定义 Unit 的属性、依赖关系、启动命令等。Systemd 支持 12 种类型的 Unit 文件,分别用不同的扩展名来区分。Systemd 还有一个特殊的 Unit 类型叫做 Target(目标),它用来对 Unit 文件进行逻辑分组,相当于 SysV-init 中的运行级别。
举例而言,在 A.service 的[Unit] 配置块中定义After=B.service或After = network.target,那么A.service 会在 B.service 启动之后启动或者network.target 之后启动。对于后者,A.service要等待网络管理服务启动后才能启动。这样可以保证服务在启动时有网络可用,或者在关闭时在网络断开之前停止。但是,这并不意味着网络已经配置好了,只是意味着网络管理服务已经启动了。如果需要让一个服务在网络配置好后才启动,应该使用 After = network-online.target。
这里就引出了服务(service)和目标(target),两者并不是相同的,尽管看似用法一样。target 不是服务,是 systemd 的一种特殊的单元(unit)类型,用来对其他单元进行逻辑分组,相当于 SysV-init 中的运行级别(runlevel)。目标的扩展名是 .target,而不是 .service,因为它们不是真正的服务,而是一种同步点,用来表示系统启动或关闭的某个阶段。
服务(service)和目标(target)的区别可从以下几方面加以比较:
- 功能:服务是用来执行一个具体的任务或功能的单元,如启动一个程序或运行一个脚本。目标是用来表示系统启动或关闭的某个阶段的单元,如达到多用户模式或图形界面模式;
- 类型:服务是一种特定的单元类型,它有 .service 为扩展名,有自己的配置文件和启动命令。目标也是一种特殊的单元类型,它有 .target 为扩展名,没有配置文件和启动命令,只是一个同步点;
- 关系:服务可以依赖于其他服务或目标,也可以被其他服务或目标依赖。目标可以依赖于其他服务或目标,也可以被其他服务或目标依赖。但是,目标之间不能互相依赖,只能按照顺序启动或关闭;
- 创建:服务可以由用户自己创建,也可以由软件包安装时自动创建。目标也可以由用户自己创建,也可以由系统默认提供。
2.Systemd管理工具
可以通过 systemctl 命令来管理 Unit 和 Target,可以用来启动、停止、重启、重载、查看状态、开机启动等操作。同时,Systemd 还提供了一个 journalctl 命令来查看日志信息,可以按照不同的条件进行过滤和排序。Systemd 还有一些其他的工具和命令,用来实现更多的功能和设置。
一项服务通过 systemd 守护、管理,service 文件一般会出现在以下位置:
- /usr/lib/systemd/system/:这个目录是系统默认的 service 文件存放位置,一般由软件包安装时自动创建,不建议手动修改;
- /etc/systemd/system/:这个目录是用户自定义的 service 文件存放位置,一般由系统管理员手动创建或修改,优先级高于 /usr/lib/systemd/system/;
- /run/systemd/system/:这个目录是运行时的 service 文件存放位置,一般由 systemd 临时创建或修改,优先级高于 /etc/systemd/system/。
linux 系统的查找顺序是按照上述目录的顺序,从下到上,即先查找 /run/systemd/system/,然后查找 /etc/systemd/system/,最后查找 /usr/lib/systemd/system/。如果在多个目录中找到同名的 service 文件,那么只会使用优先级最高的那个文件。
3.服务配置文件
服务配置文件是用来定义 systemd 如何管理一个服务的文件,它通常以 .service 为后缀,放在 /etc/systemd/system 或 /usr/lib/systemd/system 目录下。服务配置文件一般包含以下几个部分:
- [Unit] 配置块:用来描述服务的基本信息,如名称、描述、依赖关系等;
- [Service] 配置块:用来定义服务的启动类型、启动命令、停止命令、重启策略等;
- [Install] 配置块:用来定义服务的安装方式,如是否开机启动、属于哪个 target 等。
3.1 [Unit] 配置快
[Unit] 配置块是用来描述服务的基本信息,如名称、描述、依赖关系等。常见的配置项有:
Documentation=:设置服务的文档位置,可以是一个 URL 或一个本地文件路径。
After=:设置服务在哪些服务或目标之后启动,可以指定多个,用空格隔开。只涉及启动顺序,不涉及依赖关系。
Before=:设置服务在哪些服务或目标之前启动,可以指定多个,用空格隔开。只涉及启动顺序,不涉及依赖关系。
Wants=:设置服务与哪些服务或目标存在"弱依赖"关系,可以指定多个,用空格隔开。这表示如果被依赖的单元启动失败或停止运行,不影响当前服务继续执行。
Requires=:设置服务与哪些服务或目标存在"强依赖"关系,可以指定多个,用空格隔开。这表示如果被依赖的单元启动失败或异常退出,那么当前服务也必须退出。
Conflicts=:设置服务与哪些服务或目标存在"冲突"关系,可以指定多个,用空格隔开。这表示如果当前服务启动,那么冲突的单元必须停止;反之亦然。
3.2 [Service] 配置块
[Service] 配置块是用来定义服务的启动类型、启动命令、停止命令、重启策略等。常见的配置项有:
Type=:设置服务的启动类型,可以是以下几种值之一:
simple(默认值):ExecStart 字段启动的进程为主进程。 forking:ExecStart 字段将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程。 oneshot:类似于 simple,但只执行一次,Systemd 会等它执行完,才启动其他服务。 dbus:类似于 simple,但会等待 D-Bus 信号后启动。 notify:类似于 simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务。 idle:类似于 simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合。
ExecStart=:设置服务的启动命令,可以是一个可执行文件或一个脚本。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStartPre=:设置在 ExecStart 命令之前执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStartPost=:设置在 ExecStart 命令之后执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecReload=:设置重启服务时执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStop=:设置停止服务时执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStopPost=:设置在 ExecStop 命令之后执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
Restart=:设置服务的重启策略,可以是以下几种值之一:
no(默认值):不重启服务。 always:无论服务以何种方式退出,都重启服务。 on-success:只有当服务正常退出时(退出码为 0),才重启服务。 on-failure:只有当服务异常退出时(退出码非 0 或被信号终止),才重启服务。 on-abnormal:只有当服务被信号终止或超时退出时,才重启服务。 on-abort:只有当服务被 SIGABRT 信号终止时,才重启服务。 on-watchdog:只有当服务触发了看门狗超时时,才重启服务。
RestartSec=:设置重启服务之间的时间间隔,默认为 100 毫秒。
TimeoutStartSec=:设置启动服务的超时时间,默认为 90 秒。
TimeoutStopSec=:设置停止服务的超时时间,默认为 90 秒。
Environment=:设置服务的环境变量,可以指定多个,每个一行。格式为 key=value 的键值对。如果需要取消之前的设置,可以设为空值。
EnvironmentFile=:设置服务的环境变量文件,可以是一个 URL 或一个本地文件路径。文件内部的 key=value 键值对,可以用 $key 的形式,在当前配置文件中获取。如果文件不存在或无法读取,会导致错误。如果需要抑制错误,可以在路径前加上一个连词号(-)。
3.3 [Install] 配置块
[Install] 配置块是用来定义服务的安装方式,如是否开机启动、属于哪个 target 等。常见的配置项有:
RequiredBy=:作用类似WantedBy。同时,如果当前服务启动失败或异常退出,那么这些 target 也必须退出。
Also=:设置与当前服务同时安装或卸载的其他单元文件(不一定是 service 类型),可以指定多个,用空格隔开。
文章评论