GPT
2015-06-06 21:14:01 阿炯

全局唯一标识分区表(GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准,简称GPT,使用GUID分区表的磁盘称为GPT磁盘。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2 × 1012字节)的分区,然而一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。

这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为可能。


在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节,这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有64个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。

MBR分区方案不是用得好好的吗,为什么要提出新的方案呢?那就让我们看看MBR分区方案有什么问题。前面已经提到了主分区数目不能超过4个的限制,这是其一,很多时候,4个主分区并不能满足需要;另外最关键的是MBR分区方案无法支持超过2TB容量的磁盘。因为这一方案用4个字节存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算,每个分区最大不能超过2TB。磁盘容量超过2TB以后,分区的起始位置也就无法表示了。在硬盘容量突飞猛进的今天,2TB的限制将很快被突破。由此可见,MBR分区方案已经无法满足需要了,下面介绍GUID分区表方案。

跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于LBA 0,GPT头存储于LBA 1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的LBA 34是硬盘上第一个分区的开始。

苹果公司曾经警告说:“不要假定所有设备的块大小都是512字节。”一些现代的存储设备如固态硬盘可能使用1024字节的块,一些磁光盘(MO)可能使用2048字节的扇区(但是磁光盘通常是不进行分区的)。GUID分区表是源自EFI标准的一种较新的磁盘分区表结构的标准,与普遍使用的主引导记录(MBR)分区方案相比,GPT提供了更加灵活的磁盘分区机制。它具有如下优点:
1、支持2TB以上的大硬盘。

2、每个磁盘的分区个数几乎没有限制。为什么说“几乎”呢?是因为Windows系统最多只允许划分128个分区。不过也完全够用了。

3、分区大小几乎没有限制。又是一个“几乎”。因为它用64位的整数表示扇区号。夸张一点说,一个64位整数能代表的分区大小已经是个“天文数字”了,若干年内你都无法见[1] 到这样大小的硬盘,更不用说分区了。

4、分区表自带备份。在磁盘的首尾部分分别保存了一份相同的分区表。其中一份被破坏后,可以通过另一份恢复。

5、每个分区可以有一个名称(不同于卷标)。

使用英特尔架构的苹果机也使用GPT,为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。


GPT分区表的结构。此例中,每个逻辑块(LBA)为512字节,每个分区的记录为128字节。负数的LBA地址表示从最后的块开始倒数,−1表示最后一个块。做为一款分区软件,DiskGenius从3.1版本开始支持GUID分区表,这是国内第一款支持GUID分区表的分区软件。DiskGenius提供了GUID分区的建立、删除、格式化、已丢失分区恢复、文件恢复、分区表备份、GUID分区表格式与MBR分区表格式之间的相互转换(无误转换)等功能。


MBR 的限制

MBR 分区系统是一个数据结构补丁的大杂烩,用于克服早期的限制。MBR 自身完全驻留在一个硬盘的第一个扇区(512 字节)上。MBR 的前 400 个字节专门用于存储代码:引导装载程序 (boot loader)。 计算机引导时,基本输入/输出系统 (BIOS) 读取并执行这段代码。

在这个代码区域之后,MBR 将数据存储在大约 4 个分区上,这些分区称为主分区。每个分区采用两种方法进行描述:“柱面/磁头/扇区 (CHS)” 标记法和 “逻辑块寻址 (LBA)” 标记法。今天,CHS 标记法几乎成为了老古董,因为它是一个 24 位的数字。这意味着它只限于描述 8GB 大小的磁盘区域。假设一个扇区大小为 512 字节,32 位的 LBA 值支持 2TiB 大小。但是这个 2TiB 上限不太容易突破;因为在 MBR 中没有留下任何未分配的字段,可用于向 LBA 地址添加更多位。

除了这个可见的 2TiB 问题之外,MBR 还有其他困难。主要的困难是 4 个主分区的限制。要克服这个限制,其可能的方法是将一个主分区放到一边,作为一个占位符(称为扩展分区),用于容纳任意数量的附加分区(称为逻辑分区)。然而这是一种笨拙的权宜之计,会导致一些问题。比如安装多个操作系统时,如果过多的操作系统要求自身拥有过多的主分区,就会出现困难。

MBR 还有数据完整性问题。它是一个单一数据结构,容易受到误操作和磁盘故障的损坏。另外由于逻辑分区以一种链接表结构定义,如果一个逻辑分区损坏,就会阻止对其余逻辑分区的访问。这些数据结构都没有任何形式的错误探测功能,因此损坏很难定位。

GPT 解决方案

