MBR与GPT磁盘分区表


MBR与GPT磁盘分区表(partition table)
磁盘的主要组成有磁盘盘片、机械手臂、磁盘读写磁头以及主轴电机等, 数据的以01二进制方式存放在磁盘盘片的磁道(Track)上。0号磁道在磁盘片最外侧,越靠近轴心,磁道编号越大。 每个磁道又可划分为扇区(Sector),磁盘的读写以为扇区为基本单位,扇区的物理大小为512bytes或4Kbytes。
磁盘结构示意图如下图所示:
linux磁盘组成 图 磁盘盘组成示意图
通常磁盘可能有多个磁盘片,所有磁盘片的同一个磁道组成磁柱(Cylinder),磁柱是传统磁盘分区的最小单位,也就是文件系统的基本单位。 一个分区从开始磁柱开始到结束磁柱结束。 近来有GPT这个可达到64bit纪录功能的分区表, 现在可以使用扇区 (sector)编号来作为分区单位! 所以说,我们就是利用参考对照磁柱或扇区号码的方式来处理啦!也就是说,分区表其实目前有两种格式喔!
0号磁道的第1个扇区就是整个磁盘的第一个扇区,存放着整个磁盘的分区信息和启动程序bootloader! 对磁盘进行分区,读写磁头在读取数据的时候可以减少机械臂的移动,加快数据读写效率。同时也可以方便用户对数据文件进行分类整理。 传统上第一个扇区磁盘分区信息数据格式为MBR(Master Boot Record),所以也经常把第一个扇区称为MBR扇区。 但是由于近年来磁盘的容量不断扩大,MBR无法记录2TB以上容量磁盘的分区信息。 于是就出现了一个新的磁盘分区格式,称为GPT(GUID partition table)! 这两种分区格式与限制不太相同啦!

MBR分区表

