欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

解析Linux系统启动的引导流程

程序员文章站 2022-11-24 11:46:57
这篇文章主要介绍了Linux系统启动的引导流程,文中还附带了对多系统引导程序GRUB的介绍,需要的朋友可以参考下... 16-02-16...

  linux是*开源软件,在linux里一切都是文件,不管是命令,操作等等都是以文件形式保存,这篇博客来记录linux启动时的引导流程是通过哪写文件来完成的.
     使用的linux版本是centos5,centos和ubuntu都是自己联系使用时的较理想版本.
     下面以centos5.5版本为例,介绍linux的引导流程,具体流程如下:
解析Linux系统启动的引导流程

下面详细介绍每一步:
 
    1)第一步firmware固件自检,主要是进行cmos/bios对硬件进行post加电自检,在物理层次上对硬件进行检测是否正常。例如检查硬盘是否插好等。
    2)第二步读取硬盘中mbr的bootloader,自启动程序,linux下常用的自启动程序是grub。这一步主要的功能是载入内核。内核存放在/boot目录下
   3)第三步就是载入的内核kernel的过程,
        主要功能是:1、驱动硬件,kernel中含有大量驱动程序。2、启动init进程。
    4)init进程,主要是读取/etc/inittab文件,执行缺省运行级别,从而继续引导。需要注意的是init京城的pid恒为1,是所有进程的父进程,而init进程的负景程是0,为内核调度器kernel scheduler。
    5)/etc/inittab 定义了初始化的操作。
解析Linux系统启动的引导流程

命令主要格式是:id: runlevels : action : process
    其中,如上图红框中所示
    1、run-levels运行级别有7个,0—6分别如下:
   0 —— halt 关机
   1 —— single user mode 单用户模式
   2 —— multiuser,withoutnfs 多用户模式但不带网络(text模式)
   3 —— full multiuser mode 完整功能的多用户模式(text模式)
   4 —— unused 预留
   5 —— x11 图形化多用户模式
   6 —— reboot 重启
可以根据这7个运行级别来进行切换
命令为:查看当前运行级别 #runlevel、 切换运行级别 #init[0 |1 |2 |3 |4 |5 |6]
     2、而acion中也有几个比较重要的取值:
   1 initdefault:指定系统缺省启动的运行级别,如上图中标出,通常用于修复,比如我们要进入单用户模式,则可以将其设置为1,不可将默认设置为0或6,否则无法启动.
 
   2sysinit:系统启动执行process中指定的命令
解析Linux系统启动的引导流程

由inittab文件内容可以看出,没有设置运行级别,即为无论是哪个运行级别,都会执行/etc/rc.d/rc.sysinit

   6)initdefault,如第五步所说到的,主要是读取/etc/inittab中的信息,判断缺省的运行级别是什么。
    7)/etc/rc.d/rc.sysinit
    在inittab文件中运行到第21行,变是启动这个脚本。完成系统服务程序的启动,如系统环境变量的设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。由于是基础服务,因为其run-level设置为空::即任何级别,action设置为sysinit。即该脚本在任何运行级别下都要启动,以完成基础服务的启动
   8)基础服务启动后,会执行/etc/rc.d/rc这个脚本
    加载完基础服务后,就要根据不同的运行级别去启动相对应的下的目录,它的工作原理是先去判断系统的默认运行级别即第6步中的东西,然后再执行相应的rcn.d目录下的服务启动脚本如图
解析Linux系统启动的引导流程

 9)执行/etc/rc.d/rcn.d目录下的服务启动脚本

    看下该目录下的内容:
解析Linux系统启动的引导流程

 其中s表示要启动的脚本,k表示要关闭的脚本
    数字表示启动顺序,数值小的优先.主要是对一些服务的管理
    在这一步里,需要说明一下/etc/rc.d/init.d这个目录,这个目录里放的脚本是真正的脚本,而rcn.d里放置的都是init.d目录里的软连接,也就是说所有rcn.d里的文件最终都需要来init.d里找真正的脚本
 看一下具体细节:
解析Linux系统启动的引导流程

解析Linux系统启动的引导流程

执行到这一步,界面就会提示输入用户名和密码了,也就是说系统已经起来了,输入用户名和密码的过程后面再说,这次的引导流程就结束了
   
    最后需要说明的是,linux的引导流程的思想大致相同,但细节因为版本的问题,在配置文件的名字或者是位置都不尽相同,此次我用的是centos版本,而ubuntu版本是没有inittab文件和grup.conf文件的,所以如果有兴趣,大家可以按照这种思路去探索探索.

ps:关于grub
gnu grub(简称“grub”)是一个来自gnu项目的启动引导程序。grub是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。grub可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

gnu grub的前身为grand unified bootloader。它主要用于类unix系统;同大多linux发行版一样,gnu系统也采用gnu grub作为它的启动器。solaris从10 1/06版开始在x86系统上也采用gnu grub作为启动器。

grub可动态配置;它在启动时加载配置信息,并允许在启动时修改,如选择不同的内核和initrd。为此目的,grub提供了一个简单的类似bash的命令行界面,它允许用户编写新的启动顺序。

grub非常轻便。它支持多种可执行格式;它除了可适用于支持多启动的操作系统外,还通过链式启动功能支持诸如windows和os/2之类的不支持多启动的操作系统。grub支持所有的unix文件系统,也支持windows适用的fat和ntfs文件系统,还支持lba模式。grub允许用户查看它支持的文件系统里文件的内容。

grub具有多种用户界面。多数linux发行版利用grub对图形界面的支持,提供了定制的带有背景图案的启动菜单,有时也支持鼠标。通过对grub的文字界面的设定,可以通过串口实现远程终端启动。

grub可以从网络上下载操作系统镜像,因此可以支持无盘系统。grub支持在启动操作系统前解压它的镜像。

与其它启动器不同,grub可以通过grub提示符直接与用户进行交互。载入操作系统前,在grub文本模式屏幕下键入c键可以进入grub命令行。在没有作业系统或者有作业系统而没有"menu.lst"文件的系统上,同样可以进入grub提示符。通过类似bash的命令,grub提示符允许用户手工启动任何操作系统。把合适的命令记录在"menu.lst"文件里,可以自动启动一个操作系统。

grub拥有丰富的终端命令,在命令行下使用这些命令,用户可以查看硬盘分区的细节,修改分区设置,临时重新映射磁盘顺序,从任何用户定义的配置文件启动,以及查看grub所支持的文件系统上的其它启动器的配置。因此,即便不知道一台电脑上安装了什么,也可以从外部设备启动一个操作系统。

grub采用滚动屏幕选择想要启动的操作系统。通过向"menu.lst"文件中添加相关信息,grub可以控制150或者更多的启动选项,在启动时用方向键进行选择。

通过链式启动,一个启动器可以启动另一个启动器。grub通过2到3行的命令就可以从dos、windows、linux、bsd和solaris系统启动。

尽管grub为类unix系统进行了编译和打包,但也有供dos和windows使用的grub。grub也可以不附带任何操作系统而作为孤立系统安装。从cd上启动时运用grub需要1个文件,而从软盘、硬盘和usb设备上启动时需要2个文件。这些文件可以在任何支持grub的linux cd上找到,用户可以很容易的找到它们。