简单探寻一下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还严格定义了服务优先级,以确保服务按照正常顺序启动,便于系统更好的进行维护。

相关推荐
海绵波波1072 小时前
flask后端开发(10):问答平台项目结构搭建
后端·python·flask
网络风云4 小时前
【魅力golang】之-反射
开发语言·后端·golang
Q_19284999064 小时前
基于Spring Boot的电影售票系统
java·spring boot·后端
运维&陈同学5 小时前
【Kibana01】企业级日志分析系统ELK之Kibana的安装与介绍
运维·后端·elk·elasticsearch·云原生·自动化·kibana·日志收集
Javatutouhouduan7 小时前
如何系统全面地自学Java语言?
java·后端·程序员·编程·架构师·自学·java八股文
后端转全栈_小伵7 小时前
MySQL外键类型与应用场景总结:优缺点一目了然
数据库·后端·sql·mysql·学习方法
编码浪子8 小时前
Springboot高并发乐观锁
后端·restful
uccs8 小时前
go 第三方库源码解读---go-errorlint
后端·go
Mr.朱鹏9 小时前
操作002:HelloWorld
java·后端·spring·rabbitmq·maven·intellij-idea·java-rabbitmq
编程洪同学10 小时前
Spring Boot 中实现自定义注解记录接口日志功能
android·java·spring boot·后端