Linux启动过程

Linux系统
Linux是一套免费使用和*传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
如何启动
我们平时在工作或学习中经常使用Linux操作系统,但是他是如何从关机状态启动的呢?
Linux启动过程

BIOS
BIOS(Basic Input/Output System)基本输入输出系统。计算机在开机启动时,首先会读取这个系统,然后BIOS上会有一个加电自检(POST)的过程。加电自检过程其实就是检查计算机硬件的过程,包括检查CPU和内存,检查计算机最基本的组成单位(控制器,运算器,存储器),还会检查其他硬件。如果没有异常,就加载BIOS程序到内存中。BIOS加载到内存中,他的一个主要功能是存储了磁盘的启动顺序,BIOS会根据启动顺序去查找磁盘头的MBR信息,并加载和执行MBR中的BootLoader程序。一旦BootLoader程序被检测并加载到内存中,BIOS就将控制权交给BootLoader程序。

MBR
MBR(Master Boot Record)主引导记录。磁盘上第0磁道第一个扇区被称为MBR。他的大小是512字节,里面存放了预启动信息、分区表信息。MBR大体可分为两个部分:第一部分为引导区,占了446个字节。第二部分为分区表,占了64个字节,记录硬盘的分区信息。最后两字节用于MBR的有效性检验。 预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。

GRUB
GRUB(Grand Unified Bootloader)多系统启动程序,其执行过程可分为三个步骤:Stage1:它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
Stage1_5:该步骤就是为了识别文件系统
Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。

Kernel
Kernel,内核。kernel是Linux系统最主要的程序,kernel的文件很小,只保留了最基本的模块,并以压缩文件的形式存储在硬盘中,当GRUB将kernel读进内存,内存开始解压缩内核文件。解压后,系统会调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
在 start_kenrel()的结尾,内核通过kenrel_thread()创建出第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。

Init
Init,初始化。进行OS初始化操作, 实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,它做的工作非常多,包括设定PATH、 设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。

Runlevel
runlevel,运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种
  0:关机模式
  1:单一用户模式(直接以管理员身份进入)
  2:多用户模式(无网络)
  3:多用户模式(命令行)
  4:保留
  5:多用户模式(图形界面)
  6:重启
  在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本
* Run level 0 – /etc/rc.d/rc0.d/
* Run level 1 – /etc/rc.d/rc1.d/
* Run level 2 – /etc/rc.d/rc2.d/
* Run level 3 – /etc/rc.d/rc3.d/
* Run level 4 – /etc/rc.d/rc4.d/
* Run level 5 – /etc/rc.d/rc5.d/
* Run level 6 – /etc/rc.d/rc6.d/