内容


通过 GPT 和 Linux 充分利用大型驱动器

准备在未来磁盘存储中使用 GUID Partition Table

Comments

在开始寻找您的硬盘分区模式替代方法之前,最好回顾一下迫使这种变化出现的限制。理解这些限制(和克服这些限制的建议工具)将使您能够对应该以多快的速度从主引导记录 (MBR) 跳到 GUID Partition Table (GPT) 做出判断。如果新磁盘采购任务迫在眉睫并且您正在考虑采用 GPT,那么这一点尤为重要。 即使在较小的磁盘上,GPT 也比 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 支持存储人类可读的分区名称。您可以使用这个字段来命名您的 Linux® /home、/usr、/var 和其他分区,以便它们在分区软件中更容易识别。

磁盘的第一个扇区专用于一个保护性 MBR,它是一个法定 MBR 数据结构,它定义一个单一分区类型 0xEE (EFI GPT)。 在低于 2TiB 磁盘上,这个分区将扩展到整个磁盘;在更大的磁盘上,它的大小应为 2TiB。 这个想法的目的是保护 GPT 磁盘免受不支持 GPT 的磁盘工具损坏。如果这类工具检查磁盘,它们将把磁盘视为没有空闲空间的 MBR 磁盘。(有的磁盘工具能够创建一个混合 MBR,除 EFI GPT 分区外,这个混合 MBR 将最多定义三个 MBR 分区。 这个想法的目的是使一个不支持 GPT 的操作系统,比如,Windows® 的大多数预览版 Windows Vista®,与 GPT 分区在一个磁盘上共存。然而,这个配置显然是非标准的,杂乱的)。

由于 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 数据磁盘。

使用 GPT

有三类主要的软件都需要 GPT 支持:内核、引导装载程序和低级别磁盘实用工具。如果您使用 GPT 是因为正在创建一个非常大的独立磁盘冗余阵列 (RAID),那么可能要检查文件系统是否支持超大磁盘。

注意:如果您正在从头开始安装 Linux 并想使用 GPT,您的安装程序必须在所有这三个类别的软件中都提供 GPT 支持。在 2012 年,所有 Linux 主要发行版均提供了该支持。

内核支持

Linux 内核必须提供 GPT 支持,以便对磁盘分区上的数据提供访问。幸运的是,长久以来,Linux 一直包含这种支持。如果您要编译自己的内核,确保选中 Enable the Block Layer 配置区域的 Partition Types 区域中的 EFI GUID Partition Support 选项,如 图 1 所示。(该菜单项通常位于 File Systems 下,如果您想获得较旧版本的内核,请查看该位置。)

图 1. Linux 内核提供 GPT 支持,但在编译一个新的内核时必须启用 GPT 支持
内核配置:选择 Enable the Block Layer, Partition Types, EFI GUID Partition Support
内核配置:选择 Enable the Block Layer, Partition Types, EFI GUID Partition Support

如果您没有编译自己的内核,那么就要看您的发行版提供商是否启用了这个支持。 幸运的是,大多数发行版提供商都启用了 GPT 支持。如果您不确定,您可以使用一个支持 GPT 的分区工具在一个测试硬盘上建立 GPT 分区。如果 Linux 能够识别这些分区,那么您的内核就是正确配置的。

引导装载程序支持

GPT 的引导装载程序是多样的,取决于计算机上的固件类型。在 BIOS 下,只有 Grand Unified Bootloader (GRUB) 2 正式支持 GPT。目前大多数 Linux 发行版使用 GRUB 2 作为默认引导装载程序,但有些版本继续使用较旧的 GRUB Legacy。GRUB Legacy 并没有正式支持 GPT,但包含 GPT 支持的补丁版本现已上市。更古老的 Linux Loader (LILO) 没有明确支持 GPT,但其磁盘寻址方法以扇区位置为基础,所以它往往是可用的(在实践中)。

如果您在一台基于 BIOS 的计算机上使用 GRUB 2,请务必创建一个 BIOS Boot Partition,它保存 GRUB 第二个阶段的代码。(该分区被标识为在 GNU Parted 下面设置自己的 bios_grub 标志,或者被标识为 gdisk 下面的类型 EF02。)BIOS Boot Partition 在某些配置中可能小至 32KiB,但它有时必须稍大一点。鉴于现代分区校准策略,1 MiB 大小是常见的。

