前言:
话说,现在买电脑如果预装win8以上的系统,基本上都是GPT。想当年博主买的电脑预装的win8磁盘分区样式就是GPT,而且貌似如果想把win8换win7就得把GPT改成MPR。虽然会在最后提到GPT,不过本文还是主要讲解MBR,并通过实验验证。
机械硬盘:
主引导记录(Master Boot Record,缩写:MBR),又叫主引导扇区。在计算机开机BIOS加点自检结束后,开始按照CMOS中对启动设备的设备顺序检验可用的启动设备时,BIOS将相应启动设备的第一个扇区(也就是MBR扇区)。
虽然固态硬盘市场占有率越来越来高,价格也越来越亲民,不过事实上我们接触较多的大容量磁盘还是机械硬盘,所以在详细介绍MBR之前先简单介绍一些关于机械硬盘的基本概念。
传统的普通硬盘主要由,盘片,磁头,盘片转轴等等一些部分组成。当磁盘选装时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面画出一个圆形轨迹,这些圆形轨迹就叫做磁道。磁盘上的每个磁道被等分为若干弧段,这些弧段就是磁盘的扇区,每个扇区为512个字节。磁盘通常由重叠的一组盘片构成,每个盘面都被划分成数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,就是磁盘的柱面。
磁盘分区
磁盘分区实质上是对硬盘的一种格式化,然后才能使用硬盘保存各种信息。磁盘分区是使用分区编辑器在磁盘上划分几个逻辑部分,盘片一旦划分数个分区,不同类的目录和文件可以存在不团的分区。由于MBR本身的限制,其只能包含4个分区记录,所以我们最多只能建4个主分区,如果想建更多的分区怎么办?那就只能用其中的一个分区记录来建立扩展分区,扩展分区本身是不能使用的,它以逻辑分区的方式来使用,所以说扩展分区可以分成若干逻辑分区。它们的关系是包含关系,所有的逻辑分区都是扩展分区的一部分。在创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称MBR)和引导记录备份的存放位置。主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息。接下来我们就详细介绍下我们的此篇博客的主要东东------MBR
主引导记录(MBR)
盘面上最外侧的柱面就是0号柱面。而我们的主引导扇区就在磁盘上0号柱面0好磁头的1号扇区,它是计算机开机后访问磁盘时所必须要读取的首个扇区。扇区的大小是512字节,主引导扇区开头的446字节内容特指为"主引导记录",主要是用来启动引导程序的引导代码。其后的4个16字节是“磁盘分区表”,最后2个字节为结束标志(55aa)。主引导扇区记录这硬盘本身的相关信息以及硬盘各个分区的大学及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失。后面我们通过演示手动破坏和恢复磁盘分区表,以更深入具体的了解MBR。
在MBR磁盘分区样式中,最多只能有4个主分区,或者3个主分区加一个扩展分区。磁盘的0号扇区就是我们说的MBR一共就512字节,前446字节是主引导程序,接着的64字节是主分区表(DPT)最后的2字节是结束标志。64的主分区表,每16字节保存一个分区表项,所以最多只能是4个主分区。分区表项的第一个字节是引导标志位(80表示活动分区,系统可引导,00表示非活动分区),第2字节表示磁头号,第3字节的高6位表示扇区号,低2位加上第4字节表示柱面号。第5字节表示分区类型(0表示分区未使用,83表示linux)接着第6字节对应结束磁头号,第7字节高6位是结束柱面号,第7字节低2位和第8字节表示柱面号,后面的两个4字节分别是分区起始相对扇区号和分区总的扇区数。MBR标识了4个分区的范围,而扩展分区是如何能创建许多逻辑分区的呢?扩展分区内最多可建多大23个逻辑分区。扩展分区的第0号扇区EBR,有512字节,前446个字节未使用为全0,接着是64位的扩展分区表,第一个16字节的分区表项指向的是逻辑分区1,组成结构同主分区表项一致,第二个16字节的分区表项指向下一个扩展分区表EBR,后面的32字节暂时未使用。所以整个逻辑分区呈线性结构,第一个EBR的第二个分区表项指向第二个EBR,第二个EBR的第二个分区表项指向第三个EBR。。。这就是整个的最初的CHS方案,CHS是cylinder-head-sector(柱面-磁头-扇区),区块必须以硬盘上某个磁柱、磁头、扇区的硬件位置所合成的地址来指定.现代的MBR已经用LBA(逻辑区块地址)替换了早期的CHS寻址方式。
全局唯一标识分区表
在博客的最后简单介绍下全局唯一标识分区表(GUID Partition Table, 缩写:GPT),因为理论上讲MBR最大支持2.2TB的分区,即使是把512字节的扇区提升到4kb的扇区,支持最大的容量达到16TB,也改变不了MBR本身的局限性,所以GPT分区就显得更重要。越是新的技术就越简单,GPT的分区表也是相当简单的,GPT分区表最开头,处于兼容性考虑仍然存储一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。接下来就是分区表头,其中定义了硬盘的可用空间以及组成分区表的项的大学和数量,在使用64位Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。并在硬盘的最后加入了Secondary GPT,是主GPT的一个备份。
实操修改mbr
左边第一列是以8个16进制数表示地址,第一行从0开始,第二行从16开是,第三行从32开始以此类推,前446是引导程序,我们关注的是第接下来的64字节,在第28行,地址为000001b0,以10进制表示就是432,所以第447个字节开始的64个字节就是分区表信息:80 20 21 00 83 dd 1e 3f 00 08 00 00 00 a0 0f 00 00 dd 1f 3f 8e fe ff ff 00 a8 0f 00 00 58 f0 0e 00 。这些全都是16进制的数字,一个16进制的数字占4位,所以两个16进制的数字占8个位,也就是1个字节,则分区表的第一个字节是“80”,80表示这个分区是活动的,系统可引导,00表示非活动分区,其他数字是无效的,“20 21 00”表示分区开始的磁头号为32,开始的扇区号为第二字节的0-6字节,21化成2进制为:00100001,取0-6位是100001对应的10进制为33,,开始的柱面号第2字节的6,7两位加上整个第3字节,即0000000000,对应10进制为0,所以第一分区开始在硬盘上的三维地址为(柱面,磁头,扇区)=(0,32,33);第4个字节表示分区类型,83就是表示linux,接下来的 dd 1e 3f就是分区结束的磁头号,扇区号,和柱面号。"00 08 00 00"表示首扇区的相对扇区号为524288(小端序);"00 a0 0f 00"表示总扇区数为10489600.
我们用lsbk查看我们的分区信息。
然后我们把那64字节的分区表信息清零。不过我们在清零前,需要把mbr的数据备份下来,不然恢复就比较麻烦:
将mbr数据备份到mbr文件中
dd if=/dev/sda of=mbr bs=1 count=512
然后把后面的64字节关于分区表的信息清零:
dd if=/dev/zero of=/dev/sda bs=1 count=64 skip=446 seek=446
此时我们在查看磁盘的分区信息:
此时分区已经不存在了。我们得通过我们刚刚备份的mbr进行恢复:
dd if=mbr of=/dev/sda bs=1 count=64 skip=446 seek=446
以上命令中bs表示操作的大小是1字节,count表示总共操作64个字节,skip,seek是跳过前面的446个字节,处理后面的64的分区表。我的电脑上还有一块新的硬盘,我们把sda的mbr赋值到sdb上会发生什么呢?我们来试一试:
dd if=mbr of=/dev/sdb bs=1 count=512
我们会发下sdb和sda的磁盘主分区信息已经一模一样了,因为mbr中只保存了主分区的分区信息,所以sdb只有两个分区。
我们记得,mbr的最后两位是55aa的结束标志,如果我们将其清零,会发生什么呢?let‘s try!
dd if=/dev/zero of=/dev/sda bs=1 count=2 skip=510 seek=510
此时我们再查看分区信息,就会发现完全没有分区信息。
到此位置,我们就能更清晰的认识mbr的整体结构了~