目前Linux系统有三种init方式:第一种是最早的、也是广为流传的System V initialization; 第二种是最近几年提出的Upstart方式,基于事件机制,系统的所有服务和任务都是事件驱动的;最后一种是Systemd,发展最为迅速的,大有取代Upstart之势。本文主要是分析目前ubuntu(14.04)系统中所用的Upstart,其他两种不作介绍了。
熟悉System V方式的同学都知道,它是通过执行第一个脚本/etc/inittab中的/etc/init/rc N实现其指定的运行级别中进行初始化工作(系统服务的启动脚本主要在/etc/rcN.d目录中)。而对于Upstart而言,/etc/init目录(有的可能是/etc/event.d)才是关键,里面全是作业配置文件,通过这些配置文件就可以设置相应的作业程序何时启动/停止。
ubuntu的Upstart为了兼容原system V方式的服务,其启动大概流程如下图所示:
- 系统上电后,由Grub加载内核Kernel,内核在完成初始化后会执行第一个进程init,即Upstart init进程。
- Upstart init在进行自身的一些初始化后,会发出startup事件。
- startup事件会触发mountall等一些作业(/etc/init目录下的作业配置文件中包含start on startup语句的作业)。
- 在mountall作业中会发射virtual-filesystems、local-filesystems、remote-filesystems、all-swaps、filesystem、mounting、mounted事件。
- 其中mounted事件会触发container-detect作业&#