10、硬盘分区相关知识_悸失

来源:百度文库 编辑:神马文学网 时间:2024/05/01 03:22:50
、硬盘分区相关知识2007-12-05 21:41 一,一个硬盘只能分四个分区!

有人看到这个标题可能会嗤之以鼻,他会说:你看,我的硬盘从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的第447-510字节,后面紧接着两个字节AA和55被称为幻数(Magic Number),BOIS读取MBR的时候总是检查最后是不是有这两个幻数,如果没有就被认为是一个没有被分区的硬盘.尽管分区表中明明有数据,也会报错,告诉你系统不存在.所以,对硬盘加密的简单办法就是从MBR中察掉这两个字节.那么这个硬盘挂到任何电脑上都会显示为一个没有分区的空白硬盘.但是只要把这两个字节重新写上,数据又能读出.当然,你得知道怎么重新写上.可用以下的方法验证以上说的知识.(如果没有特别说明,以下操作都在linux和unix类系统下,所有的数字都是16进制.在windows下你可以用debug工具查看这些内容,很多杀毒软件也提供备份MBR的功能,可以利用杀毒软件把MBR取出来,再用16进制编辑器查看.)

0000000 48eb d090 00bc fb7c 0750 1f50 befc 7c1b
0000010 1bbf 5006 b957 01e5 a4f3 bdcb 07be 04b1
0000020 6e38 7c00 7509 8313 10c5 f4e2 18cd f58b
0000030 c683 4910 1974 2c38 f674 b5a0 b407 0203
0000040 0080 8000 6d6a 0400 0800 eafa 7c50 0000
0000050 c031 d88e d08e 00bc fb20 40a0 3c7c 74ff
0000060 8802 52c2 76be e87d 0134 c2f6 7480 b454
0000070 bb41 55aa 13cd 525a 4972 fb81 aa55 4375
0000080 41a0 847c 75c0 8305 01e1 3774 8b66 104c
0000090 05be c67c ff44 6601 1e8b 7c44 04c7 0010
00000a0 44c7 0102 6600 5c89 c708 0644 7000 3166
00000b0 89c0 0444 8966 0c44 42b4 13cd 0572 00bb
00000c0 eb70 b47d cd08 7313 f60a 80c2 840f 00f3
00000d0 8de9 be00 7c05 44c6 00ff 3166 88c0 40f0
00000e0 8966 0444 d231 ca88 e2c1 8802 88e8 40f4
00000f0 4489 3108 88c0 c0d0 02e8 8966 6604 44a1
0000100 667c d231 f766 8834 0a54 3166 66d2 74f7
0000110 8804 0b54 4489 3b0c 0844 3c7d 548a c00d
0000120 06e2 4c8a fe0a 08c1 8ad1 0c6c 8a5a 0b74
0000130 00bb 8e70 31c3 b8db 0201 13cd 2a72 c38c
0000140 068e 7c48 1e60 00b9 8e01 31db 31f6 fcff
0000150 a5f3 611f 26ff 7c42 7cbe e87d 0040 0eeb
0000160 81be e87d 0038 06eb 8bbe e87d 0030 90be
0000170 e87d 002a feeb 5247 4255 0020 6547 6d6f
0000180 4800 7261 2064 6944 6b73 5200 6165 0064
0000190 4520 7272 726f bb00 0001 0eb4 10cd 3cac
00001a0 7500 c3f4 0000 0000 0000 0000 0000 0000
00001b0 0000 0000 0000 0000 9467 9467 0000 0180
00001c0 0001 fe83 8cbf 003f 0000 120e 00a0 0000
00001d0 8d81 fe0f ffff 124d 00a0 7a78 0409 0000
00001e0 0000 0000 0000 0000 0000 0000 0000 0000
00001f0 0000 0000 0000 0000 0000 0000
0000 aa55
0000200



图一,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中是否已经存在了引导记录,如果已经有了就问讯是否覆盖.但是有的系统不管三七二十一就直接覆盖掉了,windows98就是这样霸道的系统.这就是为什么有人重装系统后发现不能引导其他系统的原因.以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盘装windows98在D盘装windowsXP呢?windowsXP不是能装在逻辑分区中吗? Windows系统文件是能装在了逻辑分区,但是启动他所必需的引导文件还是装在C盘这个主分区中的,而且windows的引导程序NTLoader必需是在分区被标记为活动的时候才能装上,这就是为什么你格式化C盘后WindowsXP就不能启动,需要光盘修复的原因.但是假如你分了两个独立主分区,下面那张图那样;

图五,有两个主分区和一个扩展分区的硬盘

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

因此,如果你想装多个系统在一个硬盘上的话,最合理的分区方案应该像下面那张图中表示的那样:

图六,合理的多分区安装系统方案.

