网上很多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. Spark新愿景:让深度学习变得更加易于使用——见https://github.com/yahoo/TensorFlowOnSpark

    Spark新愿景:让深度学习变得更加易于使用   转自:https://www.jianshu.com/p/07e8200b7cea 前言 Spark成功的实现了当年的承诺,让数据处理变得更容易,现在 ...

  2. hdu 1002(大数)

    A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. cxf调用WebService

    一.用CXF调用WebService的几种方式,参考: http://cxf.apache.org/docs/how-do-i-develop-a-client.html 二.JaxWsProxyFa ...

  4. 给统计人讲Python(1)_科学计算库-Numpy

    本地代码是.ipynb格式的转换到博客上很麻烦,这里展示部分代码,了解更多可以查看我的git-hub:https://github.com/Yangami/Python-for-Statisticia ...

  5. JS——BOM操作(基本用法与实现:open()、close()、scrollTop等了解)

    (1)window.open() 定义和用法 open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口 语法 window.open(URL,name,specs,replace) [默认填 ...

  6. ROS-launch文件标签解读

    前言:ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系 ...

  7. 常用GC算法

    在C/C++中是由程序员自己去申请.管理和释放内存的,因此没有GC的概念.而在Java中,专门有一个用于垃圾回收的后台线程来进行监控.扫描,自动将一些无用的内存进行释放.下面介绍几种常见的GC算法. ...

  8. Socket server

    Socket server的使用方法(精华部分),仅供自用. class MyServer(socketserver.BaseRequestHandler): def handle(self): wh ...

  9. Linux下实现视频读取

    V4L(video4linux是一些视频系统,视频软件.音频软件的基础,经常时候在需要采集图像的场合,如视频监控,webcam,可视电话,经常使用在embedded linux中是linux嵌入式开发 ...

  10. 12) 十分钟学会android--APP通信传递消息之简单数据传输

    程序间可以互相通信是Android程序中最棒的功能之一.当一个功能已存在于其他app中,且并不是本程序的核心功能时,完全没有必要重新对其进行编写. 本章节会讲述一些通在不同程序之间通过使用Intent ...