早期的 Linux 系统为了兼容于 Windows 的磁碟,因此使用的是支援 Windows 的 MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分割表!而开机管理程序纪录区与分割表则通通放在磁碟的第一个磁区, 这个磁区通常是 512bytes 的大小 (旧的磁碟磁区都是 512bytes 喔!),所以说,第一个磁区 512bytes 会有这两个资料:
上图中我们假设硬盘只有400个磁柱,共分割成为四个分割槽,第四个分割槽所在为第301到400号磁柱的范围。 当你的作业系统为Windows时,那么第一到第四个分割槽的代号应该就是C, D, E, F。当你有资料要写入F槽时, 你的资料会被写入这颗磁碟的301~400号磁柱之间的意思。
由于分割表就只有64 bytes而已,最多只能容纳四笔分割的记录, 这四个分割的记录被称为主要(Primary)或延伸(Extended)分割槽。 根据上面的图示与说明,我们可以得到几个重点信息:
既然分割表只有记录四组资料的空间,那么是否代表我一颗硬盘最多只能分割出四个分割槽?当然不是啦!有经验的朋友都知道, 你可以将一颗硬盘分割成十个以上的分割槽的!那又是如何达到的呢?在
Windows/Linux系统中, 我们是透过刚刚谈到的延伸分割(Extended)的方式来处理的啦!延伸分割的想法是: 既然第一个磁区所在的分割表只能记录四笔资料, 那我可否利用额外的磁区来记录更多的分割信息?实际上图示有点像底下这样:
实际上延伸分割并不是只占一个区块,而是会分布在每个分割槽的最前面几个磁区来记载分割信息的!上图只是简化演示。
在上图当中,我们知道硬盘的四个分割记录区仅使用到两个,P1为主要分割,而P2则为延伸分割。请注意, 延伸分割的目的是使用额外的磁区来记录分割信息,延伸分割本身并不能被拿来格式化。 然后我们可以透过延伸分割所指向的那个区块继续作分割的记录。
如上图右下方那个区块有继续分割出五个分割槽, 这五个由延伸分割继续切出来的分割槽,就被称为逻辑分割槽(logical partition)。 同时注意一下,由于逻辑分割槽是由延伸分割继续分割出来的,所以他可以使用的磁柱范围就是延伸分割所设定的范围喔! 也就是图中的101~400啦!
MBR 主要分割、延伸分割与逻辑分割的特性我们作个简单的定义囉:
- 主要分割与延伸分割最多可以有四笔(硬盘的限制)
- 延伸分割最多只能有一个(作业系统的限制)
- 逻辑分割是由延伸分割持续切割出来的分割槽;
- 能够被格式化后,作为资料存取的分割槽为主要分割与逻辑分割。延伸分割无法格式化;
- 逻辑分割的数量依作业系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的分割限制;
因为过去一个磁区大小就是 512bytes 而已,不过目前已经有 4K 的磁区设计出现!为了兼容于所有的磁碟,因此在磁区的定义上面, 大多会使用所谓的逻辑区块位址(Logical Block Address, LBA)来处理。GPT 将磁碟所有区块以此 LBA(预设为 512bytes 喔!) 来规划,而第一个 LBA 称为 LBA0 (从 0 开始编号)。
与 MBR 仅使用第一个 512bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分割信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个 LBA 之外,整个磁碟的最后 33 个 LBA 也拿来作为另一个备份!这样或许会比较安全些吧!详细的结构有点像底下的模样:
上述图示的解释说明如下:
1) LBA0 (MBR 兼容区块)
与 MBR 模式相似的,这个兼容区块也分为两个部份,一个就是跟之前 446 bytes 相似的区块,储存了第一阶段的开机管理程序! 而在原本的分割表的纪录区内,这个兼容模式仅放入一个特殊标志的分割,用来表示此磁碟为 GPT 格式之意。而不懂 GPT 分割表的磁碟管理程序, 就不会认识这颗磁碟,除非用户有特别要求要处理这颗磁碟,否则该管理软件不能修改此分割信息,进一步保护了此磁碟喔!
2) LBA1 (GPT 表头纪录)
这个部份纪录了分割表本身的位置与大小,同时纪录了备份用的 GPT 分割 (就是前面谈到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分割表的检验机制码 (CRC32),作业系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以透过这个纪录区来取得备份的 GPT(磁碟最后的那个备份区块) 来恢复 GPT 的正常运作!
3) LBA2-33 (实际纪录分割信息处)
从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分割纪录,所以在预设的情况下,总共可以有 4*32 = 128 笔分割纪录喔!因为每个 LBA 有 512bytes,因此每笔纪录用到 128 bytes 的空间,除了每笔纪录所需要的识别码与相关的纪录之外,GPT 在每笔纪录中分别提供了 64bits 来记载开始/结束的磁区号码,因此,GPT 分割表对于单一分割槽来说, 他的最大容量限制就会在『 264 * 512bytes = 263 * 1Kbytes = 233*TB = 8 ZB 』,要注意 1ZB = 230TB 啦! 你说有没有够大了?
所以,GPT 分割已经没有所谓的主、延伸、逻辑分割的概念,既然每笔纪录都可以独立存在, 当然每个都可以视为是主分割!每一个分割都可以拿来格式化使用喔!
虽然新版的 Linux 大多认识了 GPT 分割表,没办法,我们 server 常常需要比较高容量的磁碟嘛!不过,在磁碟管理工具上面, fdisk 这个老牌的软件并不认识 GPT 喔!要使用 GPT 的话,得要操作类似 gdisk 或者是 parted 指令才行!这部份我们会在第二篇再来谈一谈。 另外,开机管理程序方面, grub 第一版并不认识 GPT 喔!得要 grub2 以后才会认识的!开机管理程序这部份则第五篇再来谈喔!
并不是所有的作业系统都可以读取到 GPT 的磁碟分割格式喔!同时,也不是所有的硬件都可以支援 GPT 格式喔!是否能够读写 GPT 格式又与开机的检测程序有关!
(1)MBR分割表只能管理不大于2TB的磁盘,而GPT的分割表可以管理高达8ZB的容量。
(2)MBR最多只能有4个主分区,一旦想要更多的分区,则需要将MBR中一个主分割表作为延伸分割表来使用,而且这延伸分割表还是不能格式化的……总之,显得非常麻烦。而在GPT下,所有的分割都可以视为主分割,可以分出多达128个分区。
(3)MBR下,分割和启动数据只保存在一个区域,MBR(Master Boot Record, 主要开机纪录区),一旦MBR被重写或者损坏,整个系统都会崩溃。在GPT下,却保存着多个这些关键数据的备份,在稳定性上更胜一筹。