回到顶部
其实MBR分区表格式是windows的磁盘分区方式。 早期的Linux系统为了兼容Windows的磁盘,所以使用了支持Windows的MBR(Master Boot Record)格式来存放开机管理程序bootloader和分区表! 开机管理程序bootloader和分区表存放在磁盘的第一个扇区, 这个扇区大小通常是512bytes,旧的磁盘扇区都是512bytes!
第一个扇区512bytes会有这两个数据:
主要启动记录区(Master Boot Record, MBR):存放开机管理程序bootloader,大小为446bytes;
分区表(partition table):记录整个硬盘分区信息,大小为64bytes;
MBR分区表只有64 bytes,所谓的分区操作其实就是设置这64bytes的分区表,通常情况下,分区的最小单位为磁柱(cylinder), 每个分区记录项记录了分区的起始和结束磁柱编号, 一个分区记录项为16字节,最多只能容纳四个分区记录项, 四个分区记录的分区可以是主(Primary)分区,也可以是扩展(Extended)分区。 磁道是磁盘片上的一个圆,一个磁盘片的所有磁道组成一组同心圆。所有磁盘片的磁道组成了一组同心圆柱。相同半径的磁道就是磁柱! 想象一下俯视磁盘片,将磁道展开变成竖着的直线,最外侧的0号磁道线在最左侧,最内侧的磁道线在最右侧。 从左到右就是一条条由高到矮竖立的磁道线,磁道线上按顺序等密度的排列着二进制数0和1。 假设磁道线具备伸缩性,我们将第一条磁道线后面的所有磁道线都拉伸成和第一个磁道线等长,拉伸后的磁道线数据密度和拉伸之前比会变得相对稀疏。 那么磁盘的分区就可以用下面的俯视图表示,注意这是第一个磁盘片变形后的俯视图,后面还有若干个磁盘片: linux磁盘组成 图 2.2.2、磁盘分区表的作用示意图
MBR中64 bytes的记录区段如上图所示,假设上面的硬盘设备文件名为/dev/sda,那么这四个分区在Linux系统中的设备文件名如下所示: P1:/dev/sda1
P2:/dev/sda2
P3:/dev/sda3
P4:/dev/sda4
在磁盘设备文件名的后面接上和分区位置有关的数字!
假设硬盘总共有400个磁柱,分为四个主分区,第一个主分区为1到100号号磁柱,以此类推第四个分区范围为301到400号磁柱。 四个分区在windows操作系统中的就是C, D, E, F盘。读写F盘,其实就是读写磁盘的301~400号磁柱之间的磁道上。
上面这四个分区即可以是主分区,也可以扩展分区!主分区可以直接被格式化为相应的文件系统, 但是扩展分区不可直接被格式化,需要再划分为(logical partition),逻辑分区可以被格式化。 也就是说可以被用户直接操作使用的要么是主分区,要么是逻辑分区,而逻辑分区是从扩展分区划分而来。 扩展分区利用自己的扇区记录更多的逻辑分区信息,简化示意图如下所示: linux磁盘组成 图 磁盘分区表的作用示意图
上图中硬盘的四个分区记录仅使用到两个,P1为主分区,P2为扩展分区。 扩展分区使用额外的扇区来记录分区信息,扩展分区本身不能被格式化。 通过扩展分区所指向的逻辑区块继续作分区的记录。
图中扩展分区又继续分出五个逻辑分区。 逻辑分区是由扩展分区继续分区出来,所以可以使用的磁柱范围就是扩展分区所在的磁柱范围! 也就是图中的101~400。上述分区在Linux系统中的设备文件名分别如下:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
重要注意的是,第一个逻辑分区的设备编号为5,即设备文件名为/dev/sda5,而编号1-4保留给主分区或者扩展分区!
事实上扩展分区并不只占一个区块,而是占用每个逻辑分区最前面的几个扇区来记录分区信息!为了方便记忆理解, 上图经过简化处理! 详细的扩展分区的纪录方式可以参考:
http://en.wikipedia.org/wiki/Extended_boot_record
这里给出MBR详细分区结构图以供参考:
linux磁盘组成 MBR主分区、扩展分区和逻辑分区的特性概念总结如下:
分区是以磁柱为单位的连续磁盘空间; 主分区至少有1个,最多只能有4个, 由于操作系统的限制,扩展分区为0或者1个,主分区和扩展分区的总数不能超过4个。扩展分区无法直接被格式化使用,需要再划分为至少一个逻辑分区。 逻辑分区可以被格式化,作为数据存取的分区为主分区与逻辑分区。
逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘可以达到63个以上的分区限制;
两个连续的主分区可以合并为一个分区,扩展分区中多个连续的逻辑分区也可以合并为一个逻辑分区。 只需要将两个连续的分区删除,然后在重新建立新分区即可,而且不会影响其他分区! 但是如果连续的两个分区,一个是主分区,另一个为扩展分区中的逻辑分区,那么这两个分区是无法合并的。 如果要合并就得将逻辑分区所在的扩展分区删掉,这样就会影响到扩展分区中其他的逻辑分区了!
磁盘数据的读取都需要先经过第一个扇区中的分区记录找到数据文件所在的分区,如果磁盘的第一个扇区损坏, 那么整个硬盘也就坏掉了! 总之如果规划分区在四个以内,磁盘分区的分配可以随意。但是如果规划分区超过四个,一定要有一个扩展分区才可以,而且最好是将扩展分区放在所有主分区的最后。
我们用P(primary)表示主分区,E(extended)表示扩展分区,L(logical)表示逻辑分区。
假设磁盘的设备文件名为/dev/sda,要将一个磁盘分区成6个分区,可以有如下组合:
1.P1+P2+P3+E(L1+L2+L3),六个分区对应的设备文件名为:
P1:/dev/sda1;
P2:/dev/sda2;
P3:/dev/sda3;
E:/dev/sda4;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
2.P1+P2+E(L1+L2+L3+L4),六个分区对应的设备文件名为:
P1:/dev/sda1;
P2:/dev/sda2;
E:/dev/sda3;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
L4:/dev/sda8;
3.P1+E(L1+L2+L3+L4+L5),六个分区对应的设备文件名为:
P1:/dev/sda1;
E:/dev/sda2;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
L4:/dev/sda8;
L5:/dev/sda9;
除了第一个分区必须为主分区外,后面的扩展分区并不一定必须放在最后,例如上面第一个组合方案也可以是这样:
1.P1+E(L1+L2+L3)+P2+P3,六个分区对应的设备文件名为:
P1:/dev/sda1;
E:/dev/sda2;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
P2:/dev/sda3;
P3:/dev/sda4;
2.P1+P2++E(L1+L2+L3)+P3,六个分区对应的设备文件名为:
P1:/dev/sda1;
P2:/dev/sda2;
E:/dev/sda3;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
P3:/dev/sda4;
第二个组合方案也可以这样: 1.P1+E(L1+L2+L3+L4)+P2,六个分区对应的设备文件名为:
P1:/dev/sda1;
E:/dev/sda2;
L1:/dev/sda5;
L2:/dev/sda6;
L3:/dev/sda7;
L4:/dev/sda8;
P2:/dev/sda3;
注意上面设备文件名的变化。当然并不建议将扩展分区放在两个主分区的中间,建议将扩展分区放在所有主分区的最后。
上面各种分区方案所对应的分区设备文件名一定要弄明白,这些都是重难点,一定要掌握! 通过分区将数据分组存放在磁盘的磁柱区间内,增加了数据存储的安全性, 一个分区中的磁道损坏或者数据改变,不会影响到其他分区数据的读写。例如重装系统的时候, 只需要将c盘的数据备份到其他分区,重装系统并不会对其他分区造成影响!
由于分区将数据集中存放在某个磁柱区间内,在读写数据的时候, 读写磁头不需要大幅度的前后移动,大大加快了数据读写的效率。

