ubuntu的init方式有两种:一种是System V initialization,一种是Upstart。ubuntu6.10以前的版本是第一种方式,之后的版本是第二种方式。

  在旧式的System V initialization中,/etc/inittab文件可是相当的重要。init进程启动后第一时间就是找这个文件。它负责系统的初始化,设置系统的runlevel及进入各个runlevel对应要执行的命令。决定启动级别的语句是id:5:initdefault这一行(这里设置的runlevel是5)。假设当前的inittab设置的runlevel就是5,则init会运行/etc/init.d/rc 5(最后面的5是传入的参数)命令,该命令会依据系统服务的依赖关系遍历执行/etc/rc5.d中的脚本/程序,来启动系统。我们可以打开/etc/rc5.d文件,会发现里面都是到/etc/init.d下文件的软链接。

 zqx@zqx-K40AB:/etc$ ls -l rc5.d/
总用量 4
-rw-r--r-- 1 root root 677 4月 14 2012 README
lrwxrwxrwx 1 root root 20 10月 27 18:20 S20kerneloops -> ../init.d/kerneloops
lrwxrwxrwx 1 root root 27 10月 27 18:20 S20speech-dispatcher -> ../init.d/speech-dispatcher
lrwxrwxrwx 1 root root 20 10月 29 22:11 S31atieventsd -> ../init.d/atieventsd
lrwxrwxrwx 1 root root 20 10月 27 18:20 S50pulseaudio -> ../init.d/pulseaudio
lrwxrwxrwx 1 root root 15 10月 27 18:20 S50rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root 15 10月 27 18:20 S50saned -> ../init.d/saned
lrwxrwxrwx 1 root root 19 10月 27 18:20 S70dns-clean -> ../init.d/dns-clean
lrwxrwxrwx 1 root root 18 10月 27 18:20 S70pppd-dns -> ../init.d/pppd-dns
lrwxrwxrwx 1 root root 14 10月 27 18:20 S75sudo -> ../init.d/sudo
lrwxrwxrwx 1 root root 22 10月 27 18:20 S99acpi-support -> ../init.d/acpi-support
lrwxrwxrwx 1 root root 21 10月 27 18:20 S99grub-common -> ../init.d/grub-common
lrwxrwxrwx 1 root root 18 10月 27 18:20 S99ondemand -> ../init.d/ondemand
lrwxrwxrwx 1 root root 18 10月 27 18:20 S99rc.local -> ../init.d/rc.local

  我们再来看看这几年才提出来的Upstart方式,这种是基于事件模式的,这种方式可以在系统运转的任何时期都可以通过发送事件来启动或终止服务。当然了,System V initialization方式也可以通过etc/init.d/Servicetart/stop/otherCommand来操作服务,但很明显不如Upstart方式简洁明白。

  Ubuntu现行的系统是兼容System V initialization方式的,我目前PC上的系统是Ubuntu 12.4的,可以看到系统中有如下几个目录:

 /etc/init
/etc/init.d
/etc/rc${runlevel}.d

  作为两种init方式各自特征的/etc/init.d,/etc/rc${runlevel}.d目录和/etc/init目录在Ubuntu中都有了,那么Ubuntu是如何实现兼容的?实际上,Ubuntu中并没有直接采用System V-style启动服务,要知道,Ubuntu中的init已被替换为Upstart init,而System V-style的服务是存放于/etc/rc${runlevel}.d目录中的,(而/etc/rc${runlevle}.d/下的文件是到/etc/init.d的软链接)可Upstart init并不会直接跑到这里面去启动服务。它是通过间接调用来启动这类服务的。换句话说,Ubuntu中的init并不会直接奔着/etc/init.d或者/etc/rc${runlevel}.d/而去,它采用了折衷的办法,通过/etc/init下的某些配置文件调用/etc/rc${runlevel}.d/中的脚本以启动采用旧式System V-style的服务。

  看以下的例子:

  进入/etc/init目录(Upstart init会到该目录下读取配置文件),有几个rc文件

 rc.conf
rc-sysinit.conf
rcS.conf

  rc-sysinit在startup事件发生时被启动,rc在系统runlevel变化时被启动,rcS在系统runlevel为S时启动。在配置文件的注释中说明了,这几个文件,正是Upstart init处理System V-style服务的关键。

  rc-sysinit在startup事件发生时被启动,即,Upstart init会首先读取rc-sysinit.conf并执行相关配置和脚本。rc-sysinit.conf的主要工作是设置系统默认runlevel,检测是否存在/etc/inittab或内核命令行,若存在,则按内核命令行>/etc/inittab>默认runlevel的顺序设置系统 runlevel。最后,调用telinit进入设置的runlevel。

  由于调用了telinit进入了设定的runlevel,runlevel改变的事件发生,此时rc服务启动(当然其他服务也会)。那么,我们就有必要来看看rc.conf中到底有什么东西。打开rc.conf,注意到最后一行:

