首页 > 代码库 > Linux系统启动流程

Linux系统启动流程

Linux系统启动流程

技术分享

Linux系统启动流程图

1、加电自检

    上电自检POST,主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常, 自检完成后从BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器

2、grub引导

(1)grub引导第一阶段(stage1):运行Boot Loader主程序,这个主程序必须被安装在启动区,即MBR(即硬盘的0磁道0扇区)。因为MBR空间有限,因此在MBR当中仅安装Boot Loader的最小主程序,并没有Boot Loader的相关配置文件。

(2)grub引导第二阶段(stage1.5):在MBR随后的扇区中存放,主要用于与stage2所在分区的文件系统交互。

(3)grub引导第三阶段(stage2):通过Boot Loader加载所有配置文件及相关的环境变量参数信息,这些配置文件及相关的环境变量参数都存放在磁盘分区的/boot/grub目录下(如果系统grub没有被修复过,此目录下除grub.conf文件外,其他文件都是非必须的)。如下图所示

技术分享

/boot/grub目录下配置文件

主要的配置文件grub.conf及相关说明:

技术分享

grub.conf的配置

    1)default=0(第十行):表示默认的启动条目,0表示第一个title系统

    2)timeout=5(十一行):表示可供选择的等待时间,在等待时间内如果按下任意键,则会进入启动条目的选择界面,如果不按则按默认的启动条目启动

    3)splashimage=(hd0,0)/grub/splash.xpm.gz:定义的启动时的背景图片信息(可以修改)。(hd0,0)表示存放于第一块磁盘的第一块分区

    4)hiddenmenu:启动时是否显示启动菜单,默认在等待时间内不操作,是不显示的,如果想要显示,可以将此行注释掉。

    5)title CentOS 6(2.6.32-642.el6.x86_64):显示启动菜单的标题

    6)root (hd0,0):表示内核文件存放的位置,这里指定的是分区位置,而非根目录。

    7)16行内容:内核的名称以及一些启动时的核心参数,root=UUID=68b0f8ab-7ccc-4fc4-8bbc-a992f91e9847表示根目录,由于启动过程中需要挂载根目录,因此就要指定根目录所在的分区。

    8)initrd:指定虚拟文件系统,主要通过此处的虚拟文件系统加载根目录,挂载真正的根目录。

3、加载内核

    当BootLoader读取内核文件以后,接下来就会将内核文件解压后装载到内存中,然后根据内核提供的功能开始测试与加载各个设备(如CPU、硬盘、网卡)。此时内核已经完全接管了BIOS的工作,所以,此处的检测与加载内核是完全不同的。

    但是此时的内核还没加载到硬盘,无法去读取系统上的内核文件;如果去挂载硬盘,由于硬盘的驱动程序都存在于硬盘上,无法去加载。所以此处通过虚拟文件系统/boot/initramfs来解决解决硬盘的挂载问题。

    同样,虚拟文件系统initramfs也是通过“Boot Loader”将其加载内存当中,然后虚拟文件也被加载到内存,然后此文件被解压在内存中模拟一个根文件系统,这个根文件系统能够模拟一个可以运行的程序,通过这个根文件系统去加载所需要的硬盘(包括RAID、LVM)驱动模块,最后以只读的方式去挂载真正的根目录。挂载完成后通过/sbin/init来执行后续的正常启动。

4、通过/sbin/init进程初始化系统

    内核、硬件及驱动信息加载完成后,内核会呼叫控制的第一个执行程序/sbin/init,init程序主要功能就是准备软件运行环境。

(1)先去获取/etc/inittab中的系统运行级别

技术分享

系统的运行级别

 系统的运行级别:

    1)0:关闭所有的服务,关机

    2)1:维护模式,单用户模式,次级别允许root用户直接登录不需要认证。

    3)2:维护模式,多用户模式,会启动网络功能,但不支持NFS

    4)3:正常级别,完全多用户模式,文本界面。

    5)4:预留级别

    6)5:正常级别,完全多用户模式,文本界面

    7)6:关闭所有服务,重启

(2)使用/etc/rc.d/rc.sysinit进行系统初始化

初始化动作: 

    1)根据配置文件中的设定来设置主机名,即读取/etc/sysconfig/network文件中的HOSTNAME行

    2)打印文本欢迎信息

    3)激活selinux和udev

    4)挂载所有定义在/etc/fstab文件中的文件系统

    5)激活swap分区

    6)检测根文件系统,并实现以读写方式重新挂载。

    7)设置系统时钟

    8)根据/etc/sysctl.conf文件设定内核参数的值

    9)激活LVM和RAID设备

    10)加载额外的设备驱动程序

    11)清理操作

(3)对读取到的运行级别下的服务进行操作(/etc/rc.d/rc.[runlevel])

    通过/etc/rc.d/rc.sysinit初始化系统完成以后,此时,系统就已经顺利开始工作了,但是需要启动一些当前系统运行级别需要运行的服务。这里就通过在/etc/inittab中所获取的运行级别来操纵/etc/rc.d/rc[runlenel].d/目录下的所有软连接来启动或关闭服务;所有以S开头的,都被传递start参数以启动,以K开头的,都被传递stop参数以停止。   

(4)启动用户自定义引导程序(/etc/rc.local)

    运行用户写在/etc/rc.local中的命令

(5)启动终端,调用用户登录文件

    启动终端,调用用户登录文件,如果是5级别,则启动图形化界面。


本文出自 “dayi123” 博客,请务必保留此出处http://dayi123.blog.51cto.com/12064061/1925189

Linux系统启动流程