系统启动过程

一、Linux系统的启动步骤

(1)主机加电自检:按下主机电源键之后,启动过程就开始了。系统会首先加载BIOS(Basic Input Output System,基本输入输出系统),检查连接到系统的设备,并枚举和初始化设备。这个过程会初始化所有连接到主机的设备,例如将光驱中的激光头复位、初始化键盘等设备。如果自检过程中没有发现错误,系统会根据BIOS中的设置查找处于活动状态并能用于引导系统的设备(通常是光盘、硬盘、U盘等),读取引导设备中的引导装载程序(有时也称引导加载程序)。

(2)引导装载程序(Boot Loader)加载内核:引导装载程序加载成功之后,系统的控制权将会交给引导装载程序(RHEL5.3中的引导装载程序是GRUB)。它会读取其配置文件/boot/grub/grub.conf(老版的GRUB配置文件是/boot/grub/menu.lst),并根据这个文件中的设置加载Linux内核。

(3)初始化系统环境:Linux内核加载之后,系统的控制权将会交给内核。内核将构建最基本的内核环境,执行的工作有:调用初始化函数初始化各种设备、加载驱动和内核模块等。内核环境构建完成之后,将执行系统中的第1个进程INIT。

(4)INIT进程:INIT进程是系统中的第1个进程,它是所有进程的父进程,负责管理系统中的所有进程。INIT进程启动后会根据配置文件/etc/inittab中的设置,进入指定的运行级别,设置网络,加载USB驱动模块等。

(5)加载Login:INIT进程最后加载的是程序/bin/login,此程序将弹出提示登录界面,要求用户输入用户名和密码登录系统。

提示:少数发行版或较老的发行版使用的引导装载程序可能是LILO,其工作原理与GRUB类似。

二、引导装载程序GRUB

GRUB,GNU GRUB的简称,是Linux系统中主流的引导装载程序,许多发行版都使用它作为引导装载程序。

说明:Linux系统启动的第1步是由BIOS完成的,不同的操作系统的此步骤都一样。

引导装载程序GRUB加载之后,会首先读取引导分区中的配置文件/boot/grub/grub.conf,并根据这个配置文件加载内核。查看这个配置文件的内容如下:

[root@localhost ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-53.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.18-53.el5.img

下面将简单介绍grub.conf中的具体设置:

1、设置启动的操作系统

default=0
timeout=5

第1行表示默认启动第1个菜单条目,菜单条目的编号从0开始算起。第2行表示选择超时,此处的5表示如果用户超过5秒没有选择需要启动的操作系统,GRUB将启动第1行中设置的菜单条目。

2、设置GRUB引导选择界面

第3、4行用于设置GRUB引导选择界面:

splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

第3行表示GRUB引导选择界面使用的背景风格,此处设置的背景界面文件为第1块硬盘的第1个分区中的/grub/splash.xpm.gz。第4行表示显示的GRUB引导选择界面隐藏用户选择菜单。

3、菜单条目

菜单条目使用了多行设置了一个可启动的操作系统:

title Red Hat Enterprise Linux Server (2.6.18-53.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.18-53.el5.img

这上面的4行代码就是一个菜单条目,它设置了一个可以启动的Linux系统。如果系统中不止一个操作系统,此处的菜单条目可能会有多个。下面将简单介绍菜单条目中的设置。

(1)菜单条目的第1行设置了操作系统的名称,其中title是新的菜单条目的起始标记。

(2)第2行用于指定根目录,此处设置的根目录为第1个硬盘的第1个分区(硬盘和分区编号都是从0算起的,其实这个分区就是引导分区)。其中的root表示根目录(而非root用户)。

(3)第3行用于设置GRUB加载的内核文件和内核参数。此处加载的是根目录中的vmlinuz-2.6.18-128.e15(注意此时的根目录是引导分区,因此实际加载的是/boot中的vmlinuz-2.6.18-128.e15)。内核文件之后的是内核参数,上面的内核参数及含义如下:

ro root=LABEL=/:表示以只读方式将/挂载到根目录。

rhgb:表示使用红帽的图形界面替代字符输出。

quiet:表示禁止所有正常的输出。

(4)第4行用于挂载内存映像文件initrd-2.6.18.128.e15.img。

GRUB启动Linux系统时,会先加载内核,然后挂载内存映像文件。最后将系统控制权交给内核,由内核执行初始化系统环境工作。

【定制内存映像文件】

定制内存映像文件主要是为了能加载一些特定设备的驱动模块,例如特殊的SCSI硬盘、特殊的阵列卡等。

(1)定制映像文件的过程非常简单,首先需要确认相应的内核模块是否已经存在目录/lib中。例如需要将RAID 0的内核模块放入内存映像文件中,先使用locate命令确认内核模块是否存在:

[root@localhost ~]# locate raid0.ko
/lib/modules/2.6.18-53.el5/kernel/drivers/md/raid0.ko

(2)然后就可以在内存映像文件目录中,使用mkinitrd命令定制内存映像了:

 
#使用mkinitrd命令制作含有RAID 0模块的内存映像
[root@localhost ~]# mkinitrd --with=raid0 initrd-2.6.18-53.el5.img 2.6.18-53.el5

需要注意到是生成的文件名的版本号(即其中的2.6.18-128.el5,如果不知道,可以使用uname -r查看),应该与参数中的版本号一致。

当然也可以使用以下形式:

[root@localhost ~]# mkinitrd --with=raid0 initrd-$(uname -r).img $(uname -r)

【GRUB引导装载程序的工作原理】

(1)读取Linux系统的引导分区,并读取其配置文件,然后按配置文件中的配置弹出选择界面。

(2)获得用户的选择或确定使用默认设置后,按配置文件中的指引加载内核文件,并挂载内存映像文件到内存。

(3)将系统控制权交给内核。

原文地址:https://www.cnblogs.com/nufangrensheng/p/3477468.html