systemd有强大的并行能力,可以使用socket或D-Bus激活服务,多种按需要启动服务,使用cgroups技术跟踪进程, 支持系统状态的快照和恢复,引导时自动挂载挂载点,基于事务依赖的控制逻辑。其主要架构图:
units
- systemd 中管理所谓的 units , 它们可以指代系统资源或服务。其类型可以包括:
- service
- 系统服务,可以启动,停止,重启等
- socket
- 一个关联到service的socket,主要使用本地socket
- device
- 一个有systemd管理的设备
- mount
- 一个有systemd管理的文件系统挂载点
- automount
- 系统引导时需要自动挂载的挂载点
- swap
- 系统中的swap空间
- target
- 多个units单元的同步点。通常用于系统引导时自启动服务。
- path
- 用于path-based激活的路径。例如,可以根据某个确切路径是否存在等状态来启动服务。
- timer
- systemd定时器,例如,可以用来基于定时时间激活服务
- snapshot
- 当前systemd状态的快照。通常用于在对systemd进行临时更改后回滚。
- slice
- 通过Linux Control Group节点(cgroups)限制资源。
- scope
- systemd bus接口获取的信息。通常用于管理外部系统进程。
man page
systemd手册较多,可以从systemctl开始,扩展到相关命令。(systemd不是一个命令,有一套相关命令)
1
man systemctl
系统管理命令
systemctl
是 Systemd 的主命令,用于管理系统。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 重启系统
$ sudo systemctl reboot
## 关闭系统,切断电源
$ sudo systemctl poweroff
## CPU停止工作
$ sudo systemctl halt
## 暂停系统
$ sudo systemctl suspend
## 让系统进入冬眠状态
$ sudo systemctl hibernate
## 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep
## 启动进入救援状态(单用户状态)
$ sudo systemctl rescue
启动性能分析
systemd-analyze
命令可以用于查看系统引导过程中各个服务等的使用时间,方便进行启动优化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 查看系统引导的整体时间
$ systemd-analyze time
## 查看系统引导过程中每个单元的时间占用情况
$ systemd-analyze blame
## 图形化查看系统各个组件启动引导占用时间
$ systemd-analyze plot > plot.svg
$ eog plot.svg
## 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
## 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
主机信息查看和修改
hostnamectl
命令用于查看当前主机的信息,并支持修改。可以参考手册。
1
2
3
4
5
## 显示当前主机的信息
$ hostnamectl
## 设置主机名。
$ sudo hostnamectl set-hostname rhel7
本地化设置
localectl
命令用于查看本地化设置,并支持修改。可以参考手册。
1
2
3
4
5
6
## 查看本地化设置
$ localectl
## 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB
时区设置
timedatectl
命令用于查看当前时区设置,并支持修改。可以参考手册。
1
2
3
4
5
6
7
8
9
10
## 查看当前时区设置
$ timedatectl
## 显示所有可用的时区
$ timedatectl list-timezones
## 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
登录用户控制
loginctl
命令用于查看当前登录的用户,并支持锁定,终止等。可以参考手册。
1
2
3
4
5
6
7
8
## 列出当前session
$ loginctl list-sessions
## 列出当前登录用户
$ loginctl list-users
## 列出显示指定用户的信息
$ loginctl show-user [username]
Units 控制管理相关
查看units
systemctl list-units
命令可以查看当前系统的所有 Unit 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 列出正在运行的 Unit
$ systemctl list-units
## 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
## 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive
## 列出所有加载失败的 Unit
$ systemctl list-units --failed
## 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service
Unit 运行状态检查
查看unit运行状态等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service
## 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service
# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service
Unit 基本管理
units的基本管理,service对象最常见的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
## 立即启动/停止/重启一个服务
$ sudo systemctl start/stop/restart apache.service
## 使能/禁用/查看服务开机时自启动
$ systemctl enable/disable/is-enabled xxx.service
## 屏蔽服务,无法自启动或手动启动,除非手动解除
$ systemctl mask xxx.service
## 查看一个服务的对应service文件
$ systemctl cat xxx.service
## 修改一个服务,(覆盖模式,直接修改)
$ systemctl edit --full xxx.service
## 杀死一个服务的所有子进程,(向服务的所有子进程发送特定信号)
$ sudo systemctl kill apache.service
## 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
## 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
## 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
## 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
## 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
## 查看/设置启动等级
$ sudo systemctl [get-default]/[set-default multi-user.target]
Unit 依赖关系查看
Units 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。
systemctl list-dependencies
命令列出一个 Unit 的所有依赖。
1
2
3
4
$ systemctl list-dependencies nginx.service
## 进一步展开 所有Target,使用--all参数。
$ systemctl list-dependencies --all nginx.service
Unit配置文件状态
systemctl list-unit-files
命令用于列出所有配置文件,可以查看其运行状态和自启动状态。
1
2
3
4
5
# 列出所有配置文件
$ systemctl list-unit-files
# 列出指定类型的配置文件
$ systemctl list-unit-files --type=service