第二章:使用GUID分区表

GUID分区表(GUID Partition Table——GPT)是现代系统上对硬盘驱动器进行分区的标准。

系统管理员必须了解GPT分区在系统上的显示方式、如何查看它们以及如何创建和管理它们。

使用gpart及其许多子命令来查看、编辑、销毁和滥用(abuse)GPT磁盘分区.

GPT设备节点

每个磁盘分区都有一个设备节点。GPT分区设备节点是它们所构建的GEOM的扩展,由字母p和分区号表示。如果直接在磁盘ada0上创建GPT分区,则第一个分区将是/dev/ada0p1,第二个分区为/dev/ada0p2,依此类推。

大多数系统都有堆叠的(stacked)GEOM设备,分区位于上层设备上。比如一个系统使用STAT RAID,RAID设备是/dev/RAID/r0。分区是/dev/RAID/r0p1、/dev/RAID/r0p2、/dev/RAID/r0p3等等。

也可能在GUID或磁盘ID上有分区,例如/dev/diskid/disk-WD-WCAW3647752p5。

GPT分区在切片(slice)内没有磁盘标签样式(disklabel-style)的从属分区。如果磁盘ada0上有193个GPT分区,它们将显示为设备节点ada0p1到ada0p193。

GPT分区类型

创建GPT分区时,用分区的关键字type标记它。类型表示分区的预期用途。

FreeBSD读取分区类型并根据它们进行操作,所以一定要正确分配它们。

scheme说明磁盘是如何分区的。type适用于在方案中创建的分区表。

分区类型是GUID,128位字符串。FreeBSD用前导感叹号标记分区类型,比如 !516e7cb4-6ecf-11d6-8ff8-00022d09712b。这些分区类型在所有操作系统中都很常见,但FreeBSD也为明显敌视人类的分区类型提供了人类友好的名称。参考gpart手册获取详细信息。

FreeBSD系统上常见的分区类型有:

下面这些GPT分区类型不建议在FreeBSD中使用,但可以从其他操作系统引入的磁盘上找到它们:

参考gpart手册获取FreeBSD支持的完整的分区类型。

查看GPT分区

使用gpart show查看所有磁盘上所有GPT和MBR分区的简要摘要。

将GEOM的名称作为参数,以便仅查看该磁盘上的分区。

以下示例是磁盘标签为DISK-WD-WCAW36477352的分区情况:

第一列给出分区中的第一个块,第二列给出分区的大小(以块为单位),第三列是GEOM或分区索引。第四列是分区类型和容量。

第一行,第一个分区起自34号扇区,填充了19亿多个扇区,第三个字段显示磁盘标签,整个磁盘大小为932GB。

第二行,填充了6个扇区。没有分区号。这个磁盘有512字节的扇区,分区按4KB扇区对齐,在这种情况下,浪费了3KB来适应文件系统对齐。

第三行,开始于40扇区,这是第一个实际的分区,分区编号是1。从扇区号40开始,占用了216个扇区。分区类型是freebsd-boot。此分区为引导代码保留,引导代码可视为连接BIOS和FreeBSD内核的软件。

第四行,是一个交换空间。起始于256号扇区,包含16777216个扇区。分区编号为2,类型为freebsd-swap,分配了8GB容量。

第五行,是一个FreeBSD-ZFS文件系统,开始于16777472号扇区,包含了一大堆扇区。分区编号为3,类型为freebsd-zfs,分配了924GB容量。

磁盘的最后,还有7个扇区的空余。同样,将分区与4K扇区对齐会浪费几个字节的空间。

查看完整分区名称

默认情况下,gpart命令显示每个分区的编号,使用-p选项可以显示完整的设备名称:

每个分区都以磁盘上的标签命名,并在后面添加p1、p2、p3、p4。

其他GPT 视图

某些分区类型允许标记分区。

-l选项可查看分区的标签(label)而不是分区类型

-r选项可查看每个分区的GUID

使用gpart list命令可以查看GPT分区的更详细信息。输出结果与glabel list或其他GEOM类命令非常相似。

GEOM 枯萎(withering)

这一节是机翻,没看明白

运行glabel list命令显示标签DISK-WD-WCAW36477352在磁盘ada1上。让我们查看一下这个磁盘上的分区:

磁盘没有消失,但标签ada1会消失。