GPT(GUID partition table)分区表

回到顶部
MBR分区表仅有64bytes,由于MBR分区表的限制,操作系统无法识别2.2T以上的磁盘容量!
MBR仅有一个扇区,没有备份,如果MBR扇区损坏,整个磁盘也就损坏了,数据无法恢复。
MBR扇区扇区仅有512bytes,除了64bytes自己的磁盘分区表,还有446bytes的空间用于存储linux操作系统内核加载程序bootloader。 无法容纳更多的程序代码。
虽然2.2TB磁盘容量限制在早期并不会很严重。 但是,近年来磁盘容量经常就高达好几个TB! 如果使用磁盘阵列的系统,例如用24个4TB磁盘搭建出磁盘阵列,那在Linux底下就会看到有一颗70TB左右的磁盘! 如果使用 MBR 的话...那得要2TB/2TB的割下去,虽然Linux kernel已经可以通过某些机制让磁盘分区高过63个以上, 就得要割出将近40个分区~ 真要命...
为了解决这个问题,就有了GPT磁盘分区格式!
过去一个扇区大小为512bytes,不过目前已经有4K的扇区设计出现! 为了兼容所有的磁盘,GPT将磁盘扇区定义为逻辑区块地址LBA(Logical Block Address)。 GPT将所有LBA(默认为512bytes)从0开始编号,第一个LBA为LBA0。
与MBR仅使用第一个512bytes区块来纪录分区信息不同, GPT使用了最前面的34个LBA区块来纪录磁盘分区信息! 除了前面34个LBA之外,整个磁盘最后的33个LBA被用来作为备份!大大增加的磁盘数据的安全性! GPT分区表的结构示意图如下所示: linux磁盘组成 图 GPT分区表结构示意图
上述图示的解释说明如下:
LBA0(MBR兼容区块)
与MBR模式相似的,这个兼容区块也分为两个部份,一个就是和之前446bytes类似的区块,储存了操作系统加载程序bootloader! 而原本用来存放分区纪录的空间,仅存储这一个特殊标志,表示此磁盘为GPT格式。 不能识别GPT分区表的磁盘管理程序, 就无法识别这颗磁盘,除非用户强制要求处理这颗磁盘,否则该管理软件不能修改此分区信息,进一步保护了磁盘!
LBA1(GPT表头纪录)
这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的GPT分区(就是前面谈到的在最后34个LBA区块)放置的位置, 同时放置了分区表的检验码(CRC32),操作系统可以根据这个检验码来判断GPT是否正确。若有错误, 可以通过这个纪录区获取备份的GPT(磁盘最后的那个备份区块)来恢复GPT的正常运作!
LBA2-33(实际纪录分区信息)
从LBA2区块开始,每个LBA都可以纪录4个分区纪录,默认的情况下,总共可以有4*32=128个分区纪录! 因为每个LBA有512bytes,因此每个纪录用到128bytes的空间,除了每个纪录所需要的标识符与相关的纪录之外, GPT在每个纪录中分别提供了64bits来记录开始和结束扇区号码,因此,GPT分区表对于单一分区来说, 最大容量限制为2^64 * 512bytes = 2^63 * 1Kbytes = 2^33 * 1TB = 8ZB,注意1ZB = 2^30TB! 足够大了
GPT分区默认可以提供多达128个纪录,而Linux本身的内核设备纪录中,针对单一磁盘来说,虽然过去最多只能到达15个分区, 不过由于Linux kernel通过udev等方式的处理,现在Linux也已经没有这个限制在了! 此外,GPT分区没有MBR分区中的主分区、扩展分区和逻辑分区等概念,每个纪录都可以独立存在, 每个都可以视为是主分区! 每一个分区都可以直接拿来格式化使用!
GPT详细硬盘分区结构图如下所示: linux磁盘组成 一直以为内核识别设备的主/次设备号一定是连续的,因此一直没有注意到由于新的机制的关系,分区已经可以突破内核限制的状况!??? 为了验证正确性,网络上有朋友实际拿一颗磁盘分区出130个以上的分区, 结果发现120个以前的分区均可以格式化使用, 但是130之后的似乎不太能够使用了!或许跟默认的GPT共128个号码有关!
虽然新版的Linux大多识别GPT分区表,没办法,我们 server 常常需要比较高容量的磁盘嘛! 不过,传统的老牌磁盘管理工具fdisk并不识别GPT分区格式!要使用GPT的话,需要gdisk或parted磁盘管理工具! 磁盘管理工具参考这里!
另外,开机管理程序bootloader, grub第一版并不识别GPT!grub2以后才识别! 开机管理程序bootloader参考这里!

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读