网上很多Linux的启动流程图,也有Ubuntu早期版本的启动流程介绍,却少有近期版本的启动流程介绍(16.04)。这里作出总结归纳。

Linux系统采用的是RedHat启动方式,启动流程如下:

Ubuntu的启动流程与上面Linux的启动流程有很大区别。因为RedHat启动时穿行执行大量的脚本和启动各种需要的服务,所以Ubuntu(6.10-现在)用upstart的方式代替init,因此在Ubuntu下面/etc/下面是没有inittab的。

Ubuntu(6.10-现在) upstart可以说是在表象上保留了大部分原来init的特性,因此目前Ubuntu初始化进程名仍然叫init,而改变的核心,则是Event机制。init进程ID是1,是所有进程的父进程,所有进程由它控制。Event机制就是将进程的触发、停止都看成是Event。基于事件机制、系统的所有服务、任务都是由事件驱动的。

Ubuntu(6.10-9.10)的/etc/下有一个event.d,这个目录是upstart的核心。/etc/event.d/下面存放了目前upstart需要识别的各种event。这其中主要有三种:rc-default,rcX(X = 0,1,2,3,4,5,6,S),ttyX(X = 0,1,2,3,4,5,6,S)。其中rc-default就类似与inittab文件,用来设置默认运行级别的。ubuntu(9.10-目前)启动仍旧由upstart控制,自9.10后不再使用/etc/event.d目录的配置文件,改为/etc/init/*.conf。

Ubuntu16.04关于系统启动的目录结构如下:

├── etc
├── ├── init
├── ├── ├── rc.conf
├── ├── ├── rc-sysinit.conf
├── ├── ├── rcS.conf
├── ├── ├── ttyX.conf # 系统的6个终端
├── ├── init.d
├── ├── ├── rc
├── ├── rc${runlevel}.d

Ubuntu16.04的启动流程图如下:

系统运行时会进入/etc/init目录(Upstart init会到该目录下读取配置文件),下面有三个相关的文件,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。能看到默认的runlevel是2。

>>> cat /etc/init/rc-sysinit.conf
......
# Default runlevel, this may be overriden on the kernel command-line
# or by faking an old /etc/inittab entry
env DEFAULT_RUNLEVEL=2
......
telinit "${DEFAULT_RUNLEVEL}"
......

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

>>> cat /etc/init/rc.conf
......
start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
......
/etc/init.d/rc $RUNLEVEL
......

上面的start on runlevel [0123456];stop on runlevel [!$RUNLEVEL]就是来设置服务何时启动,何时终止的。倒数第二行的/etc/init.d/rc $RUNLEVEL,就是运行init.d/下面的rc文件了,RUNLEVEL是运行级别。

很明显,/etc/init.d/rc被调用了,并且传入了早前设置好的系统runlevel作为参数。rc脚本有这么一段:

>>> cat /etc/init.d/rc
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
......
for s in /etc/rc$runlevel.d/S*
......

/etc/init.d/rc会根据传入 的runlevel参数调用/etc/rc${runlevel}.d/下的脚本(以S开头)以启动服务,终止在前次runlevel启动而当前在 runlevel需要终止的服务。S表示在启动时运行,数字则表示执行的先后顺序。其中有一个链接叫做S30gdm,gdm的意思是gnome display management,也就是用来启动gnome桌面的。

至此系统启动完毕。

Reference:

http://www.cnblogs.com/bigben0123/p/3173826.html

Ubuntu启动流程的更多相关文章

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

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

  2. ubuntu启动脚本一览分析

    #rc--run command的意思[rc解释]harvey@ubuntu:/etc$ cat ./init/rc-sysinit.conf # rc-sysinit - System V init ...

  3. ubuntu upstart启动流程分析

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

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

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

  5. Linux 的启动流程(转)

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

  6. 【转】Linux 的启动流程

    半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操 ...

  7. Linux 的启动流程

    转载:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 更多文档参见:http://pan.baidu.com/s/1hqo ...

  8. 鸟哥的linux私房菜——第20章 启动流程、模块管理与loader

    20.1 Linux启动流程分析 Linux启动过程: 按下开机电源后计算机硬件主动读取BIOS来加载硬件信息以及硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置),此时就可以 ...

  9. Jvm(jdk8)源码分析1-java命令启动流程详解

    JDK8加载源码分析 1.概述 现在大多数互联网公司都是使用java技术体系搭建自己的系统,所以对java开发工程师以及java系统架构师的需求非常的多,虽然普遍的要求都是需要熟悉各种java开发框架 ...

随机推荐

  1. scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战

    參考代码: import scala.actors._ case class Person(name:String,age:Int) class HelloActor extends Actor{ d ...

  2. OpenCV打开摄像头失败

    <span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h>< ...

  3. 网络:万维网(WWW)

    ylbtech-网络:万维网(WWW) www (万维网缩写)同义词 万维网一般指www(万维网缩写)WWW是环球信息网的缩写,(亦作“Web”.“WWW”.“'W3'”,英文全称为“World Wi ...

  4. php 获取随机字符串(原创)

    //获取随机数字字母字符串 function get_rand_str($len=8){ $randArr=array_merge(range(0,9),range('a','z'),range('A ...

  5. MySQL实现表之间的字段更新

    新功能写好之后,需要把以前表数据更新一下,字段数据从以前的表中获取,只更新两个字段 UPDATE TABLE1,TABLE2 SET TABLE1.COLUMN1 = TABLE2.COLUMN1 , ...

  6. Java中利用随机数的猜拳游戏

    Java中利用随机数的猜拳游戏,实现非常简单,重难点在于随机数的产生. 首先GameJude类是用于判断输赢的一个类: package testGame; public class GameJudge ...

  7. ROS-TF-广播

    前言:将海龟的坐标系变换广播到TF. URDF文件的描述是在相对坐标上进行的,运动起来就需要考虑机器人各个连杆的相对位置关系.TF的诞生就是为了自动管理这些相对关系下的坐标变换的,而我们需要做的就是给 ...

  8. 试图ddms 如果丢失adv链接解决办法!

    点击如下图菜单 重启链接adv即可显示.

  9. myslide探索

    最近查一些国内学术牛人的报告时,注意到myslide是个很好的平台,比如山大一个老师的报告,完全可以在上面看到 https://myslide.cn/slides/10774 又比如交大一个大牛老师关 ...

  10. 易观OLAP算法大赛结果揭晓,开源组黑马放大招!

    100+天激烈赛程,40+国内顶级技术豪门对决,历经研发内部测试.正式环境测试和易观数据正式环境跑benchmark三大阶段.10月28日,易观OLAP算法大赛优胜名单出炉! 40+技术门派比武 易观 ...