硬盘分区知识详解如何安装多系统

先我想说明一下我写这篇文档的原因.我很喜欢在各种linux讨论社区里看文档,有一个经常被问及的问题就是:我为什么不能分区了?或者我为什么只能分两个分区? 进去一看,几乎清一色全都是因为不懂得硬盘分区的知识不理解硬盘分区的概念造成的.对于一些非计算机专业的业余linux爱好者来说,这尚可原谅,但是发现身边很多计算机专业出生,学过微机原理,懂得PC结构的朋友也会有这样的问题.每次看到这样的问题,我都会回答一下,但是我不能给每个人回答一次.我的精力有限,而且我的忍受能力也有限,有时候在回答这些一经重复过几十次的问题后,再看到这些问题,心里就忍不住在骂,你他妈的为什么不去看看相关的教材或者上精华区看看呢!!于是我想以比较详悉的方式来介绍一下关于硬盘分区的知识.我将尽量多的插图来解释硬盘的结构以及分区的时候在他上面发生了什么
先我想说明一下我写这篇文档的原因.我很喜欢在各种linux讨论社区里看文档,有一个经常被问及的问题就是:我为什么不能分区了?或者我为什么只能分两个分区? 进去一看,几乎清一色全都是因为不懂得硬盘分区的知识不理解硬盘分区的概念造成的.对于一些非计算机专业的业余linux爱好者来说,这尚可原谅,但是发现身边很多计算机专业出生,学过微机原理,懂得PC结构的朋友也会有这样的问题.每次看到这样的问题,我都会回答一下,但是我不能给每个人回答一次.我的精力有限,而且我的忍受能力也有限,有时候在回答这些一经重复过几十次的问题后,再看到这些问题,心里就忍不住在骂,你他妈的为什么不去看看相关的教材或者上精华区看看呢!!于是我想以比较详悉的方式来介绍一下关于硬盘分区的知识.我将尽量多的插图来解释硬盘的结构以及分区的时候在他上面发生了什么. 
一,一个硬盘只能分四个分区! 
有人看到这个标题可能会嗤之以鼻,他会说:你看,我的硬盘从C盘到N盘,有N个分区.这个家伙井然说一个硬盘只能分四个分区!! 我想告诉这些人,当我还是一个菜鸟的时候,看到这个概念的时候也是这样的反应.但是很快为我的无知感到羞愧. 在PC行业标准中一个硬盘只能分四个分区.这样的四个分区在不同的操作系统中被冠以不同的名称他可能叫partition ,primary partition 或者slice ,但是无论他们怎么叫,这些系统都支持这样的四个分区,都可以识别分区的起始位置和大小等信息.这里我把这样的分区用一个最常用的词来命名:主分区(primary partition).为什么一个硬盘只能分四个主分区呢?这是由个人计算机初期的设计架构决定的.一开始,PC被设计成这样的启动过程,开机时主板BIOS进行自检,当一切OK后,就开始读取硬盘的第一个扇区,一个扇区的大小是512字节,这是计算机工业里的标准,无论什么硬盘,一个扇区的大小都是512字节.BIOS把这512字节的内容读出来并执行.这512字节被叫做MBR(master boot record)主引导记录(有的书籍上说是major boot record) .这512自己包含了硬盘最重要的信息:分区表.由于空间只有区区512字节,所以分区表的大小就有很大限制,他被设计成十分小但是又足够描述硬盘的分区情况.包括分区的开始扇区,结束扇区,引导标志,分区类型等等.每个分区信息用16个字节表示,四个分区就用掉了16X4=64个字节, 
这64个字节分布在MBR的第467-510字节,后面紧接着两个字节AA和55被称为幻数(Magic Number),BOIS读取MBR的时候总是检查最后是不是有这两个幻数,如果没有就被认为是一个没有被分区的硬盘.尽管分区表中明明有数据,也会报错,告诉你系统不存在.所以,对硬盘加密的简单办法就是从MBR中察掉这两个字节.那么这个硬盘挂到任何电脑上都会显示为一个没有分区的空白硬盘.但是只要把这两个字节重新写上,数据又能读出.当然,你得知道怎么重新写上.可用以下的方法验证以上说的知识.(如果没有特别说明,以下操作都在linux和unix类系统下,所有的数字都是16进制.在windows下你可以用debug工具查看这些内容,很多杀毒软件也提供备份MBR的功能,可以利用杀毒软件把MBR取出来,再用16进制编辑器查看.) 


图一,MBR的获取和显示 
在上面的命令中,先用dd命令把hda上的MBR取出来,并以文件名mbr.dat以文件的方式存放在硬盘上.因为mbr不是纯文本文件,你用文本编辑器看的时候看到的是乱码,所以需要一个能把二进制转化为16进制数据输出的工具hexdump .以下是用hexdump输出后的MBR内容.我个人还强烈的推荐使用KDE自带的16进制编辑工具KHEXedit,这个工具十分好用,大家可以试一下.可惜,在写一个文档的时候手头没有这个工具. 




