分类:
2009-06-02 16:04:58
一、磁盘的简介
磁盘指的是硬盘、软盘、U盘、光盘等等这种类型的设备。对每个类型磁盘,都有MBR,和分区来组织这个磁盘。按照标准,每个磁盘可以有最多4各主分区,1个扩展分区,在这个扩展分区上,可以有多个逻辑分区。每个分区的第一个扇区是用来存放特别的信息,比如引导加载程序,而不用来存放文件等信息(每个分区的第一个扇区无法通过文件系统来访问)。注意MBR不属于任何分区。MBR除了存放引导加载程序,还在后64个字节中存放这个磁盘的分区表。
二、引导加载程序
引导加载程序的作用就是用来专门加载操作系统。在pc环境中,系统开机,控制权交给BIOS,BIOS进行自检后,按照CMOS的设置的顺序来搜索处于活动状态并可引导的第一个设备,并
把这个设备的MBR放入指定位置(0xFFFF0)的内存。然后BIOS把控制权交给MBR(即BIOS最后从0xFFFF0的位置开始运行)。MBR上面存放的就是引导加载程序。由引导加载程序来来加载指定的操作系统运行。
问题:有人会问,为什么不把操作系统的开始代码部分放在MBR上,开机不就可以直接可以运行操作系统了吗?这个问题,理论上是可行,但实际上不行。最大的问题是,如果这样做的话,系统开机后,就只能运行这个操作系统,而没有选择的权利来指定加载希望运行的操作系统了。
下面就是BIOS自检并加载引导加载程序的示意图
BIOS自检
使用BIOS自身的post代码进行
加电自检(POST),对硬件进行检测
把BIOS自身的中断服务程序代码放入
指定位置的内存中,为操作系统提供服务
按照CMOS的设置的顺序来搜索处于
活动状态并可引导的第一个磁盘
加载选择的磁盘的MBR,放入指定位置(0xFFFF0)的内存
引导加载程序
操作系统
Call 0xFFFF0
就是BIOS把控制权交给MBR
引导加载程序有很多种,在linux中,就有lilo,grub等
三、 引导加载程序-grub
(1)、当指定磁盘上的MBR中的grub运行后,
(系统开机肯定是先运行指定磁盘上的MBR上的grub),必须先找它的配置文件,(这个配置文件里面存放的比如在要在某个磁盘上的某个分区上寻找内核文件,等等信息。),所以在安装grub的时候(也就是把grub代码放到某磁盘上的MBR或某磁盘上的某分区上的第一个扇区,这些都是人为在安装的时候可以指定的),要把配置文件的位置也要打包进grub中。(问题:有人会问:为什么不把配置文件在安装的时候也打包进grub中呢?如果这样做:一是MBR或分区的第一各扇区无法容纳grub,二是无法在很方便修改配置文件,因以把配置文件固定在上面了,如果要这样做,只有在修改配置文件后在重新安装grub)。由于配置文件是放在某个磁盘某个分区,因此grub通过打包进的配置文件的位置信息去读这个配置文件,必须要有读写这个磁盘的分区的文件系统支持代码,还要读写这个磁盘的驱动程序。所以在安装grub的时候
指定从某磁盘某个分区读配置文件的三个信息要打包(读配置文件的位置、访问这个磁盘这个分区的文件系统支持代码,注意:其他分区的文件系统支持代码不比打包,还有就访问这个磁盘的驱动程序),通过一下方式就可以知道这点:
Mkfs.ext3 /dev/sda1
Mount /dev/sda1 /mnt/usb
Grub-install –root-direcotry =/mnt/usb /dev/hdc
1, –root-direcotry:指定grub运行的时候从/dev/sda1上面读取配置文件。
说明: (1) 配置文件的位置:/dev/sda1标示符号已经打包进grub中。
(2) 这个磁盘这个分区是ext3格式, 因此访问这个磁盘这个分区的文件系统支持代码,ext3也被打包进grub中
(3) 访问这个磁盘的驱动程序dir=/dev/sda。也被打包进grub中
2,/dev/hdc 表示要把grub安装道/dev/hdc 即第一个IED硬盘的mbr上面.
可以看出来,这个grub运行的时候,它会通过驱动程序/dev/sda、配置文件的位置/dev/sda1,这个分区的文件系统支持代码,就一个读取这个分区上的配置文件。
(2)、某设备某分区的第一个扇区的grub
最开支必须通过MBR上的grub来加载其他设备某分区的第一个扇区的grub。
(3),grub读取其他设备的某一分区的配置文件
Grub要读取其他设备的某一分区的配置文件,显然和上面介绍的一样,必须在要有这个这个设备的驱动程序、要读写这个设备的某一分区的文件系统的支持代码。而位置就没有必要存在,因为可以在grub运行的时候指定。
对于这个设备的驱动程序,是在安装grub的时候打包进grub中的。一是通过上面的方法,指定要读取的配置文件的位置,让安装程序自动把驱动程序打包,二是在grub可能要读取某个设备,但是配置文件的位置不指定在这个设备上面。这种情况,规定是在devcie.map中指定这个设备就可以了,看下面的例子
Device.map
Hd0=/dev/hdc
Hd1=/dev/sda
Mount
/dev/hdc6 /
/dev/hdc6为EXT2
Grub-install /dev/hdc
说明: (1) 配置文件的位置:/dev/sda6标示符号已经打包进grub中。
(2) 这个磁盘这个分区是ext2格式, 因此访问这个磁盘这个分区的文件系统支持代码,ext2也被打包进grub中
(3) 访问这个磁盘的驱动程序dir=/dev/sdC。也被打包进grub中
(4) 同时由于device.map中存在hd1=/dev/sda,表示也也要把/dev/sda的驱动程序打包
可以看道,不懂磁盘的驱动程序可以同时被打包进grub中,这样就可能无法放入1个扇区中,因此grub中可以分出2各段 stage1 ,stage2 也就是这个原因。
当这个grub运行的时候,可能需要访问/dev/sda3的文件,你发现没有,/dev/sda的驱动存在,子设备号也存在,(通过指定,在grub中是同过hdx来指定的,其实它可以改变只要和devvice.map中的就可以了。),但是访问/dev/sda3的文件系统支持代码在哪里?其实,在安装grub的时候已经把所有可能的文件支持代码放入和设备文件在一起的目录中,(当然在安装grub的时候没有把所有文件支持代码打包,也是为让grub小)。当要读区、/dev/sda3的时候,grub先从设备文件所在目录中加载/dev/sda3文件系统支持代码。然后在访问。应此下面就是grub的系统结构图
grub
这个磁盘某个分区的文件系统支持代码驱动程序
这个磁盘某个分区的文件系统支持代码驱动程序
这个磁盘的驱动程序
通过bios
Grub加载某个分区grub
Grub运行
根据打包这个磁盘某个分区的文件系统支持代码
打包的这个磁盘的驱动程序
打包的这个磁盘的设备号(和某个分区一一对应)
来加载这个这个磁盘的这个分区配置文件信息
Grub运行成功
Grub要读取其他设备其他分区的文件信息
Grub-install
得到main-min
通过main-min对比内部的设备
如果成功,看自己内部是否存在对应设备的驱动
如果存在,通过main-min找对应文件系统支持代码
Device.map
在同一个目录下
Device.map
或安装指定
如果成功,就得到这个设备这个分区的文件信息
(四)、总结
Grub有两种运行方式:
第一种为加载grub运行,这种是在加载某设备的MBR上的grub,或某设备某分区第一个扇区的grub运行,在这种方式下,必须要加载配置文件,因此必须要把这个配置文件所在磁盘的驱动;配置文件在这个磁盘的分区号(子设备号);访问这个分区的文件系统支持代码打包进grub中。这些通常是在grub安装的时候完成的。
第二种grub已经运行成功,但可能要读取其他设备某分区的配置文件,在这种方式下,必须要把这个配置文件所在磁盘的驱动打包(安装grub指定);配置文件在这个磁盘的分区号(子设备号)(运行指定);访问这个分区的文件系统支持代码可以通过加载这个grub的时候读取配置文件所在的目录下寻找需要的支持代码。
注意:但可能要读取其他设备某分区的配置文件,是通过MAIN-MIN来指定的,比如hd1,hd2,实际上,grub通过指定的MAIN-MIN,来对比device.map(加载这个grub的时候读取配置文件所在同一目录下),来找到真实的设备符号 ,比如
MAIN-MIN 为 root (hd1,0),(MAIN=HD1,MIN=0)指定个grub, grub,通过devic.map来找对应的内部设备号比如dev.map中有 hd1 /dev/sda., grub就知道是访问 /dev/sda1的文件,而这个设备驱动是在安装grub的时候已经打包,root (hd1,0)就是访问 /dev/sda1,而反问这个分区的文件系统的支持代码通过加载这个grub的时候读取配置文件所在的目录下寻找。当这上面的几个都成功,就加载成功,否者就提示错误。
Faq:
1Grub-install中的–root-direcotry是指定grub从哪个地方读取配置文件,问题如果这个地方本身就没有这个配置文件怎么办?其实在Grub-install,它发现这个地方没有配置文件,将从grub包中提取这些文件,放在这个地方,grub包从那里来,从grub源代码编译而来嘛!!!
2磁盘一定要设置活动分区标志
为什么,不知道
3,还有配置文件所在分区的大小及在磁盘柱面的位置,因不同bios不同,比如u盘,一般要求不大于512M。
难道仅指存放在mbr上的grub所读取文件分区的大小,还是所有?这要试验才知道。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/vpxiroot/archive/2009/03/26/4025619.aspx