GPT 定义是 Intel® 为一个 BIOS 替换创建的 Extensible Firmware Interface (EFI) 规范的一部分(参阅 参考资料 获取更多信息的链接)。尽管 GPT 是旨在替代今天大多数计算机上的旧 BIOS 标准的一部分,将 GPT 用在基于 BIOS 的系统上还是有可能的。但是,如果您的计算机已经使用 EFI,这一事实则是采用 GPT 的另一个理由。无论您的计算机使用旧 BIOS 还是 EFI,GPT 都将修复 MBR 的许多限制:

GPT 只使用 LBA,因此,CHS 问题就不复存在。

磁盘指针的大小为 64 位,假设 512 字节扇区,这意味着 GPT 可以处理的磁盘大小最高达 512 x 264 字节(8 zebibytes,即 86 亿 TiB)。GPT 数据结构在磁盘上存储两次:开始和结束各一次。在因事故或坏扇区导致损坏的情况下,这种重复提高了成功恢复的几率。循环冗余检验 (CRC) 值针对关键数据结构而计算,提高了数据崩溃的检测几率。

GPT 将所有分区存储在单个分区表中(带有备份),因此扩展分区或逻辑分区没有存在的必要。GPT 默认支持 128 个分区,当然您也可以更改分区表的大小,如果您的分区软件支持这种更改的话。

虽然 MBR 提供 1 字节分区类型代码,但 GPT 使用一个 16 字节的全局唯一标识符 (GUID) 值来标识分区类型。这使分区类型更不容易冲突。GPT 支持存储人类可读的分区名称。您可以使用这个字段来命名您的/home、/usr、/var 和其他分区,以便它们在分区软件中更容易识别。

磁盘的第一个扇区专用于一个保护性 MBR,它是一个法定 MBR 数据结构,它定义一个单一分区类型 0xEE (EFI GPT)。 在低于 2TiB 磁盘上,这个分区将扩展到整个磁盘;在更大的磁盘上,它的大小应为 2TiB。 这个想法的目的是保护 GPT 磁盘免受不支持 GPT 的磁盘工具损坏。如果这类工具检查磁盘,它们将把磁盘视为没有空闲空间的 MBR 磁盘。

由于 GPT 包含了一个保护性 MBR,一台基于 BIOS 的计算机可以使用存储在这个保护性 MBR 的代码区域的引导装载程序从一个 GPT 磁盘引导,但这个引导装载程序和操作系统必须都支持 GPT(不过一些有缺陷的 BIOS 无法从 GPT 磁盘引导)。 EFI 包含自己的引导装载程序,因此您可以在一个基于 EFI 的系统上从一个 GPT 磁盘引导。

GPT 的主要问题是兼容性:低级别磁盘工具和操作系统必须全部支持 GPT。这种支持对 Linux 相当普遍,尽管您可能需要处理一些细节,并针对低级别磁盘维护更换您使用的部分工具。如果您要多重引导一台计算机,您必须检查所有操作系统的 GPT 支持。

如果您管理许多 Linux 系统,或者如果您打算在不久的将来添加一个超过 2TiB 的磁盘,您可能要考虑采用 GPT 进行一个安装测试。在完全必要时才进行安装测试可以使您事先对 GPT 的特性有关身体验,并了解一些支持 GPT 的 Linux 实用工具的奇怪行为。

利用 MBR 和 GPT 磁盘的组合来运行一个系统,这是有可能实现的。例如可以从 MBR 磁盘引导,但仍然使用 GPT 作为数据磁盘。这样的配置对基于 BIOS 的系统上的 Windows 是最有用的,因为 Windows 无法使用 BIOS 从 GPT 启动,但 Windows Vista 和更高版本的 Microsoft 操作系统可以使用 GPT 数据磁盘。

在 2012 年,所有 Linux 主要发行版均提供了该支持。

实用工具支持


GPT 支持的第三个领域是系统实用工具。Linux 提供三种主要的分区工具系列,均不同程度支持 GPT:

fdisk 系列。这些程序(fdisk、cfdisk 和 sfdisk)是文本模式的工具,可以处理 MBR 和一些更独特的分区表,但它们不能处理 GPT。

GNU Parted (libparted)。GNU Parted 项目提供一个库 (libparted) 和一个文本模式的实用工具 (parted) 进行分区。若干个图形用户界面 (GUI) 实现工具也构建于 libparted 之上。libparted 库可以处理 MBR、GPT 和几种其他分区表类型。

GPT fdisk。该系列(gdisk、cgdisk 和 sgdisk)根据 fdisk 系列进行建模,但可以在 GPT 磁盘上工作。(请注意,我是 GPT fdisk 的作者。)