上图中粉红色的就是分区表数据,绿色的就是幻数.可以看到,这块硬盘只分了两个主分区,因为分区表的最后32字节为空.每个分区表条目的第二字节是引导标记,如果这个字节是80,说明这个字节可以引导.上图中的第一行红色数据 0180中的80,表示这是一个可以引导的主分区. 
第二个主分区的引导标记为00(第二行红色数据最后),说明这个主分区不可引导.一个硬盘只能把一个主分区标记为可引导,如果你用某些非常规手段,比如用 dd取出MBR把每个主分区标记为可引导,再用 dd写回去,那么当你用PQ等分区工具分区的时候会报错.值得题一下的是linux的fdisk工具有一个小小的BUG,就是你可以把每个主分区标记为可引导.而一般的分区工具都是不允许的. 另外,每个分区表项的第六字节表示这个分区的类型.可以看到第一个分区的第六字节(第二行红色数据第二段)是83,这是linux分区的分区标识.而第二个分区为0F,这是windows扩展分区的分区标识别. 
利用partitionmagic 隐藏分区的原理就是修改这个字节,使系统不能识别,这样在系统下就看不到该分区了. 
分区条目的其他字节表示分区的开始位置,结束位置,总大小等等.MBR的其余446个字节是一段很小的程序.他的作用就是我将在下面讲的. 
二,操作系统的引导过程. 
系统引导在计算机英语中被称为bootstrap 就是长统靴的靴带,如果你把自己想像成一只掉进一只长统靴子的小老鼠,然后想像你顺着靴子的靴带慢慢从很深靴筒里面爬出来,然后见到了广阔的天空,你就明白了计算机系统引导为说明叫bootstrap,因为计算机系统的引导也是这么一个慢慢爬出来的过程,最后导入整个系统. 
(搞计算机的老外真有想像力). 
首先,BIOS把MBR读出来并放入内存运行,MBR中的前446个字节开始运行,他读取分区表并判断哪个分区是主分区,然后在读取主分区的引导记录,就是某一个主分区的第一个扇区.请注意他和MBR的区别.为了说明方便,我把他称做PBR(partition boot record) ,这个概念是我为了说明方便自创的,在其他文档中是没有的.PMR中也有一段小程序,他负责定位操作系统内核在该主分区上的位置并将内核载入内存运行.因为PMR也只有512字节,他的能力也十分有限,所以通常情况下操作系统内核并不是直接由他引导的,他可能先装入一个系统引导程序到内存运行,然后由系统引导程序把系统内核装入内存.所以在很多引导程序中才有stage1,stage2,stage3的过程,MBR中的前446字节是操作系统在安装的时候装入的,现在的操作系统在安装的时候都会现检查MBR中是否已经存在了引导记录,如果已经有了就问讯是否覆盖.但是有的系统不管三七二十一就直接覆盖掉了,windowsArray8就是这样霸道的系统.这就是为什么有人重装系统后发现不能引导其他系统的原因.以lilo为例,装在MBR中的446字节是lilo引导程序的第一步就是stage1,然后以stage2去引导stage2的程序,stage2引导stage3.这几个stage体积一个比一个大,功能一个比一个强,到最后一个stage的时候他已经有足够的能力引导系统内核,就这样系统内核就被装入内存运行了.注意stage2并不是装在PMR中的,他只在硬盘的某个位置.具体的引导过程因具体的引导工具而略有不同,而基本原理都是一样的,特别是在stage1,都是MBR中的446字节. 
Tip: 你可以用 dd if=/dev/hda1 of=pbr1.dat bs=512 count=1 来获取第一个主分区的内容. 
三,硬盘分区结构 
windows系统总是屏蔽计算机的技术细节,因此用长时间用windows的人都不知道关于硬盘分区的一些基本概念,除了C盘D盘这样的说法,他们对于自己的硬盘知之甚少.通常windows用户的硬盘分区情况如下图: 


