前言
在centos5、centos6中,linux的启动一直采用init进程来进行管理。从centos7开始,放弃了采用init进程,从而使用systemd来代替init进程。
对于init进程来说有两个缺点:
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
systemd定义
为了解决init的问题,systemd被诞生出来,为系统的启动和管理提供一整套解决方案。systemd在诞生之时也受到了众多人的异议。
由于它过于庞大、复杂,导致背离了unix一切从简的原则。但不可否认它的功能强大,使用方便。
systemd是Linux系统的一套基本构建块。它提供了一个系统和服务管理器,它以PID 1的形式运行并启动系统的其余部分。
systemd新特性
1. 系统引导时实现服务并行启动
systemd 提供了比 upstart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。
一个显而易见的结果就是:更快的启动速度。为了减少系统启动时间,systemd 的目标是:
尽可能启动更少的进程。
尽可能将更多进程并行启动。
2. 按需激活进程
sysvinit系统在初始之前,会将有所有可能启动的后台服务进程全部启动。并且系统在等待这些进程全部运行完之后才会让用户进行登录。这样就导致了时间以及资源的浪费。
systemd则采用按需启动的方式,只有当你真正请求启动某些服务时才会启动。而且服务在运行结束之后,systemd可以关闭它,等下次请求时再次启动。
3. 系统状态快照
systemd可以临时保存当前所有的单元配置文件,或者从前一个快照中恢复单元配置文件。为了保存当前系统服务状态,systemd可以动态的生成单元文件快照。
4. 基础依赖关系定义服务控制逻辑
系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个 NFS 文件系统必须依赖网络能够正常工作。
Systemd 虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似"挂载 NFS"和"启动网络"这样的工作还是存在天生的先后依赖关系,无法并发执行。
对于这些任务,systemd 维护一个"事务一致性"的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。
unit(单元)
1. unit配置文件
systemd管理着许多的资源,可以认为每一个资源就是unit(单元)unit由其相关的配置文件进行标识、识别和配置;
文件中主要包含了系统服务、监听的socket、保存的快照以及其他与init相关的信息。这些配置文件主要保存在:
①/etc/systemd/system 存放系统启动的默认级别及启动的unit的软连接,优先级最高。
②/run/systemd/system 系统执行过程中产生的服务脚本,优先级次之。
③/usr/lib/systemd/system 存放系统上所有的启动文件。优先级最低 Systemd 默认从目录/etc/systemd/system/读取配置文件。
但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
2. unit常见类型
类型 | 解释 |
---|---|
service unit | 文件扩展名为.service,用于定义系统服务 |
target unit | 文件扩展名为.target,用于模拟实现"运行级别" |
device unit | 文件扩展名为.device,用于定义内核识别的设备 |
mount unit | 文件扩展名为.mount,定义文件系统挂载点 |
sokect unit | 文件扩展名为.socket,用于标识进程间通信用到的socket文件 |
snapshot unit | 文件扩展名为.snapshot,用于实现管理系统快照 |
swap unit | 文件扩展名为.swap,用于标识swap设备 |
automount unit | 文件扩展名为.automount,文件系统自动挂载点设备 |
path unit | 文件扩展名为.path,用于定义文件系统中的一个文件或目录 |