2023年11月25日发(作者:)
安装系统的时候涉及到MBR和GPT,现在也贴上来,供以后复习使用。
MBR 和 GPT 的问题已经走到了非常现实的阶段-3T硬盘开始普及。MBR 由于对 3T 硬盘寻址无法支持,
终于要开始被弃用了。但仅仅只是“开始”,我感觉至少10年之内 MBR 还不会消失。恐怕当GPT适应不
了需求的时候,MBR才会消失。
一、MBR 的失误
说“失误”牵强了一点。我们不能要求当年只有5M的硬盘就扣出2M来放寻址信息。计算机永远比你想象的
要发展的快。
首先你要有一些基本的硬盘的MBR知识,如果你不熟悉,可以先在 wiki 看一看硬盘的基本结构。
在了解了磁道、柱面、扇区之后,再看下面的 MBR 结构就很了然了:
基本MBR结构
偏移量(位置)
(within sector)
长度
(in bytes)
解释
引导程序
十进制十六进制
000 – 445000 – 1BD
446 – 5091BE – 1FD
510 – 5111FE – 1FF
446
64
2
主
分区表
引导记录
表 1.
MBR 永远占用了第一个扇区,通常为512bytes大小。在这512bytes中被MBR本身的程序用去了446bytes。
于是,真正描述分区信息的就只有 64 bytes。而根据4个主分区的设计,每一个分区能用到的只有 16bytes.
那么!这16bytes是如何工作的?
16-byte 分区表结构
Relative
Offsets
(within entry)
0
1 – 3
4
5 – 7
8 – 11
长度
(bytes)
1
3
1
3
4
内容
引导标记 (80h = active)
CHS 开始位置
分区类型
描述
CHS 结束位置
启始扇区
12 – 15
表 2.
4
分区大小 (扇区单位)
在表2中,有2个“开始位置”,我们分开理解。
硬盘的历史过程中,第一个遇到的问题就是 8G 瓶颈。这就是因为在 CHS 描述方式中,描述起点和终点
均为3个 byte。我们假设是 FF FF FF ,所以是 16*16*16*16*16*16*512=8589934592 这就是 8G 瓶
颈的由来了。
但是今天 CHS 方式几乎已经不用了。后面还有 4 个 bytes 的“启始” 是给 LPA 方式用的。他的极限就
是 8589934592 * 256 =22 这就是 2T 的限制由来了。
在硬盘容量的历史中,有很多因素决定了它的限制。BIOS,ATA(IDE),文件系统。百度上的这篇文章
简单的介绍了各个阶段的限制。
二、GPT 的思路
GPT (GUID Partition Table)属于 EFI 方案中的一部分。虽然很早就开始制定这个标准,但到今天,还
是有很多系统不支持 GPT。
首先,引用一张wikipedia上的结构图,来了解一下 GPT 的基本结构。
GPT 为了兼容 MBR,LBA 0 依旧保留了MBR的结构。在GPT工作是,会优先读取 GPT (LBA1) 内容。
如果没有 GPT 内容,则认为这是一块MBR磁盘。再从LBA 0 读取MBR。
在硬盘末尾,GPT 备份了一份,这样当GPT出错时,可以快速的从硬盘末尾恢复。LBA -1 (负1) 表示倒
数第一块 LBA。
从LBA 2 到 LBA 33 ,一共预留了 128 个分区表空间。 GPT 支持在一块硬盘上创建 128 个分区(真
有这种需求?)。所以每一个分区可以使用 128 bytes 的空间。
来看一看 LBA 1 的结构吧,有了 512bytes 的巨型空间,都用不掉了。
08字节签名(”EFI PART”, 45 46 49 20 50 41 52 54)
84字节修订(比如,1.0,值是 00 00 01 00)
124字节分区表头的大小(单位是字节,通常是92字节,即 5C 00 00 00)
164字节分区表头前3项(第0-15字节)的CRC32校验,如果值正在计算,则是 0
204字节保留,必须是 0
248字节当前LBA(这个分区表头的位置)
328字节备份LBA(备份分区表头的位置)
408字节第一个可用于分区的LBA(主分区表的最后一个LBA + 1)
488字节最后一个可用于分区的LBA(备份分区表的最后一个LBA − 1)
5616字节硬盘GUID(在类UNIX系统中也叫UUID)
728字节分区表项的起始LBA(对于主分区表来说,这个值是 LBA 2)
804字节分区表的数量
844字节一个分区表的大小(通常是128)
884字节分区串行的CRC32校验
92*保留,剩余的字节必须是0(对于512字节LBA的硬盘即是420个字节)
此表来源为 中文 Wikipedia, 稍微修改了两个字,便于理解。
通过这张表,程序可以获知分区数量,第一个分区在哪个位置,以及GPT头是否正确(CRC32)。在这
里着重解决的是分数数量问题,以及分区表的安全性问题。而分区的大小问题,则依赖了 GPT 的分区表:
016字节分区类型GUID
1616字节分区GUID
328字节起始LBA(小端序)
408字节末尾LBA
488字节属性标签(如:60表示“只读”)
5672字节分区名(可以包括36个UTF-16(小端序)字符)
重点就在这里了,在描述分区位置的时候,使用了8个字节,其最大值为 FF FF FF FF FF FF FF FF 。
那么,假设每一个LBA 为512 bytes。其能描述的大小为 8589934592 TB = 8 ZB 。关于这个数字我算下
来的确是在 ZB 级别的。但是搜索到的文章说法不一:
突破2TB限制 3TB硬盘装操作系统实战 9.4ZB (GPT分区表采用8个字节即64bit来存储扇区数,因此
它最大可支持264个扇区。)
关于windows server 2003最大支持硬盘容量的问题 18EB
对于上面这些数字,18EB 恐怕是 LBA 数量,忘记乘 512 bytes 了。9.4ZB 暂时不知道是怎么来的。但
这个数字暂且不做定论。因为微软的 FAQ 也提到了,这只是理论值,谁知道下一个瓶颈在哪里呢。
Q. How big can a GPT disk be?
A. In theory, a GPT disk can be up to 2^64 logical blocks in length. Logical blocks are commonly 512
bytes in size.
The maximum partition (and disk) size is a function of the operating system version. Windows XP and the
original release of Windows Server 2003 have a limit of 2TB per physical disk, including all partitions. For


发布评论