如果您的计算机使用 EFI,任何支持 EFI 的引导装载程序都将使用 GPT;但 Linux 的 EFI 引导装载程序选择很棘手。截至 2012 年中期,一些引导装载程序仍然不可靠,或者说有系统特定的怪事。根据我的经验,Linux 内核的 EFI 存根装载程序(在 3.3.0 内核中引入)是最可靠的,其次是 EFI LILO (ELILO),这是 Fedora 所使用的大量补丁过的 GRUB Legacy 版本,最后是 GRUB 2。除了引导装载程序,您可能还需要一个单独的引导管理器,以实现操作系统选择,如果您采用双重引导,并使用内核的 EFI 存根装载程序或 ELILO 来引导 Linux,则尤其需要引导管理器。这项任务的两个常见选择是 rEFIt 和 rEFInd,后者是前者最新的分支。(请注意我保持 rEFInd。)请参阅 参考资料 获取所有这些程序的相关链接。

EFI 要求有 EFI System Partition (ESP) 进行引导。(Mac 对此规则有些例外,但它们附带了定义的 ESP。)ESP 应该包含一个 FAT32 文件系统。EFI 标准没有指定大小,不过大小介于 100MiB 到 500MiB 之间通常效果很好。如果您使用 Linux 内核的 EFI 存根装载程序或 ELILO,您可能需要将内核存储在 ESP 上,建议将 ESP 创建为上限大小。

实用工具支持

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

  • fdisk 系列。这些程序(fdiskcfdisksfdisk)是文本模式的工具,可以处理 MBR 和一些更独特的分区表,但它们不能处理 GPT。
  • GNU Parted (libparted)。GNU Parted 项目提供一个库 (libparted) 和一个文本模式的实用工具 (parted) 进行分区。若干个图形用户界面 (GUI) 实现工具也构建于 libparted 之上。libparted 库可以处理 MBR、GPT 和几种其他分区表类型。
  • GPT fdisk该系列(gdiskcgdisksgdisk)根据 fdisk 系列进行建模,但可以在 GPT 磁盘上工作。(请注意,我是 GPT fdisk 的作者。)

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

如果您想使用 GNU Parted 在磁盘上创建新的 GPT 分区,您应该启动程序,然后使用它的 mklabel 命令,如 清单 1 所示。

清单 1. 使用 GNU Parted 创建 GPT 磁盘分区
# parted /dev/sdd
GNU Parted 3.1
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel
New disk label type? gpt
(parted)

此时,您可以使用 GNU Parted 的 mkpart 命令开始创建分区,或者以别的方式操作分区。该过程类似于用 parted 管理 MBR 分区,只需一点修改。例如,不需要指定一种分区类型为主分区或逻辑分区;但您可以为分区输入一个名称。

使用 gdisk 类似于使用 fdisk。在空白磁盘上启动程序,创建一个新的 GPT,如 清单 2 所示。

清单 2. 使用 gdisk 创建 GPT 磁盘分区
# gdisk /dev/sdd
GPT fdisk (gdisk) version 0.8.4

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help):

用于创建和操作分区的 gdisk 命令类似于在 fdisk 中使用的那些命令,如使用 n 创建一个分区。由于在 GPT 磁盘上使用 parted,不需要将分区指定为主分区、扩展分区或逻辑分区。在 gdisk 中的类型代码以 MBR 类型代码为基础,但要乘以 0x100,例如,一个 Linux 交换分区在 MBR 中是类型 0x82,在 gdisk 中是 0x8200。您可以用 c 命令设置分区名称,也可以执行更多高级操作,详见 gdisk 的主页和在线文档。

无论您使用 parted 还是 gdisk,在完成操作时,您都可以使用普通的 Linux 文件系统管理工具(如 mkfs)在磁盘上创建文件系统。您也可以创建像在 MBR 磁盘上一样多的逻辑卷管理和 RAID 配置。

如果您喜欢 GUI 工具,可以选择 Gnome Partition Editor (GParted)。单击 Device > Create Partition Table 创建一个新的 GPT 数据结构。单击 Advanced,然后从 Select new partition table type 列表中选择 gpt,如 图 2 所示。单击 Apply 创建新的 GPT 数据结构。然后可以像操作一个 MBR 磁盘一样创建新的分区。

图 2. 在 GNOME Partition Editor 中创建 GPT 分区时必须明确设置 GPT 标签类型
GParted 标签创建对话框
GParted 标签创建对话框

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

