简单探寻一下systemd target

什么是systemd target

systemd targetsystemd众多资源的一个分类,以.target结尾,所代表的意思是unit集合,即.target资源包含了一系列的.service.target等,运行xxx.target就是运行其包含的.service.target等服务。

为什么需要systemd target

systemd target引入主要是为了提高系统初始化和管理的灵活性,其优势可以列举为以下几点:

  • 并行启动

systemd中,一个target包含了多个单元,这些单元若没有依赖关系的话,是可以并行启动的。

例如:

假设有一个target,名称为:xxx.target,其中包含2个service,分别为a.serviceb.service,而a.serviceb.service又依赖于network.target

其中图示可以如下:

当要启动xxx.target的时候,会启动network.target,因为xxx.target下的service依赖于此,而后会并行启动启动a.serviceb.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所保留的运行级别4systemd中,都使用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.serviceb.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.serviceb.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.serviceb.service是在同一秒执行的,但是该命令会睡眠数十秒,足以证明该systemd target的并发启动。

总结

systemd target存储的是unit集合,优点为支持并行启动,模拟SysVinit的运行级别,可以实现灵活切换,不仅如此,target还严格定义了服务优先级,以确保服务按照正常顺序启动,便于系统更好的进行维护。

相关推荐
0和1的舞者12 分钟前
基于Spring的论坛系统-前置知识
java·后端·spring·系统·开发·知识
invicinble1 小时前
对于springboot
java·spring boot·后端
码界奇点2 小时前
基于Spring Boot与Vue的校园后台管理系统设计与实现
vue.js·spring boot·后端·毕业设计·源代码管理
爱编程的小庄2 小时前
Rust 发行版本及工具介绍
开发语言·后端·rust
Apifox.3 小时前
测试用例越堆越多?用 Apifox 测试套件让自动化回归更易维护
运维·前端·后端·测试工具·单元测试·自动化·测试用例
sunnyday04264 小时前
Nginx与Spring Cloud Gateway QPS统计全攻略
java·spring boot·后端·nginx
康王有点困4 小时前
Link入门
后端·flink
海南java第二人4 小时前
Spring Boot全局异常处理终极指南:打造优雅的API错误响应体系
java·spring boot·后端
小楼v4 小时前
消息队列的核心概念与应用(RabbitMQ快速入门)
java·后端·消息队列·rabbitmq·死信队列·交换机·安装步骤
小北方城市网5 小时前
接口性能优化实战:从秒级到毫秒级
java·spring boot·redis·后端·python·性能优化