No such geom: ada1这个错误提示具有误导性。GEOM ada1存在并有分区,却无法以该名称访问它们。

GEOM可以通过三种方式打开设备:读、写、独占(exclusively)。

前两个不言而喻,第三个是特殊的。

geom上的exclusive lock(独占锁)意味着内核的其他部分和其他程序都无法访问该geom。

在声明独占访问之前,可以通过磁盘的任何名称和标签访问磁盘。一旦通过其中一个标签声明独占访问权限,未使用的标签会枯萎(wither)。内核会删除这些标签,使其不可用且不可见。

在磁盘上安装分区需要独占访问磁盘。

对该分区的所有访问都必须通过挂载点进行。

考虑我们的示例磁盘,可作为/dev/diskid/disk-WD-WCAW36477352、/dev/ada1和/dev/gptid/00c392c6-777b-11e3-ab3f-002590dbd594获得。glabel(8)命令显示此磁盘有三个分区:一个用于引导代码,一个用于交换空间,另一个用于ZFS。假设您使用diskid激活交换空间分区。

激活交换空间需要磁盘上的独占锁。FreeBSD现在通过磁盘ID引用此磁盘,并且仅通过磁盘ID。内核会删除GPT ID和原始设备名称的设备节点。它们从/dev中消失了。

一旦删除了设备上的所有独占锁,内核就会删除其他设备名称。如果我停用该交换空间而不在该磁盘上装载任何其他分区,GPT ID和原始设备名称将重新出现。

在一个拥有大量FreeBSD系统的大型组织中,我建议选择一个单一的磁盘标签标准并坚持下去。我不喜欢听到“我没有接触乔治的系统,他通过GUID ID挂载所有分区,这让我感到颞动脉炎。”任何你不使用的东西都会让人感到困惑。选择一个标准,并禁用不使用的标签类型。请参阅本章后面的“禁用GUID ID和磁盘ID标签”。

禁用GUID ID和磁盘ID标签可能是有意义的,并要求系统使用管理员创建的GPT标签标识所有分区。GPT标签当然是最容易阅读的,但你必须自己创建它们。

磁盘分区

对磁盘进行分区包括从磁盘中删除任何旧分区,为磁盘分配分区方案,以及创建所需的新分区。

擦除磁盘

安装新磁盘之前,应擦除新磁盘上的所有分区。可使用gpart destroy删除GPT信息:

如果磁盘上没有分区,命令会立即返回成功的信息。若返回“device busy”则意味着磁盘上有分区。可以用gpart delete命令来删除磁盘上的分区,或者使用-F选项强制清除磁盘上的所有东西。

分配分区方案

在磁盘上创建文件系统之前,必须将基本分区信息放在磁盘上。这标识了你在磁盘上使用的分区类型,如MBR或GPT。

在gpart create命令上使用-s选项指定分区方案:

使用gpart show命令可以核查磁盘已经准备接收分区:

以上显示磁盘已经分配了GPT方案,但没有分区。这个磁盘有932GB的可用空间。

创建分区

分区磁盘很容易:描述你想要的分区,创建它们,然后开始。

棘手的部分是与您创建的分区共存。在创建任何分区之前,应先决定如何处理磁盘。有多少空间,以及希望在哥哥分区中有多少空间。建议在开始之前卸下想要的东西。

本节实验用的磁盘容量略低于1TB,计划按以下方案对其进行分区:

我们将根据每个分区的预期用途为其添加标签。

使用gpart命令创建每个分区。-t选项指定分区格式;-s选项指定分区尺寸,-l选项分配GPT标签。

创建的分区是从磁盘的开头开始,并向外进行,所以必须先创建启动分区:

使用gpart show命令查看效果。-l选项可以显示GPT标签:

1号分区的标签是boot,它有512KB空间。

现在添加交换分区:

-a 1m表示创建此分区时按照1MB为增量对齐这个分区。一兆字节是512B和4KB的整数倍,因此无论扇区多大,物理扇区斗鱼分区相匹配。它还在磁盘的开头留出了一小部分额外的空间,以便在必要时可以安装稍大的引导块或第三方引导加载程序。

在创建剩余分区时,保持1MB对齐:

创建最后一个分区时,如果不指定分区大小,gpart将把剩余空间都分配给它:

接下来使用-l选项查看包含分区标签的磁盘分区信息:

现在我们有了完整的分区,准备接收操作系统。

调整分区大小

使用gpart resize命令可以更改分区的尺寸。必须知道要更改尺寸的分区的号码。

查看gpart show的输出结果,/usr的分区号是6。使用-i选项和分区号告诉gpart要调整哪个分区:

-s选项分配新的分区大小为100GB,必须使用-a 1m来保持扇区大小。

现在磁盘分区看起来像这样:

现在我们有了714GB空间,可以创建/home分区。

删除分区

如果我改变主意,决定/var分区只需要50GB,这将为用户文件提供额外的50GB空间。

我调整了5号分区的大小,最后得到了如下的分区:

我有了50GB的自由空间,它位于/var和/usr之间。我像把它附加到磁盘的最后一个分区/home里面。

可以使用一堆命令来调整各分区的大小和位置,但删除并重建/usr和/home会更容易一些。

任何时候,接触分区都有丢失数据的风险。但重新排列分区肯定会破坏数据。在继续操作之前一定要备份数据。

使用gpart delete的-i选项指定要删除的分区号:

现在有一大块连续的空间,可以根据需要重新创建分区。

编辑分区

使用gpart modify命令可以更改分区的类型或标签。用-i指定分区号。-l指定新的GPT标签。

以下示例更改磁盘vtbd0的分区2的GPT标签:

类似的,修改分区类型:

这个磁盘现在认为分区2被称为rootfs,分配了freebsd-zfs类型。

GEOM标签

使用glabel label命令可以给GPT分区分配GEOM标签。

还有一个create命令,但用create创建的标签是临时的,系统重启后会消失。

以下操作为da1p1分配一个encrypted1的标签:

现在可以使用标签访问和配置此设备。设备节点位于/dev/label目录中。

注意:glabel创建的GEOM标签与gpart生成的GPT标签不同、

GEOM标签是GEOM特有的功能,而GPT标签更通用。GPT标签显示在/dev/GPT中。

PMBR 和 Boot Loader

较旧的硬件无法识别GPT分区表,它们只能识别MBR分区表。

FreeBSD使用保护性MBR(protective MBR——PMBR)为旧硬件提供可识别的分区表,并帮助该硬件引导GPT分区磁盘。用GPT格式化的可引导磁盘需要一个PMBR和一个引导加载程序。使用gpart bootcode命令安装它们。

FreeBSD包含一个PMBR作为/boot/PMBR和一个GPT引导加载程序作为/boot/gptboot。

使用-b标志命名分区文件。以下命令安装MBR:

只能识别MBR分区的工具现在会看到这个磁盘有有一个GPT类型的大分区。

我们磁盘上的分区1的类型是freebsd-boot。需要将GPT引导代码/boot/gptboot安装到该分区。不能使用cp命令将文件复制到该分区。gptboot分区上没有文件系统,BIOS在任何情况下都不知道如何读取文件系统。

相再次使用gpart bootcode命令,这次使用-p选项给出一个引导代码文件,直接写入分区。

现在磁盘可以从UFS文件系统启动了。我们将在第四章创建文件系统。

另,以上两个步骤可以组合成一条命令(用于UFS系统):

或(用于ZFS系统):

UEFI Boot Loader

FreeBSD10.1和更高版本可以直接从UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)amd64硬件启动,而无需BIOS模拟。

UEFI查找efi类型的分区。EFI分区实际上是一个具有特定目录层次结构的FAT文件系统。此分区需要为800KB或更大。一旦有了这个分区,用dd命令将/boot/boot1.efifat(从FreeBSD13.0开始已经没有这个文件了)复制到它上面:

为UFS对磁盘的其余部分进行分区,并安装到该分区。FreeBSD现在可以从UEFI分区启动了。

(第十一章讨论自定义安装)

扩展磁盘

如果你扩展一个虚拟磁盘,会发现gpart抱怨磁盘的GPT无效。

GPT和GEOM将信息存储在磁盘的一个和最后一个扇区中。如果移动磁盘的末尾,最后一个扇区将丢失此信息。使用gpart recover创建新的最后一个扇区元数据扇区:

这将在新扩展的虚拟磁盘末尾创建一个新的元数据扇区,留下创建新分区或扩展文件系统的空间。