Linux 采用了少量 MBR 分区类型代码(比如 0x820x83)来识别它的 MBR 分区。也有类似的 GUID 代码识别 Linux GPT 分区。一个重要的说明是,Linux 和 Windows 对它们的数据分区历来使用相同的 GUID。因此,仅从它们的分区表 GUID 区分 Linux 分区和 NTFS 文件系统或 FAT 分区是不可能的。这在只有 Linux 的系统上并不重要,但如果您在一个基于 EFI 的计算机上双重引导 Windows 和 Linux,或者如果您在一个可移动磁盘上创建 Linux 分区,并在 Windows 中使用该移动磁盘,结果是您的 Linux 分区在 Windows 中显示为未初始化的分区,而 Windows 会在您尝试访问这些分区时问您是否要格式化分区。您可以在 gdisk 中通过为您的 Linux 分区提供一个 gdisk 类型代码 8300 修正该问题。将来,libparted 应该支持这个新的类型代码,但截至 libparted 版本 3.1,它尚未实现。

大型文件系统支持

如果您切换到 GPT 是因为正在使用一个非常大的 RAID 配置,那么可能要检查在您部署的文件系统中是否支持大型文件系统。表 1 总结了这些限制。(注意,分区选项不同,有些值也会不同)。 这些值中的一部分相当大,可能使用不熟悉的后缀,例如,1TiB 是 1024GiB,1 pebibyte (PiB) 是 1024TiB,1 exbibyte (EiB) 是 1024 petabytes,还有 1 zebibyte 是 1024PiB。

表 1. 文件系统卷和大小限制
文件系统最大卷大小最大文件大小
第二扩展文件系统 (ext2) 和第三扩展文件系统 (ext3) 16TiB2TiB
第四扩展文件系统 (ext4)1EiB16TiB
ReiserFS16TiB8TiB
日志文件系统 (JFS)32PiB4PiB
XFS16EiB8EiB
B-tree 文件系统(Btrfs 尚在开发)16EiB16EiB

除了文件大小和卷大小限制外,还有文件系统性能差异。这个主题非常复杂,因此,您可能需要咨询某些专家,他们运行的安装程序应与您正在计划的安装程序类似。

GPT 分区建议

GPT 分区可能会产生一些特殊问题,特别是您的计算机使用 EFI 或在一个多重引导环境中运行时:

  • 如前所述,在任何引导磁盘上,EFI 都需要一个 ESP。
  • 同样如些所述,如果您打算从一台基于 BIOS 的计算机上的 GPT 进行引导,您应该创建一个 BIOS Boot Partition。
  • 许多 GPT 分区工具在每个分区后面创建 128MiB 左右的空间(ESP 不适用这个规则)。这个规则是为了使磁盘工具可以使用这个空间来帮助完成它们的任务。
  • 在 Mac OS X 系统上,创建的分区的大小是 4KiB 的倍数(通常是 8 个扇区)。这个特性与 HFS Plus 文件系统有关,大多数现代 Macs 都使用该文件系统。

您可以遵循这些规则,也可以对它们置之不理,这完全取决于您自己的判断。Linux 很灵活,即使您不理睬这些规则,它也不会出现问题,除非您的计算机需要一个 ESP 或 BIOS Boot Partition 来引导。

另一个规则并不是 GPT 特定的规则,但它对于自 2010 年年初开始生产的大部分大容量磁盘很重要:这些磁盘使用 4KiB 物理扇区,但 512 字节的逻辑扇区。如果分区与物理扇区边界不一致,这种差异会导致潜在的严重性能问题。自 2010 年年底发布的分区工具一般能够很好地处理这个问题,但如果您在使用较旧版本的工具,请务以创建正确匹配的分区。

结束语

由于较旧的 MBR 的大小限制,GPT 将成为硬盘分区的标准。 幸运的是,Linux 对这种转变做好了充分准备。尽管 Linux 用户可能不得不放弃某些工具(例如 fdisk),但其他可用工具(例如,libparted 和 GPT fdisk)可以取代它们。理解这些要求将帮助您在时机到来时轻松地实现转变。您需要设置内核配置、引导装载程序配置,以及用于创建和管理分区的实用工具。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=421410
ArticleTitle=通过 GPT 和 Linux 充分利用大型驱动器
publish-date=08072012