这一节比较简单,学习了RHEL7里面的 Target 服务。
RHEL7里面,初始进程变成了systemd。RHEL6和之前的版本使用的初始进程是init,init是一个线性的启动过程,一个接一个的启动,比较慢;systemd则可以多进程启动,速度提高很多。另外,systemd还有简化了开发,集成日志等优点。
前面学习systemctl的时候,对service结尾的特定服务可以执行start,stop,restart等操作;另外还有一类后缀是以target的结尾,这些target 服务可以视作一批服务的集合,里面预定义了哪些服务运行,哪些不运行。这个概念非常类似RHEL6级之前的runlevel的概念。
查看 target 服务
RHEL6之前的版本,可以在/etc/rc.d里面查看7个运行级别,每个运行级别对应不同的功能,比如0是关机,1是单用户,2是多用户(没网络),3是多用户,4没用,5是图形界面,6是重启。 可以使用 init 0 直接关机等等。
RHEL7里面,target有类似等同的定义
runlevel和init等旧版的命令仍然兼容,比如查看当前的 target (runlevel),我也可以查看默认的target(runlevel)
类似的切换runlevel 可以用 init ,也可以用 systemctl isolate。
例如,切换到命令行界面
我如果输入 init 5 或者 startx, 又可以直接切换成图形界面。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/113287.htm
1. 类型
systemd开启和监督整个系统是基于unit的概念。unit是由一个与配置文件名同名的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,它是守护进程avahi的一个封装单元)。unit有以下几种类型:
service:代表一个后台服务进程,比如 mysqld。这是最常用的一类。
socket:此类配置单元封装系统和互联网中的一个套接字。当下,systemd支持流式,数据报和连续包的 AF_INET,AF_INET6,AF_UNIX socket。每个套接字配置单元都有一个相应的服务配置单元,相应的服务在第一个“连接”进入套接字时就会启动(例如:nscd.socket在有新连接后便启动nscd.service)。
device:此类配置单元封装一个存在于Linux设备树中的设备。每个使用udev规则标记的设备都将会在systemd中作为一个设备配置单元出现。
mount:此类配置单元封装文件系统结构层次中的一个挂载点。systemd将对这个挂载点进行监控和管理。比如,可以在启动时自动将其挂载,可以在某些条件下自动卸载。systemd会将/etc/fstab中的条目都转换为挂载点,并在开机时处理。
automount:此类配置单元封装系统结构层次中的一个自挂载点。每个自挂载配置单元对应一个挂载配置单元,当该自动挂载点被访问时,systemd执行挂载点中定义的挂载行为。
Swap:和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被**。
target:此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已,这样便可以对配置单元做一个统一的控制,就可以实现大家都非常熟悉的运行级别的概念。比如,想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有的这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍,以便进入目标所代表的系统运行状态(例如:multi-user.target相当于在传统使用sysv的系统中运行级别5)。
timer:定时器配置单元用来定时触发用户定义的操作。这类配置单元取代了atd,crond等传统的定时服务。
snapshot:与target配置单元相似,快照是一组配置单元,它保存了系统当前的运行状态。
每个配置单元都有一个对应的配置文件,比如一个MySQL服务对应一个mysql.service文件。这种配置文件的语法非常简单,用户不需要再编写和维护复杂的sysv脚本了。
2. 依赖关系
虽然systemd将大量的启动工作解除了依赖,使得它们可以并行启动。但还是存在一些任务,它们之间存在天生的依赖关系,不能用“套接字**”(socket activation),D-Bus activation和autofs三大方法来解除依赖。比如,挂载必须等待挂载点在文件系统中被创建; 挂载也必须等待相应的物理设备就绪。为了解决这类依赖问题,systemd的配置单元之间可以彼此定义依赖关系。比如,unit A依赖unit B,可以在unit B的定义中用“require A”来表示,这样systemd就会保证先启动A再启动B。systemd能保证事务完整性。systemd的事务概念和数据库中的有所不同,主要是为了保证多个依赖的配置单元之间没有环形引用。如果存在循环依赖,那么systemd将无法启动任意一个服务。此时,systemd将会尝试解决这个问题,因为配置单元之间的依赖关系有两种:requireds是强依赖,wants则是弱依赖,systemd将去掉wants关键字指定的依赖看看是否能打破循环。如果无法修复,systemd会报错。systemd能够自动检测和修复这类配置错误,极大地减轻了管理员的拔锚负担。
3. target和运行级别
systemd用目标(target)替代了运行级别的概念,提供了更大的灵活性,比如可以继承一个已有的目标,并添加其他服务来创建自己的目标。下表展示sysvinit运行级别和systemd目标的对应关系:
sysvinit运行级别 |
systemd目标 |
备注 |
0 |
runlevel0.target,poweroff.target |
关闭系统 |
1,s,single | runlevel1.target,rescue.target | 单用户模式 |
2,4 |
runlevel2.target,runlevel4.target,multi-user.target |
用户定义/域特定运行级别。默认等同于3 |
3 | runlevel3.target,multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录 |
5 |
runlevel5.target,graphical.target |
多用户,图形化。通常为所有运行级别3的服务外加图形化登录 |
6 | runlevel6.target,rebooot.target | 重启 |
emergency |
emergency.target |
急救模式(Emergency shell) |