Youmi Tech Blog.

I dream of painting and then I paint my dream.

Upstart 系统初始化过程

divisoryang Posted at Jan 26, 2016 . - 操作系统 -

Upstart是一个用于替代传统 init 的系统初始化程序。相对于 init 的同步执行,Upstart 是事件驱动、异步工作的。由于是事件驱动, Upstart 提供了传统 init 没法提供的功能,如机器运行时添加或删除U盘;由于异步工作,Upstart 更能充分利用CPU资源,性能更好。

Ubuntu 是我们常用的开发和服务器系统,当前最新 LTS 使用的是 Upstart,了解 Upstart 可以帮我们解答以下这些疑惑:

下面介绍一下日常最需要了解 Upstart 的一些方面:

一、基本概念

Upstart 的可执行文件就是系统里的 /sbin/init。它事件驱动的特性体现在通过一些事件来触发任务的执行,比如开机后有 startup 事件、启动一个 job 前有 starting xxx(job 的名字)事件、插入一个U盘也会有相应的事件。Upstart 的任务配置一般写在 /etc/init 目录下(其实还有用户的 Upstart 配置,可以放在 $HOME/.init 目录下)。

Upstart job 的三个类型:

  1. Task Job: 运行一小会儿就停止的服务。
  2. Service Job: 一直运行的服务,比如 PHP-FPM、sshd。
  3. Abstract Job:没有 exec 和 script 的任务, Upstart 不会跟踪他的pid, 常用来设置网络服务。

二、Upstart 在机器启动时的执行过程

ubuntu_upstart_procedure

在机器做完那些加载内核,挂载跟目录等工作后,操作系统会调用 /sbin/init 来接管后续的服务启动过程。

三、 和传统 init 的兼容

Upstart 兼容传统的 init 也称为 sysV 的启动方式,从上面步骤可以看到在 /etc/init/rc.conf 里调用了 /etc/init.d/rc 2, 这个程序会遍历 /etc/rc2.d 目录下的脚本并执行。

平时我们启动服务会用到下面这几种命令:

service x start
start x
initctl start x

其中 service 是一个脚本,它的工作原理是先检查 /etc/init 里的配置有没有这个命令要启动的服务,如果没有才到 /etc/init.d 里找到启动那个服务的脚本并执行。如果你通过 apt-get 安装 PHP-FPM 可以发现 /etc/init.d 里的 PHP-FPM 启动脚本并不会被 service php5-fpm start 调用。

参考资料