linux引导过程

 
从打开计算机的电源开始启动redhat linux 系统到用户可以登录为止,共经历了
1.初始化bios
2.执行启动加载程序
3.载入内核
4.启动init服务(rc.sysinit->rc->rc.local->建立使用环境)
 
计算机在接通电源之后首先由bios进行post自检,然后依据BIOS内设置的引导顺序从硬盘,软硬或cdrom中读入引导块
 
BIOS的第一个步骤是加电post自检,post的工作是对硬件进行检测,BIos的第二个步骤是进行本地设备的枚举和初始化。BIOS
 
由2部分组成:POST代码和运行时的服务,当POST完成之后,它被从内存中清理出来,但是BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务
 
BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备,引导设备可以是软盘,CD-ROM,硬盘上的某个分区,
网络上的某个设备甚至是USB闪存。
通常,linux都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序,
MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区,(0道0柱面1扇区).当MBR被加载到RAM中之后,BIOS就会将控制权交给
MBR
 
启动加载程序
在RED HAT linux 中,默认的加载程序是GRUB.引导加载程序用于引导操作系统启动,当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节
(主引导记录)。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要启动多个操作系统的时就会出现问题,需要更加灵活的引导加载程序
所有的引导加载程序都以类似的方式工作,linux系统支持常用的引导加载程序:LILO和grub
 
载入内核
接一下的步骤就是加载内核映像到内存中,内存映像并不是一个可执行的内核,而是一个压缩过的内存映像,通常它是一个zImage(压缩映像,小于512KB)
或是一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib压缩过的,在这个内核映像前面是一个例程,它实现少量硬件设置,
并对内核映像中包含的内核进行解压缩,然后将其高端的内存中。如果有初始化RAM磁盘映像,系统就会将它移动到内存中,并标明以后使用。
然后该例程会调用内核,并开始启动内核引导的过程
 
linu内核启动后,会执行以下几项工作
1.检测所有的硬件设备
linux内核首先会向BIOS查询计算机的所有的硬件设备的信息,然后自己接手管理这些硬件设备,以便提供给red hat linux系统使用
 
2。驱动硬件设备
接着linux内核便会驱动计算机的硬件设备,要驱动硬件设备,redhat linux就必须加载硬件的驱动程序,redhat linux的驱动程序可分为
编译在内核镜像文件中的静态驱动程序与内核模块(kernel module)的动态驱动程序2种,其中的内核模块全部都存储在系统中
由于此时的Linux系统尚未挂载任何文件系统,因而无法使用存储于文件系统上的内核模块,redhat linux 自然借助这些动态驱动程序来驱动硬件设备,因此,
启动Linux内核的阶段只会使用静态驱动程序,驱动必要的硬件设备
如果没有提供驱动程序的硬件设备,redhat linux会等到挂载根目录文件系统后,在逐一尝试尚未安装驱动程序的设备的驱动程序
 
3.以只读的方式挂载根文件系统
接着linux内核会试着去挂载根文件系统(root file system).安装适当的内核模块,一便驱动某些硬件设备或启用某些功能,
启动于存储于根文件系统中的 init服务,以便让Init接手后续的启动工作
 
要特别注意的是:此时,根文件系统是采用只读(read-only)的方式进行挂载的,也就是说,到目前为止,linux内核只能读取根文件系统,无法改变其中的内容
这主要是因为此时的Linux内核仍在启动阶段,还不是很稳定,如果使用可读可写的方式挂载根文件系统,万一 系统不小心当机了,一来可能会破坏根文件系统
上的数据,再者,redhat linux下次开机得花上很长的时间检查并修复根文件系统,为了避免这些问题的发生,redhat linux系统会以只读的方式来挂载根文件系统
 
4.启动Init服务
redhat linux内核启动后的最后一个动作,就是从根文件系统上找出并执行init服务,redhatlinux 内核会依照下列的顺序寻找init服务,
1)找/sbin/是否有Init服务
2)/etc/init
3)/bin/init
 
4)都找不到,就会执行/bin/sh
 
