linux系统启动流程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统启动流程相关的知识,希望对你有一定的参考价值。
启动流程总览
以我们个人计算机架设的Linux主机为例,当我们按下电源后计算机硬件会主动读取Bios来加载硬件信息及进行硬件系统的自我测试,之后系统会主动的读取第一个可启动的设备(由BIOS设置的),此时就可以读入引导装载程序了。引导装载程序可以指定使用哪个内核文件启动,并实际加载内核到内存当中解压缩与执行,此时内核就可以在内存当中去活动,并检测所有的硬件信息与加载适当的驱动程序来使主机开始运行,等到内核检测硬件与加载驱动程序完毕后,我们的操作系统便开始在pc上跑起来了。主机系统开始运行后,此时Linux才会调用外部程序开始准备软件执行环境,并且实际加载所有系统运行所需要的软件程序。所以系统的启动过程精简如下:
- 加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动的设备
- 读取并执行第一个启动设备内的MBR的boot looder(即grub程序)
- 依据boot Loader的设置加载内核kernel,内核会开始检测硬件和加载驱动程序
- 在硬件驱动成功后,Kernel会主动调用init(centos 6之前的版本的根进程,centos7根进程为systemd),取得运行等级(runlevel)信息。
- init执行/etc/rc.d/rc.sysinit文件来准备软件执行的操作环境
- init执行run-level的各个服务的启动
- init执行/rc.d/rc.local文件。
- init执行终端机模拟程序mingetty来启动login进程,最后等待用户登录。
启动流程第一大项--启动硬件设备
由上面总括的流程总览,我们不难发现,系统的启动流程可以概括为两大项:
一: 启动硬件设备
二:设置操作环境
第一项,启动硬件设备,我们需要经过BIOS的自检,boot loader的引导以及kernel的加载。
BISO自检
我们要想启动整个系统首先要让系统去加载BIOS(basic input output system),并通过BIOS程序去加载CMOS信息,并且通过CMOS内的设置值取得主机的各项硬件配置信息,然后BIOS会进行开机自检,开始执行硬件检测的初始化,进行启动设备的数据读取,及开始MBR与相关的任务。
boot loader
BIOS在加载的过程中指定启动的设备来让我们可以读取磁盘中的操作系统内核文件,但不同的操作系统的文件系统格式不同,因此我们需要一个引导装载程序来处理内核文件加载的问题。这个引导装载程序就就是bootloader,存放在了启动设备的第一个扇区内,也就是我们说的MBR(主引导分区),通过boot loader的引导,我们可以加载那内核。但是在这里有一个问题,在一个多操作系统的机器上,每个系统内核的加载,都需要使用自己的loader引导,而系统的MBR只有一个,那么我们是如何同时在一台主机上安装windows系统和Linux系统呢?
其实磁盘的每个分区上都留由一块引导扇区(boot sector)提供操纵系统安装boot loader。所以若是一个多操作系统,那么每个操作系统都会默认安装一个boot loader在自己的boot sector内,如下图所示:
但是问题依然没解决,要怎么样使得操作系统通过过自己的boot loader来加载内核呢? 这个就靠我们的boot loader自己了。boot loader主要功能有三个:1、提供启动菜单;2、加载内核文件;3、转交其他的loader。所以我们可以直接利用boot loader提供的菜单选项,选择要安装的操作系统,也就是选择其所对应的boot loader,来加载对应的内核。
知道了boot loader的功能后,我们变很好理解boot loader在启动流程中发挥的作用,但实际上,因为boot loader功能太多,而MBR之分给boot loader 446B的空间,这是完全不够的,所以Linux是将boot loader的程序运行与配置加载分为三个阶段(stage)来运行:
stage1:运行boot loader主程序(这部分存在于MBR的前446自己中),目的是识别要启动的系统的文件系统类型。
stage1_5:根据1识别的文件系统类型,加载相应的文件系统驱动,stage1_5中的文件系统驱动如图
stage2: 加载所有配置文件及相关的环境参数信息。读取grub.conf配置文件,加载驱动。grub.conf配置文件内容入如下:
内核加载阶段
在boot loader的引导下,成功读到grub.conf文件,开始加载内核
grub.conf:配置文件中重要设置如下:
title:定义各个操作系统的名称
root::表示内核文件存放的位置,这里指定的是分区位置,而非根目录。
kernel:内核的名称以及一些启动时的核心参数。由于启动过程中需要挂载根目录,因此就需要指定根目录所在的分区。rhgb表示色彩显示,quiet表示静默模式加载内核。
initrd(centos 5):一个伪系统,支持内核在这个虚拟的根系统上加载内核程序,来加载硬盘等设备。
grub.conf文件被读完之后,内核驱动开始加载。此时的系统就已经可以启动了。
第二项--设置操作环境
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他的服务的启动管理。而这些所有的操作都是通过initi的配置文件来定义
init的配置文件
- centos5:由于centos5采用的SysVinit方式,其特点是启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将被被串行启动;这也就导致了centos5的启动过程非常缓慢。其配置文件为:/etc/inittab
- cetos6 : 采用Upstart的方式,其特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;配置文件::/etc/inittab,/etc/init/*.conf
- centos7:采用Systremd方式,其特点是服务只有在第一次被访问到时才会真正的启动起来;因此centos7系统启动过程非常之快;其配置文件为:/usr/lib/systemd/*
init的处理流程
init是通过自上而下的读取inittab文件(centos5)依次执行的,根据inittab配置文件的执行流程如下:- 先取得默认的runlevel,这里默认的级别是5
- 使用/etc/rc.d/rc.sysinit进行系统的初始化
- 哟由于采用的是5级别,因此只进行13:3:wait:/etc/rc.d/rc 5,其他则忽略
4.配置好[ctrl]+[alt]+[del]组合键的功能
5.配置不断电系统pf,pr两种机制
6.启动mingetty6个终端
系统初始化/过程
在取得默认等级之后,init根据/etc/rc.d/rc.sysinit中定义内容进行系统的初始化,/etc/rc.d/rc.sysinit所做的事主要有一下几点:
- 根据配置文件中的设定来设定主机名
- 打印文本欢迎信息
- 激活SELinux和udev
- 挂载swap设备
- 检测根系统一,并实现以读写方式重新挂载
- 设置系统时钟
- 根据/etc/sysctl.conf文件设定内核参数的值
- 激活LVM和RAID设备
- 加载额外的设备驱动程序
- 清理操作
初始化系统完成后,我们需要开启一系列服务来满足我们系统所需要功能,如sshd、dhcp等服务。这里就是通过在initta里面取得的id:5:wiat:/etc/rc.d/rc 5配置了,实际上是通过/etc/rc.d/rc3.d/下的链接文件来决定如何启动和关闭服务;所有S开头的文件都被传递start参数以启动,所有以K开头的,都将被stop参数以停止。
开启终端
在完成系统所有相关的服务后启动之后,接下来Linux就会启动终端。我们的系统到此也就完全启动了!
以上是关于linux系统启动流程的主要内容,如果未能解决你的问题,请参考以下文章