systemd配置指南

systemd 是一个 2010 年诞生的系统和服务管理器,广泛用于现代Linux发行版中,负责启动和管理系统的用户空间服务、挂载文件系统、启动并管理设备、以及其他系统初始化任务

作为取代 init 系统的系统项目,systemd 通过单一的控制进程(systemd进程)来管理系统的生命周期,其采用 ini 配置文件来描述和管理服务

现代大部分 Linux 系统都由 systemd 启动和管理

1. 入门

1.1. 一个例子

以 sshd 服务为例,控制其启动、关闭、和重启:

Bashcontent_copy
sudo systemctl stop sshd
sudo systemctl start sshd
sudo systemctl restart sshd

# 检查 sshd 的服务状态
sudo systemctl status sshd

接下来,以配置一个 easydns 程序服务为例

编辑: /etc/systemd/system/easydns.service

TEXTcontent_copy
[Unit]
# 服务描述
Description=easydns service
# 启动顺序
After=network.target

[Service]
# 执行命令
ExecStart=/root/easydns/easydns -m=127.0.0.1:1080 -p=116.116.116.116:53 -d=/root/easydns/gfw-list.txt -l=10240 -hosts=/root/easydns/hosts -ipv6=true
# 退出机制
Restart=unless-stopped
# 内存限制
MemoryMax=64M
# 日志输出 %N表示服务名称,所以日志输出位置是 /var/log/easydns.log
StandardOutput=append:/var/log/%N.log
# 重定向错误日志到标准流
StandardError=inherit
# 运行用户
User=root

[Install]
# 启动类型
WantedBy=multi-user.targe

1.2. 例子解析

Unit 用于定义程序的基本属性和元数据,常见选项:

Description:单元的简短描述 Documentation:相关文档的链接 After:定义单元启动的顺序,表示当前单元在指定单元之后启动 Before:定义单元启动的顺序,表示当前单元在指定单元之前启动 Requires:表示当前单元依赖于其它单元,如果依赖的单元未能启动,当前单元也不会启动 Wants:类似于 Requires,但不那么严格,依赖的单元如果未能启动,当前单元仍然会尝试启动

Service 用于定义服务的行为(如执行命令、环境变量、运行用户),常见选项:

ExecStart:指定启动该服务时执行的命令 ExecStop:指定停止该服务时执行的命令 Restart:服务崩溃后的重启策略(如 always、on-failure 等) RestartSec:服务重启的延迟时间(单位秒) User:以哪个用户身份运行该服务 StandardOutput:输出日志方式 Environment:设置环境变量 WorkingDirectory:指定工作目录 Type:服务的类型(如 simple、forking、oneshot、notify、dbus)

Install 用于控制服务的启用和禁用策略,常见选项:

WantedBy:指定该服务单位希望在启动时被哪些目标所激活 RequiredBy:指定该服务单位是哪些单位所依赖的

2. Unit、Service、Install 指南

2.1. Unit

After 和 Before 都是用于描述启动顺序,即程序在什么情况下启动,常见的值有:

basic.target:基础的系统服务启动 multi-user.target:多用户模式,适用于无图形界面的系统 graphical.target:图形用户界面模式,依赖于 multi-user.target network-online.target:网络连接完全建立 remote-fs.target:远程文件系统挂载 local-fs.target:本地文件系统挂载 shutdown.target:系统正在关闭 reboot.target:系统正在重启 network.service:网络服务启动完成 dbus.service:D-Bus 服务启动 systemd-journald.service:日志记录服务启动 systemd-logind.service:用户登录管理服务

After 即程序在指定情况后启动,Before 则是在指定情况前启动

2.2. Service

Restart 用于描述程序在退出之后的操作,常见值:

no:默认值,不采取任何操作 always:重启服务 on-success:正常退出(状态码为0)则重启 on-failure:非正常退出(状态码不为0)则重启 on-abort:服务未捕捉到任何信号(如SIGKILL 或 SIGQUIT)而退出时重启 on-watchdog:仅在服务因未响应 watchdog 超时而退出时重启

Environment 用于设置程序的环境变量,如果环境变量过多,可以使用 EnvironmentFile 选项用于指定一个环境变量的文件路径

Type 用于帮助 systemd 判定服务是否启动成功,常见值:

simple:启动后不需要任何信号即认为启动成功 forking:当服务进程fork出一个主进程并退出,适用于传统的UNIX守护进程,它们会fork并在后台运行 oneshot:服务执行一次后即退出,适合一次性脚本 notidy:服务启动后会通过 sd_notidy 通知 systemd,适合与 systemd 进行复杂交互的程序 idle:服务在其他任务执行完毕后再执行,低优先级的任务

2.3. Install

常见的 WantedBy 和 RequiredBy 值包括:

multi-user.target:这是最常用的目标,表示系统已进入多用户模式,但没有图形界面,通常用于服务器或没有图形界面的系统 graphical.target:表示用户进入了图形界面 basic.target:表示系统的基本初始化已完成,但没有进入多用户模式 default.target:这是系统启动时的默认目标,通常是 graphical.target 或 multi-user.target 的别名 sysinit.target:表示系统初始化阶段的目标,通常在系统启动的早期阶段使用 network.target:在网络已初始化后使用,适用于需要网络连接的服务 remote-fs.target:用于启动远程文件系统的挂载

RequiredBy 的用法与 WantedBy 类似,但它表示服务是目标的必须依赖项,如果目标被激活,则这个服务也必须被激活RequiredBy 一般用于更严格的依赖关系

这两者与 Unit 中的 Before 和 After 非常相似,但区别很大:

After 和 Before:用于控制启动顺序,确保单元在特定的时间点启动 RequiredBy 和 WantedBy:用于定义单元的依赖关系,主要影响单元的启用和禁用行为

3. 日志配置

systemd 使用 journald 进行日志管理,你可以通过以下命令查看日志:

Bashcontent_copy
# 查看所有日志
journalctl

# 查看特定服务日志
journalctl -u <service_name>

文章来源:

Author:chancel
link:http://www.chancel.me/markdown/systemd-guide