Centos & RedHat 启动过程详解

Centos & RedHat 启动过程详解_第1张图片

1.当我们按下电源按钮,把电源投入到机器中后,首先被启动执行的就是这个BIOS(BasicInput/OutputSystem)程序。BIOS的功能是......并且访问硬盘先头512Bit的MBR(Master Boot Record)。

2.经BOIS的控制,将MBR中的Boot Record调入内存中。这里就要说说Linux的Boot程序了,Linux的Boot程序有GRUB和LILO,而CentOS默认的Boot程序是GRUB。

3.通过Boot程序,访问硬盘中的Linux内核程序。

4.将内核程序调入内存中。

5.内核程序调用完成后,通过内核访问硬盘中将要用到的其他文件。


Centos & RedHat 启动过程详解_第2张图片

A、简要说明

    当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilogrub开始引导Linux Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinitrc等程序,rc.sysinitrc当完成系统初始化和运行服务的任务后,返回initinit启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

 

Linux 系统启动过程大致按照如下步骤进行(这是一个简述):

第一阶段:BIOS启动引导阶段

在该过程中实现硬件的初始化以及查找启动介质;

MBRMaster Boot Record)中装载启动引导管理器(LILOGRUB)并运行该启动引导管理

第二阶段:GRUB为例启动引导阶段

装载stage1

装载stage1.5

装载stage2

读取/boot/grub.conf文件并显示启动菜单;

装载所选的kernelinitrd 文件到内存中

第三阶段:内核阶段

运行内核启动参数;

解压initrd 文件并挂载initd 文件系统,装载必须的驱动;

挂载根文件系统

第四阶段:SysV init 初始化阶段

启动/sbin/init 程序;

运行rc.sysinit脚本,设置系统环境,启动swap 分区,检查和挂载文件系统;

读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;

打开字符终端1-6号控制台/打开图形显示管理的7号控制台

 

B、详细说明

第一阶段:

系统上电开机后,主板BIOSBasic Input / Output System)运行POSTPoweron self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS(Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。

执行POST代码对系统外围关键设备检测通过后,系统启动自举程序,根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。

注:在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否准备好,以供操作系统使用。

第二阶段:

BIOS通过下面两种方法之一来传递引导记录:

第一,将控制权传递给initialprogram loaderIPL),该程序安装在磁盘主引导记录(MBR)中

第二,将控制权传递给initialprogram loaderIPL),该程序安装在磁盘分区的启动引导扇区中

无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。

因此IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUBshell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernelimage并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。完成之后后续的引导权被移交给kernel

假设Boot Loadergrub (grub-0.97),其引导系统的过程如下:

grub分为stage1(stage1_5)stage2两个阶段。stage1可以看成是initial program loaderIIPL),而stage2则实现了grub 的主要功能,包括对特定文件系统的支持(如ext2ext3reiserfs等),grub自己的shell,以及内部程序(如:kernrlinitrdroot)等。

stage 1MBR512字节,001扇区),前446字节存放的是stage1,后面存放硬盘分区表信息,BIOSstag1载入内存中0x7c00处并跳转执行。

stage1/stage1/start.S)的任务非常单纯,仅仅是将硬盘002扇区读入内存。002扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。

注:此时stage1是没有能力识别文件系统的,其定位硬盘002扇区过程如下:BIOSstage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘002扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位002扇区有两种寻址方式:LBACHS

start.S的主要功能是将stage2stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是stage1_5,则载入0x2200处。

注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub 还没有能力识别任何文件系统。分以下两种情况:

1)假如start.S读取的是stage1_5,它存放在硬盘003扇区向后的位置,stage1_5作为stage1stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。

2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区BootSectorstage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。

假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则系统启动过程中grub 会启动失败。

这个地方经常要进行的操作:

是关于grub 常用的几个指令对应的函数:

grub>root (hd0,0) --root指令为grub 指定了一个根分区

grub>kernel /xen.gz-2.6.18-37.el5 --kernel指令将操作系统内核载入内存

grub>module /vmlinuz-2.6.18-37.el5xen roroot=/dev/sda2 --module指令加载指定的模块

grub>module /initrd-2.6.18-37.el5xen.img --指定initrd文件