图四,一般windows用户的硬盘分区方法 
其中浅蓝色表示整个硬盘,红色表示MBR,绿色表示PBR深蓝色表示主分区,黄色表示扩展分区中的逻辑分区,逻辑分区数据不限定,上图中象征性的画了4个.特别强调一下,windows的扩展分区也是一个主分区,所以这里用蓝色表示.这个主分区在其他操作系统中可被识别,但是却看不到里面的逻辑分区(D盘,E盘...),因为这个概念是windows系统所定义的,不是PC工业标准,linux系统为了和windows系统兼容,也支持这种逻辑分区.但是大部分的操作系统是不认这种分区的,比如freeBSD,上图中的这块硬盘在freeBSD中,就是两个主分区. 
上面的硬盘只用掉了两个主分区,查看MBR中的分区表时分区表最后32个字节都为00.这样的分区方法如果只装windows系统那么一经足够了.如果你要windows+linux那么只能把linux装在逻辑分区中,linux是可以装在逻辑分区中的.通过LILO和GRUB可以将逻辑分区中的系统内核引导.而windows必需装在主分区中,也许有人会疑问:为什么我可以在C盘装windowsArray8在D盘装windowsXP呢?windowsXP不是能装在逻辑分区中吗? Windows系统文件是能装在了逻辑分区,但是启动他所必需的引导文件还是装在C盘这个主分区中的,而且windows的引导程序NTLoader必需是在分区被标记为活动的时候才能装上,这就是为什么你格式化C盘后WindowsXP就不能启动,需要光盘修复的原因.但是假如你分了两个独立主分区,下面那张图那样; 


图五,有两个主分区和一个扩展分区的硬盘 
你先把第一个主分区设置为活动分区,装上windowsArray8,再把第二个主分区设置为活动分区,装上windowsXP,那么这两个系统所需的引导程序都在各自的分区上,互不影响,无论你删除或格式化哪个分区,另一个系统照样完好,只要该系统的分区是活动的,就可以顺利启动,换了其他操作系统也一样(linux freeBSD sco unix等).现在知道主分区的好处明白主分区资源的保贵了吧! 
而图四中的分区方法显然是白白浪费了两个主分区资源.而且因为已经把硬盘空间用完,所以不能再划分出主分区了,除非你把扩展分区缩小腾出空间来,或者把第一个主分区缩小. 
因此,如果你想装多个系统在一个硬盘上的话,最合理的分区方案应该像下面那张图中表示的那样: 


图六,合理的多分区安装系统方案. 
这张图表示的硬盘结构中,分了三个主分区+一个windows扩展分区.然后扩展分区中又有若干个逻辑分区.你可以在主分区中装系统,在逻辑分区中装数据.比如windowsArray8+windowsXP+linux三系统,可以在第一个主分区装linux把该主分区当做linux的根分区,第二个装windowsArray8,第三个装windowsXP,然后把其中几个逻辑分区格式化成FAT文件系统,另外几个格式化成linux的文件系统挂在/home /var /usr /opt等装载点,再选一个作为liunx的swap分区.不过,我要再次强调,在装系统前,一定要把分区设置为活动才能将系统所需的引导程序全部装在该分区上,不受其他系统的影响. 
补充说明:扩展分区并不一定放在最后,放在第一个,第二个,第三个,主分区的位置都是可以的. 
如果你不介意系统和数据混在一齐,你只想在一个硬盘上装四个独立的操作系统,那么也可这样划分你的硬盘: 


图七,具有四个独立主分区的硬盘. 
应该意识到,一个硬盘只能分四个主分区,所以四个主分区的空间大小总合要等于整个硬盘的大小,否则,剩余的硬盘空间将不能被利用,白白浪费掉. 


图八,浪费掉的空间. 
如图八所示,一个硬盘已经有了四个主分区后,剩余的灰色空间将不能在利用(用partition magic 扩展分区大小除外)只能白白浪费.你用分区工具再想再这个区域划分区就会报错,这就是很多人说只能分区2个分区或者分不了区的原因, 
你可以通过一些很变态的方法来使用这块空间.比如,假设空白空间是在硬盘 20G以后 
你可以用以下的方法在第20G以后的空间存放一些非常规数据. 
#dd if=/dev/hda1 of=/dev/hda bs=1M skip=20G 
上面的这条命令把第一个主分区中的所有内容存放在第20G以后的空白硬盘空间上. 
#dd if=/dev/hda of=/dev/hda1 bs=1M seek=20G 
上面的这条命令用于恢复hda1上的数据.这是一种很变态的,很底层的数据备份方法.除非你对硬盘分区知识有足够的了结,而且对自己硬盘分区的结构十分清楚,并精通dd命令的用法.否则千万不要尝试,否则,一个命令就把你硬盘上的数据全毁了. 笔者在用这条命令前也会心惊胆战,反复确认数据才敢按下回车建.初学者千万不要尝试,除非你的硬盘数据没有用. 
四,window和linux支持的分区结构 
windows和linux支持图四图五图六图七的分区机构,即: 
一个主分区+一个扩展区 
二个主分区+一个扩展区 
三个主分区+一个扩展区 
四个独立主分区 
扩展区中可以有任意多个逻辑分区. 
如果你企图分两个或两个以上的扩展区,再在两个扩展区中划分逻辑分区,这在windows和linux中是不允许的,这其实是windows标准,linux为了兼容他,采用了他的标准.如图九这种分区方案在windows和linux中不允许. 