这张图表示的硬盘结构中,分了三个主分区+一个windows扩展分区.然后扩展分区中又有若干个逻辑分区.你可以在主分区中装系统,在逻辑分区中装数据.比如windows98+windowsXP+linux三系统,可以在第一个主分区装linux把该主分区当做linux的根分区,第二个装windows98,第三个装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 linux9 + freeBSD4.10 + Windows 2000 + Solaris 9u2

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 9 ,在装以前为了第一块硬盘的系统不受影响,先将第一块硬盘断开.

四个系统全部装完后,启动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://gucuiwen.512j.com/linux/system.html

http://gucuiwen.512j.com/linux/partition.html

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

bobyang 写到:
有点疑问, 你列出的MBR是你的机器的吗? 怎么没有分区激活标志(80)呢?

列出的mbr是我公司的机器的,我自己的机器不是这样的.
因为公司的机器是以前别人分的区,所以我没有改.反正不是我的电脑,随他去了.

把分区设置为活动有很多方法.

所有的分区软件都有这个功能.
windows的 fdisk
linux的 fdisk
diskgenius
partition magic 等都可以设置.
win2k XP的磁盘管理里面可以设置.

以前在机器上安装solaris,只给它一个分区(主)怎么也过不去。因为4个分区已经用完了,后来只好在vmware上,发现它还需要/boot。但我始终觉得只需要一个 / 就行了。楼主有什么看法?

我也不太清除,我装solaris和SCO unix 都是用我的小硬盘装的,独立用一个硬盘,不和其他系统共存一个硬盘. 我对这些系统的了解还非常少,只停留在会装,会敲基本unix命令的地步.因此安装比较谨慎,买了一个4.3G的小盘独立装.

发表于: 2002-07-04, 11:33pm 发表主题: 扫盲行动之三:LINUX的目录树

--------------------------------------------------------------------------------

/bin bin是binary的缩写。这个目录是对UNIX系统习惯的沿袭,存放着使用者最经常使用的命令。例如:cp,ls,cat。
/boot 这里存放的是启动LINUX时使用的一些核心文件。
/dev dev是device(设备)的缩写。这个目录下是所有LINUX的外部设备,其功能类似DOS下的.sys和Win下的.vxd。在LINUX中设备和文件是用同种方法访问的。例如:/dev/hda代表第一个物理IDE硬盘。
/etc 这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/home 用户的主目录,比如说有个用户叫wang,那他的主目录就是/home/wang也可以用~wang表示,说到这里,打个岔,你现应该明白在我们访问一些个人网页(如http://www.netease.net/~zhangjia)的时候,~zhangjia就是表示访问www.netease.net站点中的用户zhangjia的用户主目录。
如果这个网站的操作系统是LINUX,那就是表示/home/zhangjia。
/lib 这个目录里存放着系统最基本的动态链接共享库,其作用类似于Windows里的.dll文件。几乎所有的应用程序都需要用到这些共享库。
/lost+found 这个目录平时是空的,当系统不正常关机后,这里就成了一些无家可归的文件的避难所。对了,有点类似于DOS下的.chk文件。
/mnt 这个目录是空的,系统提供这个目录是让用户临时挂载别的文件系统。
/proc 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘上而是在内存里啊!?
/root 系统管理员,也叫作超级权限者的用户主目录。当然系统的拥有者,总要有些特权啊!
/sbin s就是Super User的意思,也就是说这里存放的是一些系统管理员使用的系统管理程序。
/tmp 这个目录不用说,一定是用来存放一些临时文件的地方了。
/usr 这是个最庞大的目录,我们要用到的很多应用程序和文件几乎都存放在这个目录下。具体来说:
/usr/X11R6 存放X-Windows的目录;
/usr/bin 存放着许多应用程序;
/usr/sbin 给超级用户使用的一些管理程序就放在这;
/usr/doc 这就是LINUX文档的大本营;
/usr/include LINUX下开发和编译应用程序需要的头文件,在这找;
/usr/lib 存放一些常用的动态链接共享库和静态档案库;
/usr/local 这是提供给一般用户的/usr目录,在这安装软件最适合;
/usr/man man是什么,对了是帮助。这里就是帮助文档目录啊!
/usr/src LINUX开放的源代码,就存在这个目录,爱好者们别放过哦!
/var 这个目录中存放着那些不断在扩充着的东西,为了保持/usr的相对稳定,那些经常被修改的目录可以放在这个目录下,实际上许多系统管理员都是这样干的。顺带说一下系统的日志文件就在/var/log目录中。
这里列出了最常见的目录,根据LINUX发行套件的不同,目录结构也是有一定差别的。还有你自己建立的目录,我当然不知是存什么的。希望上面的文字能使你在大脑里留下了LINUX的全景图,以便大家深入掌握LINUX的其它方方面面