BIOS:Basic Input Output System,是一组固化到计算机内主板上的一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出程序、系统 设置星系、开机后自检程序和系统自动程序。其主要功能是为计算机提供最底层、最直接的硬件设置和控制

boot loader:操作系统内核运行之前运行的一段小程序,初始化硬件设备,建立内存空间映射图,为调用操作系统内核准备好正确的环境

 Linux系统的启动首先从BIOS开始,接下来进入到boot loader ,由boot loader载入内核,进行内核初始化。内核初始化的最后一步就是启动 pid =1的init进程,这是系统的第一个进程,它负责产生其他的用户进程。

Init系统能够定义、管理和控制init进程的行为。他负责组织和运行许多独立的或者相关的初始化工作,从而计算机系统进入某种用户预定的运行模式。仅仅将内核运行起来是毫无实际用途的,必须由init系统将系统带入到可操作状态。比如启动外壳shell,便有了人机交互,或者启动X图形系统以便提供更好的人机界面。

sysvInit:

                Sysvinit 巧妙地用脚本,文件命名规则和软链接来实现不同的 runlevel。

                首先完成初始化工作,然后开始运行/etc/rc.d/rc脚本,根据不同的runlevel打开对应的rcX.d目录,找到该目录下所有的启动脚本。文件名以 S 开头的脚本就是启动时应该运行的脚本,S 后面跟的数字定义了这些脚本的执行顺序。例如(rc0.d目录下)

lrwxrwxrwx. 1 root root 15 Sep 15 09:46 K03rhnsd -> ../init.d/rhnsd
lrwxrwxrwx. 1 root root 20 Sep 15 09:44 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Sep 15 09:44 K90network -> ../init.d/network

在/etc/rc.d/rcX.d 目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d 目录下。

               Sysvinit 不仅需要负责初始化系统,还需要负责关闭系统。在系统关闭时,为了保证数据的一致性,需要小心地按顺序进行结束和清理工作。比如应该先停止对文件系统有读写操作的服务,然后再 umount 文件系统。否则数据就会丢失。

这种顺序的控制这也是依靠/etc/rc.d/rcX.d/目录下所有脚本的命名规则来控制的,在该目录下所有以 K 开头的脚本都将在关闭系统时调用,字母 K 之后的数字定义了它们的执行顺序。

通过以下命令启动服务:

service httpd start

优缺点:优点:概念简单,开发人员只需要编写启动和和停止脚本即可;有确定的执行顺序,易于排错

                缺点:串行执行脚本,效率较慢。必须一次性把所有可能用到的服务都启动起来,即使暂时没有使用到的服务,也必须启动。

upstart:

               由来:由于sysvinit在初始化时,需要被初始化的设备并没有连接到系统上,而sysvinit的缺点是一次性把所有可能用到的设备都启动起来。这样会对用户的使用造成不便。为了解决此类问题,开发和设计了upstart。它采用事件机制,比如 U 盘插入 USB 接口后,udev 得到内核通知,发现该设备,这就是一个新的事件,UpStart 在感知到该事件之后触发相应的等待任务,比如处理/etc/fstab 中存在的挂载点。采用这种事件驱动的模式,upstart 完美地解决了即插即用设备带来的新问题。

               此外,sysvinit采用的是串行执行脚本,而实际情况下,大量的脚本之间之没有依赖关系的,完全可以并行启动,从而减少启动时间。

采用事件驱动模型,UpStart 可以:

  1. 更快地启动系统
  2. 当新硬件被发现时动态启动服务
  3. 硬件被拔除时动态停止服务

更加深入了解upstart参照:https://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/index.html?ca=drs-

systemd:

              Systemd 提供了比 UpStart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务。一个显而易见的结果就是:更快的启动速度。

为了减少系统启动时间,systemd 的目标是:

  • 尽可能启动更少的进程
  • 尽可能将更多进程并行启动

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。 /usr/lib/systemd/systemd --switched-root --syste

systemd并发启动的原理:

  1. 解决 socket 依赖

  2. 解决 D-Bus 依赖

  3. 解决文件系统依赖