在这个过程中,只要有某一个步骤找到Init,linux就会去执行该目录下中的init,如果到最后内核还是找不到init服务,redhat linux内核就会显示 “kernel 
panic not syncing:Attempted to kill init!"的错误信息
 
找到Init服务,redhat linux 就会让init服务负责后续初始化使用的环境的工作。
 
接下来是执行init进程
 
初始化系统环境
启动 init服务时,init服务会读取/etc/initab 文件,根据/etc/inittab中的设置数据进行初始化系统环境的工作,/etc/inittab 定义
init服务在red hat linux启动过程中必须依序执行以下几个script.
/etc/rc.d/rc.sysinit
/etc/rc.d/rc
/etc/rc.d/rc.local
 
由于这些script文件名都是以rc开头的,所以习惯上我们称这些script为 "RC script".每一个RC Script负责的工作都不一样
1./etc/rc.d/rc.sysinit
这个文件主要的功能是设置系统的基本环境,当Init服务执行rc.sysinit时,会执行以下面几项工作
a.启动udev与selinux子系统
udev负责管理/dev/中的所有设备文件,而selinux则可以增强 red hat linux系统的安全性。当rc.sysinit执行时,必须启动这2个子系统,才能进行其他的初始化
系统环境的工作
b.设置内核参数
rc.sysinit会执行sysctl -p ,以便从/etc/sysctl.conf设置redhat linux的内核参数
c.设置系统时间
rc.sysinit会将硬件时间设置成redhat linux的系统时间
d.加载键盘对应表
为了可以使用各式各样的键盘,rc.sysinit也会加载键盘对应表,以便可以正确的输入文字,符号。
e.启用交换内存空间
rc.sysinit会执行swapon -a 命令,以便根据/etc/fstab的设置启用所有的交换内存空间
f.设置主机名
rc.sysinit会根据/etc/sysconfig/network的Hostname参数设置redhat linux的主机名
g,检查并挂载所有的文件系统
rc.sysinit会检查所有需要挂载的文件系统,以确保这些文件系统的完整性,检查完毕后,rc.sysinit就会挂载所有的文件系统
并且将根文件系统的挂载参数修改为可读可写,以便让我们可以在根文件系统上写入数据。
h.初始化硬件设备
red hat linux 除了在启动内核时以静态驱动程序部分的硬件外,在执行rc.sysinit时,也会试着驱动剩余的硬件设备
i.启动软件磁盘阵列与Lvm
rc.sysinit也会启用所有的软件磁盘阵列,以及lvm的磁盘设备
j,如有必要,卸载/initrd/
/initrd/用来挂载内核的初始化内存磁盘的数据,redhat linux可以通过初始化内存磁盘来加载必须的驱动程序,这样才能让red hat linux能在开机前驱动所需的
设备,进而顺利的进行启动的工作
 
因此初始化内存磁盘只有在启用前有用,因此当redhat linux进入这个阶段时,初始化内存磁盘已经没有存在的价值了,所以rc.sysinit会视情况卸除初始化
内存磁盘,以节省更多的内存空间
 
k,初始化串行端口设备
l,清除过期的锁定文件与IPC文件
m,重新设置磁盘参数
 
 
/etc/rc.d/rc
这个脚本是用来建立runlevel的环境
 
/etc/rc.d/rc.local
如果需要在系统启动的过程中执行某些工作,可以通过rc.sysinit,rc这2个脚本文件来定义要执行的工作内容,但这2个文件是启动过程中非常重要的
启动文件,如果,rc.sysinit 或rc有错误的内容,轻则导致系统启动时出现无法预期的错误,严重则可能会造成redhat linux系统根本无法启动。
所以,通常不能对这2个文件进行修改
既然不能修改rc.sysinit,rc,那该如何让redhat linux的系统在启动时执行某些工作呢?此时请使用rc.local
 
rc.local是整个启动过程中唯一可以修改的脚本文件,如果希望在red hat linux启动过程中执行某些命令,或者执行某些工作的话,那么就可以
把这些工作的命令定义在这个文件里,当redhat linux开机并执行到rc.local时,就可以依照所定义的内容,完成系统的初始化工作。