Chinaunix首页 | 论坛 | 博客
  • 博客访问: 563610
  • 博文数量: 67
  • 博客积分: 2792
  • 博客等级: 少校
  • 技术积分: 1038
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-13 19:00
文章分类

全部博文(67)

文章存档

2014年(2)

2013年(7)

2012年(1)

2011年(1)

2010年(56)

分类: LINUX

2010-05-11 19:41:59

    我们在启动linux系统的时候经常会看到很多的字符一闪而过,就觉得linux系统的启动过程应该挺复杂、挺神秘的(呵呵,起码我以前就是这么认为的)。其实linux系统的启动过程没我们想像中的那么复杂。下面我们来看看linux系统的启动过程:
一、linux系统的启动过程可以分为5个阶段:
1.BIOS加电自检:
    计算机启动后,首先会进行固件(BIOS)的自检,即所谓的POST(Power On Self Test),然后把保存在MBR(Master Boot Record,主引导记录)中的主引导加载程序放到内存中。
2.加载主引导加载程序(MBR):
    主引导加载程序通过分区表查找活动分区,然后将活动分区的次引导加载程序从设备读入内存中并运行。
3.加载次引导加载程序(GRUB):
    次引导加载程序显示GRUB(GRand Unified Bootloader,GRUB)选择界面,根据用户的选择(就是假如机器上安装了多个操作系统)把相应操作系统的内核映像加载进内存中。
4.Linux内核映像:
    在内核的引导过程中,会加载必要的系统模块,以挂载根文件系统(/),完成后内核会启动init进程,并把引导的控制器交给init进程。
5.init进程:
    init进程会挂载/etc/fstab中设置的所有文件系统,并根据/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体、网络、启动应用程序等。到这个时候linux系统已经启动完毕,用户这个时候就可以登录系统并进行操作。以上就是linux引导的完整过程。下面我们来看一下它们各个步骤的详细信息。
二、BIOS加电自检:
    当我们的计算机启动后,首先会进行BIOS的加电自检,检测计算机的硬件设备,然后按照BIOS设置的顺序搜索处于活动状态并且可以引导的设备。这些引导设备可以是软盘、光驱、USB设备、硬盘或者是网络上的某个设备。我们可以自行设置引导设备的启动顺序(在计算机启动时按“Delete”键进入BIOS,然后选择“Advanced BIOS Features”选项或者“boot”选项中选择“First boot loader”记不太清了应该没错!因为有的BIOS是不同的,有的是“Advanced BIOS Features”选项,而有的直接在“boot”选项中设置就行)。
    我们一般都是从硬盘进行引导的(当然装系统时候一般为CD-ROM),硬盘上的主引导记录(MBR)中保存有引导加载程序。MBR是一个512字节大小的扇区,位于硬盘的第一个扇区中。我们可以使用下列两条命令来查看MBR中的内容。