图九,windows和linux中不允许的分区方法. 
但是才另外的一些操作系统中却可以这样做,比如freeBSD就可以用如下的分区方法. 


图十,freeBSD的分区规则 
图中的紫色区域表示freeBSD的逻辑分区,在freeBSD中,主分区被称为slice,逻辑分区被称为partition.他没有主分区和扩展分区的说法,但他可以在每个分区中再划分逻辑分区,也可以不划分而直接用这个主分区.但是在每个主分区中的逻辑分区数据有限,最多只能有八个.而且其中三个有特定用途,真正能用的最多只有五个. 
需要特别题一下:linux也能支持freeBSD的分区方法和文件系统,实事上linux是支持分区种类和文件系统最多的操作系统,几乎所由操作系统的分区格式和文件系统他都支持.但是默认情况下不支持,你需要重新编译内核. 所以,如果你是freeBSD+linux双系统,你可以如图十一这样分. 


图十一,free+linux可用的分区方法. 
即把其中一个主分区划作windows扩展分区.在linux内核中加入对freeBSD分区格式和文件系统支持后,linux就可以访问硬盘上紫色区域的freeBSD分区数据. 
五,多个主分区安装多个系统的例子 
下面笔者以自己硬盘的分区情况向大家展示如何在安装多个系统的情况下对一个硬盘做出最合理的分区方案. 
1,安装的操作系统: 
redhat linuxArray + freeBSD4.10 + Windows 2000 + Solaris Arrayu2 
2,硬盘数目: 
2块IDE硬盘 20G+4.3G 
3,第一块硬盘的分区情况: 


图十二,同时有freeBSD逻辑分区和windows逻辑分区的硬盘 
我在第一个主分区中装linux系统,把他作为linux的根分区,linux的LILO装在MBR.然后在扩展分区中选三个分区分别作为/home /var 和 swap 把一个逻辑分区格式化成NTFS,作为windows 2000的数据盘 
在第二个主分区中装windows 2000系统,当然在装以前千万别忘记先把第二个主分区设置为活动分区,否则windows 2000将无法正常安装. 这样装好的windows 2000系统所以的启动文件和系统文件都在第二个主分区上.是独立的,安全的.任何其他分区损坏都不影响他的完整性.第三个主分区我安装了freeBSD,在这个主分区中又划分了三个分区分别作为freeBSD系统的 / /var 和 swap. 顺便提一下,如果linux的swap分区是一个主分区,那么他可以和freeBSD共用swap.将freeBSD的 
loader装在他所在的主分区上,而不是MBR 
第二块硬盘比较小,采用自动分区的安装的方式装Solaris Array ,在装以前为了第一块硬盘的系统不受影响,先将第一块硬盘断开. 
四个系统全部装完后,启动linux系统,在lilo中添加其他系统: 
other=/dev/hda2 
optional 
label=win2k 
other=/dev/hda3 
optional 
label=freeBSD 
other=/dev/hdb 
optional 
label=Solaris 
map-drive=0x80 
to=0x81 
map-drive=0x81 
to=0x80 
然后重装一下LILO 
#lilo -v 
为了安全起见,我在linux所在的hda1上又安装了一遍LILO,这样即使MBR上的lilo被破坏,我只要把hda1设置为活动分区,照样还能用LILO引导各套系统.如果系统在第二块硬盘上,必需加上 map-drive=0x80 
to=0x81 
map-drive=0x81 
to=0x80 
这四条指令.否则第二块硬盘上的系统将无法用lilo引导. 
为什么用LILO而不用GRUB? 
首先,我很早以前就一直用LILO,对他的语法比较熟悉.习惯了. 
其次,在很多嵌入试场合和非硬盘安装系统的场合,LILO的功能反而比GRUB强大,比如你在U盘上作一个小系统,用LILO的成功率远大于用GRUB的成功率.所以我对LILO有更多的好感. 
以上内容请配合笔者以前写过的文章和 来阅读.这两篇文章都可以在 
www.linuxfans.org论坛初学者版块的精华区找到.

另外图文文章见: 
http://218.80.1Array3.Array2/sitebak/system.html

http://218.80.1Array3.Array2/sitebak/partition.html

请反复阅读并理解这三篇文章的内容,如果你真的理解了这些内容,那么无论你装几套系统,无论系统怎么不能引导无论你的硬盘怎么不能分区,你都能轻松解决.知其然再知其所以然才能达到高手的境界,我也正在向成为真正的高手的方向努力. 

你可能感兴趣的:(linux,windows,活动,扩展,FreeBSD,工具)