什么是systemd target
systemd target
是systemd
众多资源的一个分类,以.target
结尾,所代表的意思是unit
集合,即.target
资源包含了一系列的.service
、.target
等,运行xxx.target
就是运行其包含的.service
、.target
等服务。
为什么需要systemd target
systemd target
引入主要是为了提高系统初始化和管理的灵活性,其优势可以列举为以下几点:
- 并行启动
在systemd
中,一个target
包含了多个单元,这些单元若没有依赖关系的话,是可以并行启动的。
例如:
假设有一个target
,名称为:xxx.target
,其中包含2个service
,分别为a.service
和b.service
,而a.service
和b.service
又依赖于network.target
。
其中图示可以如下:
当要启动xxx.target
的时候,会启动network.target
,因为xxx.target
下的service
依赖于此,而后会并行启动启动a.service
和b.service
因为它们之间没有依赖关系,最后等xxx.target
单元启动完毕后,就完成了该target
的启动。
- 切换运行方式灵活性
传统的SysVinit
切换运行级别,会导致系统重启,例如:在centos 5/6
系统中,我们想切换运行级别,可以使用如下命令:
bash
# init 3
# init 5
其中运行级别3
代表多用户文本模式,运行级别5
代表多用户图形模式,在切换之后,会导致系统重新启动以便进入新的运行界别。
但是在centos 7
中,是利用target
模拟的用户级别,比如
multi-user.target
模拟的是多用户文本模式graphical.target
模拟的是多用户图形模式
事实上不仅如此,但是使用target
模拟切换用户级别的时候,是不会导致系统被重启的,所以使用target
切换运行模式非常灵活。
除此之外,使用target
可以整理出整个系统启动的层次结构,以便确保服务按照正常的顺序启动,正式因为有了target
,所以才比较好管理和维护,可谓是好处多多。
systemd target 运行级别
在centos 5/6
中,有7个运行级别,分别是:
0
: 关机模式1
: 单用户模式2
: 多用户模式-无网络3
: 多用户模式-有网络4
: 未使用-保留5
: 图形化模式6
: 重启模式
其中最常用的运行模式是3
,多用户文本模式。
而在centos 7
中,systemd
也模拟了7
种运行级别,但是实际上target
只有5种,所一一对应的关系列为表格:
SysVinit 运行级别 |
运行级别描述 | systemd 目标单元 |
---|---|---|
0 | 关机模式 | poweroff.target |
1 | 单用户模式 | rescue.target |
2 | 多用户模式-无网络 | multi-user.target |
3 | 多用户模式-有网络 | multi-user.target |
4 | 保留 | multi-user.target |
5 | 图示模式 | graphical.target |
6 | 重启模式 | reboot.target |
其中systemd
没有一一对应,而是使用target
进行代替,不能做到像SysVinit
那么细,只能是模拟符合大概的情形,比如:多用户模式-无网络/多用户模式-有网络,以及SysVinit
所保留的运行级别4
在systemd
中,都使用multi-user.target
所代替,其中关于systemd
使用target
代替运行级别,可以使用如下命令查询:
bash
# ls -l /usr/lib/systemd/system/runlevel*.target
命令所执行的结果为:
在systemd
中,想要知道自己处于那种运行模式下,可以使用如下命令查询:
bash
# systemctl get-default
例如:
目前我们使用的是ssh
进行连接机器的,当我们连接到服务器时,我们可以查看得到如下界面:
在systemd
中,切换运行模式,使用isolate
来进行切换的,当我们想从图形界面切换到多用户文本界面的时候,可以使用如下命令进行切换:
bash
# systemctl isolate multi-user.target
当执行完毕后:
在此连接到服务器时,就可以看到服务器已经切换到多用户文本界面了:
且切换运行模式并没有导致系统被重启,例如执行uptime
查看运行时间:
上述命令设置的运行级别是临时生效的,当系统重启后,又会进入到默认的运行级别中,该运行级别存储的路径是:/etc/systemd/system/default.target
,其内容为:
所以下次重启的时候,该系统又会进入到多用户图形模式中,想要设置默认运行级别可以使用set-default
来修改默认的运行级别,例如,将该系统设置为 多用户文本模式multi-user.target
,可以使用如下命令:
bash
# systemctl set-default multi-user.target
其运行结果为:
可以看到,该命令就是重新设置了一下default.target
的软连接而达成的。
除了使用systemd
切换用户级别外,还可以使用该工具进入到系统救援模式和紧急模式。
使用systemctl rescue
命令可以进入救援模式,命令执行如下:
当系统进入救援模式后,可以连接到该服务器上,输入root
密码后进入救援模式,例如:
当然,也可以进入紧急模式,使用systemctl emergency
可以使系统进入到紧急模式中。
自定义systemd target
俗话说,光说不练假把式,我们可以创建一个target
来说明该并发启动的特性,先创建a.service
和b.service
,2个service
都依赖于network.target
,其内容为:
a.service
bash
[Unit]
Description = This is a test service a
After = network.target
[Service]
ExecStart=/usr/bin/sleep 30
b.service
bash
[Unit]
Description = This is a test service b
After = network.target
[Service]
ExecStart=/usr/bin/sleep 20
创建target
来,包含a.service
和b.service
,其内容如下:
my-test.target
bash
[Unit]
Description = My test target
Requires = a.service b.service
After = network.target
[Install]
WantedBy = default.target
其中,Requires
的意思是如果所包含的服务启动失败,则该target
也将启动失败。
此时重载配置文件,查看my-test.target
状态。
bash
# systemctl daemon-reload
# systemctl status my-test.target
启动my-test.target
,进而查看message
的日志
命令如下:
bash
# systemctl start my-test.target
# systemctl status my-test.target
执行命令:
bash
# tail /var/log/messages
可以看到日志发现,a.service
和b.service
是在同一秒执行的,但是该命令会睡眠数十秒,足以证明该systemd target
的并发启动。
总结
systemd target
存储的是unit
集合,优点为支持并行启动,模拟SysVinit
的运行级别,可以实现灵活切换,不仅如此,target
还严格定义了服务优先级,以确保服务按照正常顺序启动,便于系统更好的进行维护。