作为一般性规则,基于 GNU Parted 的工具(尤其是 GParted 或 Palimpsest Disk Utility 等 GUI 工具)易于使用;不过GPT fdisk(特别是 gdisk)可以访问更多 GPT 特性。因此您可能想使用 GParted 或其他 GUI 工具来设置您的磁盘,但使用 GPT fdisk 来微调您的配置或修复 GPT 磁盘的损坏。

GPT 创建工具 GNU Parted 和 GParted 的在本质上都是破坏性的:如果您有一个 MBR 磁盘,使用这些工具将它转换为一个 GPT 磁盘的惟一方法是销毁现有的 MBR 分区。如果您想转换一个现有的 MBR 磁盘,GPT fdisk 在启动时就会自动完成该转换。但是,请记住,该转换使一个 BIOS 引导的磁盘显示为不可引导,除非您重新安装引导装载程序。

文件系统卷和大小限制

文件系统    最大卷大小    最大文件大小
ext2|3     16TiB    2TiB
ext4    1EiB    16TiB
ReiserFS    16TiB    8TiB
JFS    32PiB    4PiB
XFS    16EiB    8EiB
Btrfs    16EiB    16EiB

4KB 磁盘扇区

自 2009 年 12 月起,硬盘制造商开始引入使用 4096 字节扇区的磁盘,而不是常见的 512 字节扇区磁盘。为了操作系统的正常运行,使用固件将 4096 字节物理扇区分成 512 字节逻辑分区,遮掩了这一变化,但是较大物理扇区的使用对磁盘布局和系统性能带来隐患。

如果您熟悉磁盘结构,就知道磁盘是被分解成扇区 的,大小通常是 512 字节;所有读写操作均在成倍大小的扇区中进行。仔细查看,就会发现硬盘事实上在扇区之间包括大量额外数据,这些额外字节由磁盘固件使用,以检测和纠正每个扇区内的错误。随着硬盘变得越来越大,越来越多的数据需要存储在磁盘的每一单位面积上,导致更多低级别错误,从而增加了固件纠错功能的负担。

解决该问题的一个方法是将扇区大小从 512 字节增加为更大的值,以使用功能更强大的纠错算法。这些算法可使每个字节使用较少的数据,从而比使用 512 字节扇区能纠正更多严重问题。因此,更改为较大尺寸的扇区有两个实际好处:提高可靠性且增加磁盘容量,至少从理论上讲是这样。不同于增加的显示器大小或提高的中央处理单元(CPU)速度,对终端用户的现实获益可能没有这么明显。不过专用于奇偶检验的空间减少了,可能加快较大磁盘的引入或提高磁盘可靠性。

遗憾的是,关于 512 字节扇区的假设潜藏在整个软件链中,在基本输入/输出系统(BIOS)、引导装载程序、操作系统内核、文件系统代码和磁盘工具等工具中。尽管向 4096 字节扇区的转变已经酝酿了多年,有些工具仍未做好准备。为帮助实现这种过渡,带 4096 字节分区的第一批磁盘将每个物理 扇区转换成 8 个 512 字节的逻辑 扇区。对于 BIOS、操作系统和所有磁盘工具,磁盘看起来有 512 字节扇区,但实际上底层物理扇区大小是 4096 字节。在固件中改变表面扇区大小会降低性能。要了解个中原因,首先应了解文件系统数据结构以及如何进行磁盘分区。

最新的文件系统使用 4096 字节或更大尺寸的数据结构。因此,大部分磁盘 I/O 操作占用成倍数量的大小。想一下,当 Linux 想在一个带 4096 字节扇区的新磁盘上读写这些数据结构时,会发生什么事情。如果文件系统数据结构正好与底层物理分区大小一致,对 4096 字节数据结构的读写会产生对单一扇区的读写。硬盘的固件不需要做任何特别的事;但是当文件系统数据结构与底层物理扇区不完全一致时,读写操作必须使用两个物理扇区。对于读操作,这基本上不会花费很多额外时间,因为磁盘上的读/写头极可能连续通过两个扇区,且固件可丢弃它不需要的数据。另一方面,对不一致数据结构的写操作需要磁盘的固件首先读取两个扇区,修改两个扇区的分区,然后写两个扇区。该操作所需时间比 4096 字节占用一个扇区时所需时间多。因此,性能下降。

如何判断数据结构是否得到合理对齐? 大多数文件系统将其数据结构与包含其本身的分区开头对齐。因此,如果一个分区起始于一个 4096 字节(8 个扇区)边界,则表示它得到合理对齐。


参考来源

GUID磁碟分割表