exec /etc/init.d/rc $RUNLEVEL

  是不是感觉/etc/init.d/rc很熟悉,没错,从这里开始,就是System V initialization方式的东西了。在System V initialization中,/etc/inittab中的各runlevel对应的命令行就是通过这种形式设置的。

  很明显,/etc/init.d/rc被调用了,并且传入了早前设置好的系统runlevel作为参数。而/etc/init.d/rc会根据传入 的runlevel参数调用/etc/rc${runlevel}.d/下的脚本(以S开头)以启动服务,终止在前次runlevel启动而当前在 runlevel需要终止的服务。通过rc-sysinit和rc间接的调用/etc/init.d/rc从而启动System V-style服务,Ubuntu在采用新式Upstart init照顾了旧式的System V init。

ubuntu init启动流程的更多相关文章

  1. (转)Ubuntu init启动流程分析

    原文 upstart homepage 现行的Linux distros主流的有两种init方式:一种是广为流传的System V initialization,它来源于Unix并且至今仍被各种Lin ...

  2. ubuntu为什么没有/etc/inittab文件? 深究ubuntu的启动流程分析

    Linux 内核启动 init ,init进程ID是1,是所有进程的父进程,所有进程由它控制. Ubuntu 的启动由upstart控制,自9.10后不再使用/etc/event.d目录的配置文件,改 ...

  3. ubuntu upstart启动流程分析

    ubuntu自从6.10版本之后就使用了较新的upstart机制来进行系统的初始化. upstart是一种基于事件驱动的服务启动机制,可以使多个系统任务在保持依赖关系的前提下并发启动(据说这样这样启动 ...

  4. Ubuntu启动流程

    网上很多Linux的启动流程图,也有Ubuntu早期版本的启动流程介绍,却少有近期版本的启动流程介绍(16.04).这里作出总结归纳. Linux系统采用的是RedHat启动方式,启动流程如下: Ub ...

  5. Linux启动流程和服务管理(init和systemd)

    目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...

  6. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...

  7. ubuntu启动流程和要读取相关文件

    当前系统环境为:linux mint mate 17.1(基于ubuntu14.04的衍生版) 查阅资料后总结如下: 首先: /etc/rc.d链接目标为:/etc /etc/rc*.d文件夹中的脚本 ...

  8. 内核启动流程3--Busybox的init进程

    Busybox是用来制作文件系统的一个工具集,可以用来替换GNU fileutils shellutils等工具集,它为各种小型的或者嵌入式系统提供了比较完全的工具集. 它提供的核心程序中包括了用户空 ...

  9. Linux 的启动流程(转)

    原文链接:http://blog.jobbole.com/46078/ 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序 ...

随机推荐

  1. JAVA下查看进程中线程占用CPU较高的代码

    执行以下代码获得进程的线程.并找到CPU占用较高的线程ID ps -mp 16935 -o THREAD,tid,time   执行以下代码,通过线程ID获得16进制的线程标识 printf &quo ...

  2. [ruby]rubyGem出现ERROR: Could not find a valid gem时的处理方法

    场景: 想安装SASS的时候,打开cmd,输入gem install sass的时候却出现了: ERROR:  Could not find a valid gem 'sass' (>= 0), ...

  3. 8-网络请求之http

    本篇博客对应视频讲解 回顾 上一篇讲了Linq的使用,大家自己上手实践之后,相信一定会感到非常快捷方便.更多详细的内容还是需要自己去阅读官方文档. 今天要讲网络请求中的http请求,这也是在编程当中经 ...

  4. 【总结】 NOIp2018考时经历记

    可能我因为比较菜的原因,还是要写一下这个东西! 发布时间迟与更新时间,毕竟浙江选手为先例 那么希望NOIp8102RP++!!! 突然发现博客园支持更新创作时间了,那么就不咕了! 本次NOIp感受很深 ...

  5. ClamAV学习【6】—— cli_load函数浏览

    (老爸回家,就放开心和他到处走,累……趁其和老妈聊天之际,再继续看代码) 参数选项,加载病毒都浏览得七七八八了,这里就贴个简单的函数注释吧.哈哈. 代码注释如下: int cli_load(const ...

  6. NOIP2013PUZZLE

    #include<cstdio> #include<cstring> #define MIN(A,B) (A)<(B)?(A):(B) using namespace s ...

  7. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  8. [Objective-C语言教程]错误处理(22)

    在Objective-C编程中,错误处理由Foundation框架中提供的NSError类提供处理. 与仅使用错误代码或错误字符串相比,NSError对象封装了更丰富且更具可扩展性的错误信息. NSE ...

  9. JavaScript基础总纲

    如果前人种好了树那我们干嘛不去享受阴凉,然后花费时间去为大树的成长进一份力. 我发现一个站点写的很全面写很系统,我总结主要分为一些几个模块: 一,JavaScript 教程(基础) 二,JavaScr ...

  10. multiprocessor(下)

    一.数据共享 展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分 ...