grub>boot --boot 指令调用相应的启动函数启动OS内核

第三阶段:

如阶段2所述,grub>boot指令后,系统启动的控制权移交给kernelKernel会立即初始化系统中各设备并做相关配置工作,其中包括CPUI/O、存储设备等。

关于设备驱动加载,有两部分:一部分设备驱动编入LinuxKernel中,Kernel会调用这部分驱动初始化相关设备,同时将日志输出到kernelmessage buffer,系统启动后dmesg可以查看到这部分输出信息。另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrdramdisk)中。

2.6内核中,支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。以cpio格式为例,内核判断initrdcpio的文件格式后,会将initrd中的内容释放到rootfs中。

initrd 是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统时,会先访问initrd文件系统。将initrd 中的内容打开来看,会发现有bindevetclibprocsyssysrootinit等文件(包含目录)。其中包含了一些设备的驱动模块,比如scsiata等设备驱动模块,同时还有几个基本的可执行程序insmod,modprobe,lvmnash。主要目的是加载一些存储介质的驱动模块,如上面所说的scsiideusb等设备驱动模块,初始化LVM,把根文件系统以只读方式挂载。

initrd 中的内容释放到rootfs中后,Kernel会执行其中的init文件,这里的init是一个脚本,由nash解释器执行。这个时候内核的控制权移交给init文件处理,我们查看init文件的内容,主要也是加载各种存储介质相关的设备驱动。

驱动加载后,会创建一个根设备,然后将根文件系统以只读的方式挂载。这步结束后释放未使用内存并执行switchroot,转换到真正的根上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给init进程。关于switchroot是在nash中定义的程序。

Linux Kernel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上LinuxKernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入initrd。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。

第四阶段:

init进程起来后,系统启动的控制权移交给init进程。

/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:

1)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;

2)确定启动后进入的运行级别;

3) 执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先KS,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.dn=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。

4/etc/rc.d/rc$RUNLEVEL          # $RUNLEVEL为缺省的运行模式

5) /etc/rc.d/rc.local

6)启动虚拟终端/sbin/mingetty

7)在运行级别5上运行X

这时呈现给用户的就是最终的登录界面。

至此,系统启动过程完毕。

说明:

系统启动运行级别的概念以及服务的定制方法;

initrd 可以正常检测和装载之后,最后的工作就基本上由操作系统来进行了。当系统的init进程起来之后系统启动的控制权移交给init进程。

/sbin/init 进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:

1)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,后面需要进行运行级别的确定及相应服务的启动,(从这个角度可以看出如果要定义系统的init动作,需要修改/etc/rc.d/rc.sysinit脚本)。它的主要工作有:配置selinux,系统时钟,内核参数(/etc/sysctl.conf),hostname,启用wap分区,根文件系统的检查和二次挂载(读写),激活RAIDLVM设备,启用磁盘quota检查并挂载其它文件系统。

2)通过对/etc/inittab文件的读取确定启动后进入的运行级别;

3) 在相应的运行级别中执行/etc/rc.d/rcx.d目录下的脚本名称,该文件定义了服务启动的顺序是先K S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.dn=0~6)目录下,但这些文件均是到/etc/init.d下的相应文件的链接。

系统会按照在该目录下的文件名称和优先级执行对应运行级别目录下的脚本:在某个运行级别的对应目录下,K开头的服务被关闭,S 开头的服务被开启,KS 开始之前执行,在执行过程中按照数字来定义优先级,数字越低优先级越高。

4)按照/etc/rc.d/rcX.d目录中的定义,系统会于后台启动相应的服务,如果要对某个运行级别中的服务进行更具体的定制,通过chkconfig命令来操作,或者通过setup/ntsys/system-config-services 来进行定制。

5)在/etc/inittab文件中存在有关key sequenceUPS 的脚本定义,启动虚拟终端/sbin/mingetty的设置,这时呈现给用户的就是最终的登录界面。也就是说后台启动的服务完毕之后,如果系统默认进入字符界面,则运行mgetty进入1-6号终端控制台,如果系统默认进入图形界面,则开启gdm服务进入7号虚拟图形控制台。至此,系统启动过程完毕。



你可能感兴趣的:(Centos & RedHat 启动过程详解)