近年来,Linux系统的init进程经历了两次重大的演进,传统的sysinit已经逐渐淡出历史舞台,新的upstart和systemd各有特色,愈来愈多的Linux发行版采纳了systemd。 RHEL 7.0也开始使用systemd 。ubuntu
systemd是Linux系统中最新的初始化系统(init),它的主要设计目标是克服sysinit固有的缺点,提升系统的启动速度。systemd和Ubuntu的upstart是竞争对手,预计会取代upstart,已经有消息称ubuntu也将采用systemd做为其标准的系统初始化系统。安全
systemd提供了比upstart更激进的并行启动能力,采用了socket/D-Bus activation等技术启动服务。一个显而易见的结果就是,具备更快的启动速度。为了减小系统的启动时间,systemd的目标是:服务器
尽量启动更少的进程。网络
尽量并行启动更多的进程。并发
systemd提供了按需启动能力socket
当sysvinit系统初始化时,它会将全部可能用到的后台服务进程所有启动运行,而且系统必须等待全部的服务都启动就绪后,才容许用户登陆。这种作法有两个缺点:首先是启动时间过长;其次是浪费了系统资源。某些服务极可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。花费在启动这些服务上的时间是没必要要的;一样,花费在这些服务上的系统资源也是浪费的。systemd能够提供按需启动能力,只有在某个服务被真正请求时才启动它。当该服务结束后,systemd能够关闭它,等待下次须要时再次启动它。spa
systemd采用Linux的Cgroup特性跟踪和管理进程的生命周期命令行
init系统的一个重要职责就是负责跟踪和管理服务进程的生命周期,它不只能够启动一个服务,并且也必须可以中止服务。这看上去没什么特别的,然而在真正用代码实现时,你或许会发现中止服务比一开始想的要困难。设计
服务进程通常都会做为守护进程(daemon)在后台运行,为此服务程序有时候会派生(fork)两次。在upstart中,须要在配置文件中正确地配置expect,这样upstart经过对fork系统调用进行计数,从而获知真正的守护进程的PID号。为了处理这类问题,upstart经过strace来跟踪fork,exit等系统调用,可是这种方法很笨拙,且缺少可扩展性。systemd则利用了Linux内核特性即Cgroup来完成跟踪任务。当中止服务时,经过查询Cgroup,systemd能够确保找到全部的相关进程,从而干净地中止服务。调试
Cgroup已经出现了好久,它主要用来实现系统资源配额管理。当进程建立子进程时,子进程会继承父进程的Cgroup。所以不管服务如何启动新的子进程,全部的这些相关进程都会属于同一个Cgroup,systemd只须要简单地遍历指定的Cgroup,便可正确地找到全部的相关进程,将它们一一中止。
启动挂载点和自动挂载管理
在传统的Linux系统中,用户能够用/etc/fstab文件来维护固定的文件系统挂载点。这些挂载点在系统启动过程当中被自动挂载,一旦启动过程结束,这些挂载点就会确保存在。这些挂载点都 是对系统运行相当重要的文件系统,好比目录。和sysvinit同样,systemd管理这些挂载点,以便可以在系统启动时自动挂载它们。systemd还兼容/etc/fstab文件,你能够继续使用该文件管理挂载点。
有时候用户还须要动态挂载点,好比打算访问光盘时,才临时执行挂载以便访问其中的内容,而不访问光盘时该挂载点被取消(umount),以便节约资源。传统的,人们依赖autofs服务来实现这种功能。
systemd内建了自动挂载服务,无须另外安装autofs服务,能够直接使用systemd提供的自动挂载管理能力来实现autofs的功能。
实现事务性依赖关系管理
系统启动过程是由不少独立工做共同组成的,这些工做之间可能存在依赖关系,好比挂载一个NFS文件系统必须依赖网络可以正常工做。systemd虽然可以最大限度地并发执行不少有依赖关系的工做,可是相似于“挂载NFS”和“启动网络”这样的工做仍是存在天生的前后依赖关系,没法并发执行。对于这些任务,systemd维护一个“事务一致性”的概念,保证全部相关的服务均可以正常启动而不会出现互相依赖,以致于死锁的状况。
可以对系统进行快照和恢复
systemd支持按需启动,所以系统的运行状态是动态变化的,人们没法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力。
好比系统当前正运行服务A和B,能够用systemd命令行对当前系统运行情况建立快照,而后将进程A中止,或者作其余的对系统的任意改变,好比启动新的进程C。在这些改变以后,运行systemd的快照恢复命令,就可当即将系统恢复到快照时刻的状态,即只有服务A,B在运行。一个可能的应用场景是调试,假设服务器出现一些异常,为了调试用户将当前状态保存为快照,而后能够进行任意操做,好比中止服务等,等调试结束后,恢复快照便可。注意:这个快照功能目前在systemd中并不完善。
日志服务
systemd自带了日志服务journald,该日志服务的设计初衷是克服现有的syslog服务的缺点。好比:
syslog不安全,消息的内容没法验证。
数据没有严格的格式,很是随意。
systemd journald用二进制格式保存全部的日志信息,用户使用journalctl命令来查看日志信息,无须本身编写复杂,脆弱的字符串分析处理程序。