#dd if=/dev/hda of=mbr.dmp bs=512 count=1然后再执行:
#od -xa mbr.dmp来查看
说明:dd命令会读取硬盘/dev/hda(第一个IDE接口的primary硬盘,当然你要是SATA或SCSI硬盘的话就是"if=/dev/sda”)开始的512字节的内容(也就是MBR),将其写入mbr.dmp文件中。然后使用od命令以ASCII和十六进制格式显示这个文件的内容。然后BIOS会把MBR中的引导加载程序加载到内存中,然后把控制权交给引导加载程序继续系统的启动过程。
三、引导加载程序
    GRUB是RHEL5中默认的引导加载程序,其引导过程又可以分为启动主引导加载程序和次引导加载程序两个阶段。下面我们介绍GRUB在这两个阶段中的启动过程以及GRUB配置文件/boot/grub.conf中的各种选项的使用。
1.引导加载程序的启动
    RHEL5默认安装的引导加载程序是GRUB,是目前最常用的Linux引导加载程序。其引导过程分为两个阶段,第一阶段是保存在MBR中的主引导加载程序的加载。我们上面说过MBR中的主引导加载程序是一个512字节大小的映像,其中包含有机器的二进制代码和一个小分区表。主引导加载程序的任务就是查找并加载保存在硬盘分区上的次引导加载程序,它通过分区表查找活动分区,然后将活动分区的次引导加载程序从设备读入内存中并运行,进入引导加载程序的第二个阶段。
    次引导加载程序也被称为内核加载程序,这个阶段的任务是加载Linux内核。一旦次引导加载程序被加载到内存中后,便会显示GRUB的图形界面,在该界面中用户可以通过上下方向键选择需要加载的操作系统以及它们的内核。如图:

    如果用户不进行选择,那么GRUB会在5秒后自动启动grub.conf文件中设置的默认操作系统。GRUB确定要启动的操作系统后,它就会定位相应内核映像所在的/boot/目录。内核映像文件一般使用以下格式进行命名:
/boot/vmlinuz-<内核版本>
    接下来GRUB会把内核映像加载到内存中。由于内核映像并不是一个可执行的内核,而是经过压缩的内核映像,GRUB需要对内核进行解压,然后加载到内存中并执行。到这个时候,引导加载程序GRUB就完成了它的任务,它会把控制权交给内核映像,由内核继续完成接下来的系统引导工作。
2.GRUB配置:
    GRUB的配置主要通过修改/boot/grub/目录下的grub.conf文件来完成,用户可以通过VI或者在图形界面中使用文件编辑工具打开该文件进行编辑,下面 我以我电脑里的/boot/grub/grub.conf配置文件内容来看看它们各个配置选项的具体说明:

(1). default选项
    default选项用于设置GRUB默认启动的操作系统(如果GRUB中配置了多个操作系统),当超过timeout所设置的时间后用户都没有进行选择的话,那么GRUB自动启动default中所设置的操作系统。在GRUB中计数是由0开始的,0即表示第一个。
(2). timeout选项
    timeout选项设置默认等待的时间,单位为秒。我电脑中设置的值为5秒,超过该时间后如果用户没有作出选择,则系统将自动启动默认的操作系统。用户可以根据自己的需要增大或减小该数值。
(3). splashimage选项
    splashimage选项设置GRUB界面的背景图片,即上面第一个图那个图片,我们可以根据自己的喜好来设置自己喜欢的图片。
(4). hiddenmenu选项
    设置该选项后,GRUB将隐藏操作系统选择菜单,超过timeout选项所设置的时间后,GRUB会自动启动默认操作系统。在此期间内,用户只要按下任意键即可进入操作系统选项菜单,如图:
(5). title选项
    由选项到下一个title选项前的内容都是用于设置同一个操作系统,title选项设置操作系统在GRUB选择菜单中的名称。用户可以根据个人喜好更改这些名称,GRUB选择菜单中的提示信息将会随之而更新。
(6). root (hdx,y)
    设置内核所在磁盘分区。GRUB的硬盘表示方法和Linux是不同的,GRUB是由0开始计数,(hd0,0)则表示第一块硬盘的第一个主分区,而Linux中的表示则是hda1;(hd0,1)表示第一块硬盘的第一个逻辑分区,而Linux中则是hda5,依此类推。
(7). kernel选项
    该选项设置内核文件的名称,Red Hat Linux的内核文件一般存放在/boot/目录下,文件的命名规则为vmlinuz-<版本号>。
四、内核映像
    当用户选择启动Linux操作系统后,GRUB会根据/boot/grub.conf配置文件中所设置的信息,从/boot/所在的分区上读取Linux内核映像,然后把内核映像加载到内存中并把控制权交给Linux内核,Linux内核获得控制权后,将会按以下步骤继续引导系统。
1.内核映像首先会检测系统中的硬件设备,包括内存、CPU、硬盘等,对这些设备进行初始化并配置。
2.由于内核映像是经过压缩的,接下来它要对自身进行解压,同时加载必要的设备驱动。
3.初始化与文件系统相关的虚拟设备,如LVM或者软件RAID等。
4.装载根文件系统(/),把根文件系统挂载到根目录下。
5.完成引导后,Linux内核会在其进程空间内加载init程序,并把控制权交给init进程,由init进程继续来完成接下来的系统引导工作。
RHEL5的内核映像引导过程信息如图:

五、init进程
    init进程是Linux系统所有进程的起点,内核在完成内核引导后,便会加载init进程,其进程号是1,init进程启动后,会初始化操作系统(读取etc/fstab配置文件),并启动特定的运行级别(Runlevel)下的自动运行程序。用户可以通过更改/etc/inittab配置文件或使用图形化配置工具“服务配置”,自定义需要在系统启动时自动运行的服务。如下图:

1.init进程简介
    内核映像在完成引导后,便会启动init进程,init进程对应的执行文件为/sbin/init,它是系统中所有进程的发起者和控制者,所有的进程都是由它所衍生的。如果init进程出现问题,系统中的其他进程也会随之而受影响。由于是系统中第一个运行的进程,所以init进程号(ProcessID,PID)永远是1。由于init进程永远不会被终止,所以系统会在必要的时候以它作为父进程参照对象,除init进程以外的所有进程都会有一个父进程,如果某个进程在它衍生出来的所有子进程结束之前就被终止,就会出现以init进程作为父进程参照的情况。对于那些父进程已被终止的子进程,系统会自动把init进程作为它们的父进程。用户可以执行ps命令查看系统当前的进程列表,应该能看到非常多PPID(父进程号)为1的进程。如图:

    由输出结果可以看到,除init进程自身以外,其余进程的PPID都是1。这些进程有一个部分是直接由init进程派生出来的,也有一部分是由于父进程中止后,以init进程作为父进程参考。
    init进程另一个作用就是初始化操作系统,在进入特定的运行级别(Runlevel)时运行相应的程序,对各种操作系统的各个运行级别进行处理。
2.当init进程获得控制权后,它首先会执行/etc/rc.d/sysinit脚本,根据脚本中的代码配置环境变量、配置网络、启用Swap、检查并挂载文件系统、执行其他系统初始化所必须的步骤等。下图是我电脑里的rc.sysinit配置文件中的内容:
    接下来init进程会执行/etc/inittab脚本中的代码,在这个脚本中定义了Linux系统的运行级别。图上面已经贴过了,这里就不再贴了!
阅读(2942) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~