第十章:磁盘、分区、GEOM

系统管理员如何强调管理磁盘和文件系统的重要性都不为过。(继续吧,尽量强调一下。我等着。)你的磁盘包含你的数据,因此可靠性和灵活性对操作系统至关重要。FreeBSD支持多种文件系统,并有许多不同的处理方式。在本章中,我们将考虑每个系统管理员执行的最常见的磁盘任务。

首先,让我们讨论一下关于存储设备需要记住的最重要的事情。

磁盘撒谎

曾几何时,系统管理员可以根据磁盘提供的信息对其做出决定。您可以插入硬盘并查询其盘片、柱面、扇区等的数量。那些日子已经过去很久了。是的,您可以执行相同的查询并获得答案,但这些答案并不反映任何现实。如今,磁盘是一个神奇的盒子,可以根据请求吐出数据。其中一些魔法盒里装着旋转的盘子。其他盒子缺少活动部件。魔术盒提供了用于存储比特和字节的编号扇区。这些数字和盒子里的东西之间的关系是什么?这就是魔法:难以捉摸,不可知(inscrutable and unknowable)。

在之前的书中,包括这本书的早期版本,我讨论过在磁盘上正确放置数据的重要性,但所有这些知识都已经完全过时了。如果你仍然保留着这些知识,那就放弃它,转而使用更有用的东西,比如经典《神秘博士》(Doctor Who)中所有演员的完整传记。

就磁盘设计而言,您只需要知道逻辑块寻址(logical block addressing —— LBA)。磁盘上的每个扇区都被分配了一个数字。文件系统按编号调用磁盘扇区。就是这样。LBA之下的任何事情都是你的猜测。

不幸的是,磁盘现在有了一类新的谎言:扇区大小。

直到1990s年代,磁盘扇区大小从128字节到2KB不等。即使是最初的IBM PC也能理解软盘上的不同扇区大小。

然而,在21世纪初,制造商决定采用512字节的扇区。今天的硬盘驱动器要大得多,文件也同样大。在过去的几年里,512字节的扇区大多被4096字节的扇区所取代,称为4K驱动器。这个扇区大小对于我们今天存储的数据类型更有意义。

问题是,像Windows XP这样的操作系统知道,磁盘扇区一直是,也将永远是512字节。这些操作系统不会容忍报告有4KB扇区的硬盘,因为每个人都知道没有这样的东西。如果你生产4K硬盘,你会做什么?

你总是做同样的事情。

你教硬盘撒谎。

最重要的是,不同的4K驱动器以不同的方式存在。如果操作系统询问驱动器的扇区大小,大多数驱动器都会声明它们有512字节的扇区。声称拥有512字节和4KB扇区的驱动器可能是4K驱动器,很难说出真相。很少有人承认只有4KB扇区。更复杂的是,一些固态驱动器的扇区大到8KB或16KB,或者它们支持多种扇区大小。

FreeBSD的两个主要文件系统都必须知道底层磁盘的扇区大小和该扇区的逻辑块地址。如果在磁盘上使用了错误的扇区大小,性能就会受到影响。我可以深入详细地讨论这是如何发生的,但为了简单起见,始终在甚至兆字节的边界上对齐分区。您可能会在这里和那里浪费一些字节,但与文件系统与磁盘不对齐所带来的真正令人震惊的性能相比,这是微不足道的。

设备节点

我们在第4章中简要介绍了设备节点,但让我们在这里更详细地考虑它们。设备节点是表示硬件设备或操作系统功能的特殊文件。它们被用作逻辑接口,为用户程序提供功能。通过在设备节点上使用命令、向设备节点发送信息或从设备节点读取数据,您可以告诉内核执行操作。如果设备节点代表物理设备,则您正在对该设备进行操作。对于不同的设备,这些操作可能非常不同——将数据写入磁盘与将数据写入声卡非常不同。虽然您可以在任何地方公开设备节点,但标准设备节点存在于 /dev 中。

在使用磁盘或磁盘分区之前,您必须知道其设备名称。FreeBSD磁盘设备节点来自该类型硬件的设备驱动程序的名称。反过来,设备驱动程序名称通常来自设备的类型,而不是设备的角色或功能。

下表显示了常见的磁盘设备节点:

设备节点手册页说明
*/dev/ada**ada(4)ATA型直接存取磁盘 (SATA, IDE, etc.)
*/dev/cd**cd(4)光学介质驱动器 (CD, Blu-Ray, etc.)
*/dev/da**da(4)SCSI型直接存取磁盘(USB storage, SAS, etc.)
*/dev/md**md(4)内存磁盘
*/dev/mmcsd**mmcsd(4)MMC 和 SD 存储卡
*/dev/nvd**nvd(4)NVM express 驱动器
*/dev/vtbd**virtio_blk(4)基于Virtio的虚拟机磁盘
*/dev/xbd**xen(4)Xen 虚拟磁盘

许多RAID控制器将其RAID容器表示为SCSI设备,因此它们显示为 /dev/da 设备节点。其他人将他们的磁盘表示为“SCSI 加上特殊的供应商顶部” ,因此它们获得了特殊的设备节点名称,如 /dev/raid (ATA raid)、 /dev/mfid (某些LSI MegaRaid卡)等 。请查看RAID控制器的手册页,查看它显示的设备节点。

通用访问方法

CAM——Common Access Method,通用访问方法。是一种标准化的设备驱动程序架构。

最初是为了支持20世纪SCSI-2磁盘的复杂命令集而编写的。其想法是,基于这种架构的标准化将简化设备驱动程序的编写。然而,实际上只有FreeBSD和DEC OSF/1附带了CAM,并且每个都以不同的方式填补了规范的空白。

FreeBSD9及更高版本在CAM界面中整合了对所有支持CAM的物理磁盘的管理。使用amcontrol(8) 从磁盘收集信息并向其发出命令。

你有什么磁盘?

要识别主机的存储设备,你可以在 /var/run/dmesg.boot 中搜索磁盘设备节点,或者查看已挂载的文件系统并从那里回溯。但识别储存的最简单方法是让 camcontrol(8) 询问CAM系统看到了什么磁盘。以下示例来自一个测试系统:

输出分为三个字段,第一个给出了设备本身报告的设备名称。这通常是供应商和供应商的星号。

第二部分给出了SCSI连接信息。这些驱动器实际上不是SCSI驱动器,而是通过CAM管理的SATA连接。但现在你知道哪些磁盘设备插入了SATA控制器上的哪个端口。

最后,在括号中,我们有SCSI设备和我们可能想要的存储设备节点。此主机有四个磁盘,分别命名为da0、da1、da2、da3。

Non-CAM 设备

一般来说,除了专有RAID控制器和虚拟磁盘外,所有东西都支持CAM。

RAID控制通常接受并扩展了CAM协议,制造商当时认为这是一个很好的理由。1990s年代初编写的协议对于2010 RAID控制器来说是不够的。这些控制器通常有自己的控制程序。RAID容器显示在 devlist 和其他一些 camcontrol(8)子命令中。

同样,虚拟磁盘也不会对CAM命令做出响应。那里没有磁盘可供命令——你只是将块写入文件。你可以使用 camcontrol devlist 查看磁盘,但仅此而已。

对于大多数应用程序,我建议使用FreeBSD的RAIDZ或GEOM RAID,而不是硬件的RAID控制器。

GEOM存储体系结构

FreeBSD有一个非常灵活的存储基础架构系统,称为GEOM(disk geometry的缩写)。GEOM存在于设备驱动程序节点和底层硬件之间,处理它们之间交换的数据。从这个位置,GEOM可以任意转换输入/输出请求。

设备控制程序 一些存储设备具有通用CAM框架中未涉及的特殊功能。RAID控制器通常具有特定于供应商的功能,FreeBSD包含许多小程序来单独管理这些控制器。您会发现用于旧LSI控制器的mfiutil(8)mptutil(8)、用于新LSI控制器的 mpsutil(10) 等程序。如果你有非易失性存储快速(nonvolatile memory express——NVMe)驱动器,请查看nvmecontrol(8)

GEOM是由称为DTOM类的内核模块构建的,这些模块允许你执行特定类型的转换或管理。磁盘有一个GEOM类,允许内核将数据放在磁盘上。但如果你向加密你的磁盘,那是一个GEOM类。基于软件的RAID?GEOM类。FreeBSD将所有存储修改都实现为GEOM类。

GEOM类是可堆叠的。它们将一个类的输出用作另一个类。你向加密硬盘,然后将其镜像到另一个硬盘吗?当然!将加密模块堆叠在硬盘上,然后将驱动器镜像模块堆叠在其上。你想在网络上镜像那个驱动器?将GEOM类添加到堆栈中。这种灵活的模块化使GEOM成为FreeBSD最强大的功能之一。

GEOM 自动配置

当FreeBSD在启动时,或插入新驱动器时发现新的存储设备时,GEOM子系统会检查设备的已知格式,如主启动记录(MBR)、BSD磁盘标签或其他元数据。GEOM还会检查物理标识符,如磁盘的序列号。这叫做 tasting

当GEOM找到标识信息时,它会按照元数据的指示配置设备。如果一个磁盘的元数据说“我是一个称为 garbage 的镜像的一部分,还有另外两个磁盘”,GEOM会查找其他磁盘并组装镜像。如果GEOM可以通过格式、标签或其他信息识别存储设备,它将启动设备,启动GEOM类的实例,创建适当的设备节点,并执行它理解的任何其他配置。

如果GEOM无法识别磁盘上的任何其他元数据,例如在未格式化和未分区的磁盘上,GEOM会为存储设备创建设备节点并使其保持原样。

GEOM类的一个实例成为 geomgmirror(8) 类使磁盘相互镜像,但名为 garbage 的特定镜像磁盘是一个geom。镜像中的每个磁盘都是一个geom。

GEOM vs. 卷管理器

传统的卷管理器希望你按照它们的方式做事,无论这对你的环境和硬件是否有意义。如果卷管理器说你通过加密单个驱动器并在其上进行镜像来创建加密磁盘镜像,那么这就是你所做的。在你的环境中,镜像驱动器并加密它们可能更有意义,但如果这不是卷管理器所做的,那就太糟糕了。更糟糕的是,一些卷管理器做出了更糟糕的选择,然后横向实施修复,以尽量减少这些决定的后果。

GEOM与卷管理器的不同之处在于,它假设你知道自己在做什么。它为你提供了最适合你的硬件并有利于你的用例的方式安排存储的灵活性。GEOM类允许你轻松地将新的数据转换插入到存储中。例如,你不能在商业卷管理器中添加加密层。

卷管理器涵盖了在构思时存在的硬件的最常见情况。然而,随着时间的推移,这种最常见的情况变得越来越罕见。在为其设计的硬件过时很久之后,人们仍在继续使用卷管理器。GEOM允许你根据硬件、环境和应用程序来改进设计。

FreeBSD包括两个看起来很像卷管理器的软件套件:gvinum(8)ZFSvinum 是1990s的FreeBSD卷管理器,虽然 gvinum(8) 将其重新实现为GEOM类,但强烈建议不要使用它。正如第五章中看到的,ZFS非常强大,但它确实具有卷管理器的“按照我们的方式做事”的精神。

虽然理论上你可以永远堆叠GEOM模块,但你必须考虑你的硬件资源。在网络上镜像繁忙的磁盘可能需要专用的网络接口和空的交叉连接线。加密和解密数据会消耗处理器时间和内存。GEOM并不能阻止你翻动磁盘,它只是为你提供了新的、有趣的机会。

Providers, Consumers 和 Slicers

某一个geom要么是consumer,要么是provider,或者两者都是。

provider ——提供者,向另一个geom提供服务。如果要镜像两个硬盘驱动器,硬盘驱动器的geoms会将磁盘提供给镜像。提供者通常有一个设备节点,例如 /dev/ada1p1

consumer —— 消费者,使用提供者的服务。磁盘镜像geom会消耗底层磁盘驱动器。geom的消费者部分不需要设备节点。

geom既可以是提供者也可以是消费者——实际上,堆栈中间的每个geom都必须是提供者和消费者。磁盘镜像geom消耗底层物理存储介质,但它为文件系统提供了一个镜像磁盘。

FreeBSD对所有提供者和消费者一视同仁。物理磁盘只是一个提供者,就像镜像、加密层或从网络导入一样。这一特性允许你任意堆叠GEOM类。

细分类的GEOM类称为 slicer (切片器),通常负责管理分区。处理主引导记录分区的GEOM类是一个切片器,GUID分区表(GPT)类也是如此。我们在第二章讨论了这两种分区方法,我们将在本章中更深入地探讨这两种方法。切片器必须确保磁盘分区不重叠,并且分区符合分区方案的规则。

GEOM 控制程序

许多GEOM类都有一个控制程序,允许你管理模块或查询设备。一些广泛使用的类使用geom(8) ,而其他类使用 gmirror(8)geli(8) 等程序。 disk GEOM类与物理存储介质通信,并为上层提供消费者。这是一个非常有用的类。以下示例,我们询问主机,看看它有什么geom类型的磁盘,并打印出磁盘为操作系统提供的信息。

这个硬件提供了一个磁盘驱动器名为da0➊。Mediasize 段给出了以字节为单位的大小,并将其转换为更易读的923GB➋。

此磁盘声称其 Secorsize 为512字节➌。许多磁盘在扇区大小上撒了谎。查看驱动器制造商的文档可以确定实际扇区大小。驱动器可能提供4k的 Stripesize值,标识它们实际上是4k驱动器。

Mode 类看起来像是文件权限➍,但它实际上是从设备读取(r2)和写入(w2)的GEOM类数量,加上请求独占(exclusive)访问设备的设备数量(e3)。

descr 段➎提供驱动器的型号。

lunname 段➏给出了型号加上序列号。是的,它是 decrident 字段的组合。硬盘真的很想让你相信这是它的名称和标识符。

lunid ➐给出逻辑单元号(logical-unit-number——LUN)标识符,该标识符描述了此驱动器如何连接到此主机。

ident ➑ 是驱动器的序列号。

rotationrate ➒告诉我们驱动器的转速。这是一个7,200RPM的驱动器。对于固态硬盘,这个值应该是0。

fwsectorsfwheads fields ➓ 为我们提供了驱动的几何图形。这些是本章开头提到的谎言的例子。甚至SSD也提供了这些值。

有些驱动器提供的信息较少。虚拟磁盘几乎不提供任何信息,而且它们所说的任何内容都是不可信的。(虽然VM系统可能会说这个磁盘提供32212254720个512字节的扇区,但谁知道虚拟磁盘下的实际磁盘有什么?)

GEOM设备节点和堆栈

许多系统管理员工具希望在磁盘或磁盘分区上运行。类Unix系统提供磁盘和分区作为设备节点。GEOM提供设备节点,以便这些工具保持兼容。

大多数活动的GEOM模块在 /dev 中都有自己的目录。该目录中的设备节点表示该模块的当前提供者。目录通常(但并非总是)以使用它的GEOM模块命名。例如,gmerror(8)类使用 /dev/mirror

可能会更改目录名称以避免歧义或重叠。glabelGEOM标签)类使用/dev/label/dev/gpt目录包含存储在gpt分区上的标签,其中/dev/gptid包含gpt分区不可或缺的数字标识符。

有些类不创建目录,而是依赖于(piggyback)现有设备。gnop(8)类在它所连接的节点旁边创建一个新节点,但将 .nop 附加到设备名称的末尾。

硬盘、分区和方案

当我们在第9章讨论分区时,请从磁盘驱动器的角度考虑分区。我们的第一个SATA控制器上的第一个可能的SATA磁盘称为/dev/ada0。后续的磁盘是/dev/ada1/dev/ada2等。如果您还有SAS磁盘,它们将从0开始重新编号。

磁盘被进一步划分为 partitions (分区)。即使是运行微软操作系统的普通消费级系统,硬盘上也有多个分区。系统管理员将巨大的磁盘阵列切割成更小、更易于管理的单元,用于特定目的——或者他们可能会采取另一种方式,将多个磁盘合并到一个怪物分区中。

partitioning scheme (分区方案)是用于组织磁盘上分区的系统。传统的主引导记录(MBR)是一种分区方案。老苹果和SPARC硬件都有自己的方案。如今,大多数硬件和操作系统使用的方案是GUID分区表(GUID Partition Tables ——GPT)。每种方案对引导块、硬件架构和分区都有自己的要求。本书讨论了MBR和GPT方案,但您应该知道还存在其他方案。

每个磁盘分区都有自己的设备节点,通过在底层设备节点名称的末尾添加一些内容来创建。在这里,我查看了在虚拟磁盘上使用UFS进行默认FreeBSD安装的设备节点:

我们有一个磁盘本身的设备节点,然后还有另外三个以p1、p2和p3结尾的节点。这些细分是什么?p表示它们是GPT分区。在默认安装中,p1是引导分区,p2是交换空间,p3是主文件系统。

每个分区方案都有自己的设备节点扩展。我们将在本章稍后阅读这些内容。

文件系统表: /etc/fstab

FreeBSD和大多数类Unix操作系统一样,使用文件系统表 /etc/fstab 将磁盘分区映射到文件系统并交换空间。虽然ZFS不使用 /etc/fstab,但其他FreeBSD文件系统都可以出现在其中。每个正在使用的分区都显示在单独的行上,以及安装和管理说明。

第一个字段给出GEOM提供程序名称。这可能是一个物理磁盘分区,如/dev/ada0p1,也可能是GEOM设备节点的分区。这里的前两行提供/dev/gpt下的设备节点。它们是GPT标签,我们将在本章稍后看到。我们的第三个条目列出了单词proc而不是设备节点:它是procfs(5)虚拟文件系统,我们将在第13章中对此进行研究。

第二个字段给出了文件系统可用的目录,称为挂载点。您可以在其上读取或写入文件的每个分区都附加到一个挂载点,如/usr/var等。一些特殊分区,如swap space(此处第2行),其挂载点为 none 。您无法将可用文件读写到交换空间,因为它们没有连接到目录树,而且系统在交换时会覆盖这些文件。

接下来,我们有文件系统类型。第一行显示了一种 ufs 或Unix文件系统。第二行被定义为交换空间,而第三行是 procfs 类型。其他类型包括 cd9660(CD磁盘或映像)、nfs(网络文件系统挂载)和 ext4fs(Linux文件系统)。文件系统表告诉FreeBSD如何装载这个分区。第13章讨论了替代文件系统。

第四个字段显示了用于此特定分区的 mount(8)选项。每个文件系统都有自己的挂载选项,但以下是多个文件系统使用的一些选项,这些选项经常出现在 /etc/fstab 中:

第五个字段用于告诉 dump(8)备份此文件系统需要什么备份级别。如今,垃圾桶在很大程度上已经过时了;人们使用 tar(1)执行文件级备份或使用更高级的备份软件,如Bacula(http://www.bacula.org/)或Tarsnap(https://www.tarsnap.com/).

最后一个字段告诉FreeBSD引导过程何时检查文件系统的完整性。所有具有相同编号的分区都会与 fsck(8)并行检查。根文件系统被标记为1,这意味着它首先被检查。只有根文件系统应该得到1。任何其他分区都应该得到2或更高的值,这意味着它们稍后会被检查。交换、只读介质和逻辑文件系统不需要完整性检查,因此它们被设置为0。

FreeBSD在启动时配置 /etc/fstab 中的所有文件系统。不过,在系统运行时,系统管理员可以挂载其他文件系统。她可以卸载那里列出的那些。这就引出了我们的下一个问题。

现在挂载了什么?

如果并非所有文件系统都在启动时自动挂载,并且系统管理员可以添加和删除挂载的文件系统,那么您如何确定现在挂载了什么?使用无任何选项的 mount(8)查看所有已挂载的文件系统。

这是一个基于UFS的小型主机。它有一个磁盘分区和一个 devfs(5)实例(见第13章)。local 一词意味着分区位于连接到此计算机的硬盘驱动器上。日志软更新(journaled soft-updates)选项是我们将在第11章讨论的UFS功能。如果您使用NFS或SMB装载分区,它们将显示在此处。

更复杂的主机会产生更大的结果:

此主机使用许多ZFS数据集,每个数据集都有自己的装载点。mount(8)输出显示了选定的ZFS选项,如 noatimenfsv4acls

在这个输出的末尾,我们有一个procfs(5)条目和一个 devfs(5)挂载条目。一个正常工作的FreeBSD系统需要将 devfs 挂载到 /dev,否则它将无法很好地工作或工作很长时间。

磁盘标签

在最底层,操作系统通过磁盘与系统的物理连接来识别磁盘。传统上,文件系统表会说,“将连接在ATA端口3的磁盘用作 /var/log 文件系统。” 这在不太灵活的硬件上运行良好,但随着硬件技术的改进,这种连接变得更加灵活。如果根据物理附件分配驱动器角色,有时该附件会发生变化。在一个不方便的时刻,我有不止一个主板爆炸,迫使我紧急更换。在这种情况下,跟踪哪根电缆连接到哪个连接器永远不会顺利。在FreeBSD的旧版本中,您需要“连接”设备,以便特定磁盘始终显示为特定设备节点。这已不再需要。

如今,系统管理员使用磁盘上的标签来指代物理附件以外的磁盘。标签标识geom的实例。与其告诉FreeBSD /var/www 在连接到SATA端口2的磁盘上,不如声明 /var/www 在标记为网站的磁盘上。虽然前者很容易出错,但后者大多对昏昏欲睡的硬件技术人员免疫。一个磁盘可以同时有多个标签,如果它们是不同类型的标签。FreeBSD会自动从固有的磁盘特性中派生出许多标签;系统管理员可以定义其他人。

大多数标签类型都有一个专用的设备节点目录。每个GPT分区都有一个全局唯一标识符(globally unique identifier —— GUID),这些分区的自动创建标签位于 /dev/gptid 中。磁盘根据其序列号获得唯一的磁盘ID,序列号在 /dev/diskid 中获取条目。手动创建的GPT标签显示在 /dev/gpt 中。

像使用其他设备名称一样使用这些标签。如果将磁盘ada5标记为 stuff1,则可以将磁盘内容分区为 stuff1p1stuff1p2,在配置文件中使用这些分区,等等。

并非所有标签都来自GEOM。ZFS对文件系统和池使用自己的内部标记方法。您还可以向UFS文件系统添加标签。

不要让更换的SATA电缆毁了你的周末。给一切打标签。

查看标签

使用 glabel(8)查看标签,这是 geom label 的快捷方式。以下是来自小型虚拟机的标签的一部分。真实硬件上的标签很快就会变得非常复杂。

此主机在磁盘分区 /dev/ada0p1 上有一个geom➊。它根据GPT分区ID提供了一个令人震惊的长标签➋。我们将在底层磁盘上看到一堆信息,例如磁盘上的扇区数量、扇区大小以及您可能在 geom disk list输出中看到的其他信息。然而,这些信息来自分区。物理驱动器信息从底层磁盘向上传递。

该驱动器只有一个消费者(Consumers)➌,即实际的底层分区。我们位于这个简单的GEOM堆栈的最底层,正好对着磁盘,所以它正在消耗自己。如果你添加加密层或软件RAID,你会看到这个geom消耗了哪些其他设备。

标签示例

以下是您在大多数FreeBSD系统上看到的标签类型的一些示例。

磁盘ID标签

物理机提供虚拟机上不可用的标签。

驱动器ada3提供了一个名为 diskid/DISK-WD-WCAW36477141 的geom。diskid geom以硬盘驱动器的序列号命名,基于驱动器提供的信息。您可以从这台机器中删除磁盘并将其连接到完全不同的FreeBSD主机,新主机将生成完全相同的磁盘ID标签。在配置中使用diskid标签可以保证FreeBSD将使用您想要的确切磁盘。以下是如何在 /etc/fstab 中列出此磁盘上的分区3:

这个磁盘可以作为/dev/ada3/dev/ada300连接到主机,FreeBSD仍然会将这个分区挂载为/usr/local

磁盘ID标签的问题在于,它们很难阅读,更难打字。我之所以描述它们,是因为它们可以默认出现,但我建议你选择一个不同的标签。通过在 /boot/loader.conf 中将可调的 kern.geom.label.disk_ident.enable 设置为0,从主机中删除这些标签。

GPT GUID标签

每个GPT分区都包含一个GUID。FreeBSD可以将GUID视为一个标签。在这里,我们看到磁盘上分区1的GPT ID标签附加为ada0:

此磁盘分区可方便地作为 /dev/gptid/075e7b89-30ed-11e7-a386-002590dbd594 ➊使用。与磁盘序列号非常相似,GUID是分区的组成部分。您可以将磁盘移动到另一台主机,但仍然可以获得相同的GPT ID。通过在 /etc/fstab 等配置中使用GPT ID标签,您可以保证FreeBSD在任何设备上使用此特定分区,而不是分区1,以便在系统启动时分配ada0。

当您有许多自动配置的磁盘(如大型存储阵列)时,使用GPT ID标签是有意义的。然而,在较小的系统上,128位GUID的长度令人烦恼。如果您决定不使用这些标签,请通过在 /boot/loader.conf 中将可调的 kern.geom.label.gptid.enable 设置为0,将其从系统中删除。

对于大多数主机,我建议分配GPT标签。

GPT 标签

GPT分区允许您在分区表中手动分配标签名称。我强烈建议尽可能这样做。这是一个我为其命名的分区:

我已将标签 swap2 ➊分配给磁盘ada2上的分区1。此标签物理存储在磁盘分区上。我可以在配置中使用此标签,就像使用任何其他设备名称一样。对于小型系统,使用手动分配的标签更易于管理,如 /etc/fstab 所示:

分配的标签比长序列号或GUID更人性化。如果你有选择的话,我建议你给GPT分区贴上标签。我们将在分区磁盘时分配标签。

GEOM 标签

除了在系统上溢出标准标签外,glabel(8)命令还允许您配置GEOM标签。GEOM标签特定于FreeBSD的GEOM基础架构,出现在 /dev/label 中。将GEOM标签与glabel label命令一起使用。在这里,我将GEOM标签根应用于GPT分区da0p1:

还有一个 glabel create命令,但这些标签在系统重新启动时会消失。

GEOM 枯萎

一个提供者可以有多个标签。一个分区可能具有基于底层存储设备的磁盘ID的标签(/dev/diskid/somethinglong)、GPT ID(/dev/gptid/somethingevenlonger)、手动分配的标签(/dev/gpt/swap0)和基于底层设备连接点的设备节点(/dev/ada0p1)。虽然任何数量的进程都可以同时查看磁盘设备,但许多磁盘操作(如挂载分区)都需要对设备进行独占的专用控制。

为了防止通过多个名称访问geoms,当您通过一个标签访问设备时,内核会删除未使用的标签。这被称为枯萎。如果我使用GPT标签 /dev/GPT/swap0 挂载交换分区,该分区的所有其他标签都会从 /dev 中消失。任何试图访问相应 /dev/gptid 分区的人都会发现设备节点丢失。

一旦删除了设备上的所有独占锁,内核就会删除其他设备标签。如果我停用该交换空间,GPT ID和原始设备名称将重新出现。

gpart(8) 命令

与许多操作系统一样,FreeBSD曾经为每种分区方案提供了特定的分区工具。如今,所有磁盘分区功能,无论是MBR还是GPT,都包含在 gpart(8)程序中。具有专用存储的嵌入式设备可能偶尔需要像 fdisk(8)bsdlabel(9)这样的旧工具,但 gpart(8)在服务器和台式机上运行良好。

这个通用工具意味着您无论使用哪种分区方案,都可以以相同的方式执行许多功能。例如,无论您使用的是MBR还是GPT方案,您都需要一种方法来指示特定的分区。这两种方案都允许您使用 -i和分区号指示分区。

查看和删除分区是常见功能的绝佳示例。

查看分区

使用 gpart show 查看geom上所有GPT和MBR分区的简要摘要。将geom的名称作为参数,仅查看该geom上的分区。gpart show 的输出看起来与 fdisk(8)和其他更传统的磁盘管理工具没有太大不同。在这里,我按传统设备节点查看存储设备,但我可以使用diskidgptid 或任何其他标签:

第一列给出分区中的第一个块;第二,分区大小(以块为单位)。第三个给出分区编号,第四个给出分区类型。(我们将在本章稍后讨论分区类型:目前,请按照流程进行。)最后,我们有磁盘大小。

我们的第一个分区从磁盘的扇区号40开始,填充了近20亿个扇区➊。第三个字段显示这不是磁盘上的分区,而是整个磁盘的条目。第四个字段给出了所使用的分区方案。这是一个GPT磁盘。整个磁盘大约为932GB。

第二个条目也从扇区40开始,它填充了1024个扇区➋。这是分区1,类型为freebsd-boot。如果我们想启动这个磁盘,我们需要在这个分区上安装一个引导加载程序。

第三个条目从1064扇区开始,填充984个扇区➌。为什么是1064?第一个分区从扇区40开始,填充了1024个扇区,因此第一个(1024+40)1064个扇区被其他分区填充。但是这个分区没有分区号,它的类型是 -free- 。此分区与4K扇区的磁盘对齐。

第四个条目是交换空间,根据分区类型➍。它从扇区2048开始,长4194304个扇区,是分区2。您经常会在磁盘的开头附近看到交换空间,这是磁盘上分区放置影响性能的遗留问题。但是,如果您使用的是虚拟机,将交换放在磁盘开头附近会为您在磁盘末尾扩展分区留出空间。

第五个条目是FreeBSD ZFS文件系统,从4196352扇区开始,大约有19亿个扇区➎。这个FreeBSD-ZFS分区有我们的数据。

磁盘的最末端有1416个空闲扇区➏。在将分区与1MB边界对齐的同时,没有足够的空间为分区添加空间。

MBR磁盘看起来很像GPT磁盘。

其他视图

添加命令行标志以修改 gpart show 的输出。

您可以根据底层设备名称和分区号组装每个分区的设备节点。如果你想看到设备节点而不是分区号,请添加 -p 标志。

要用分区标签替换分区类型,请使用 -l

在这里,我显示了设备节点和磁盘上的标签:

分区号现在包含完整的设备名称,如 ada0p3。您将获得应用于GPT分区的标签,如 swap0zfs0,而不是GPT分区类型。

要查看人类敌对的GPT分区类型,而不是FreeBSD提供的名称,请使用 -r。我主要在检查其他操作系统的磁盘时使用它。FreeBSD可能会将多个分区类型标记为 ntfs 类型;虽然这对于大多数用途来说已经足够好了,但如果我在做数字取证,精确的分区方案可能非常重要。

要查看GPT分区的更详细描述,请使用 gpart list 。这创建的输出与 glabel list 或其他GEOM类命令非常相似。

删除分区

也许你在创建分区时搞砸了,需要删除一个。不,您还没有在MBR或GPT中创建分区,但您遵循的过程是相同的。按编号删除分区。

请查看上一节中的分区表。我们有用于引导、交换和ZFS的分区。也许你不想交换启动驱动器上的空间。使用 gpart delete 命令删除该分区。使用 -i 标志和要删除的分区号。gpart show 命令表示交换空间为分区2。让我们删除它。

现在,您可以调整ZFS分区的大小以使用该空间。调整分区大小的方式因分区方案而异。

规划磁盘

不,不是那种故意把磁盘放在你面前的阴谋。我们正在讨论磁盘的分区方案。无论是在真实世界(meatspace)还是在储存方面,破坏都比创造更容易。在对磁盘进行分区之前,您需要为其分配一个分区方案。

删除磁盘分区方案

你可以仔细地删除磁盘上的每个分区,然后抹去分区方案。不过,这是一堆工作。将整个磁盘分区表丢弃要简单得多。

您无法擦除已装载分区的磁盘。首先卸载这些分区,并将其从任何ZFS池中删除。一旦磁盘真正未使用,请使用 gpart destroy 擦除任何现有的分区表。

如果命令立即返回,则磁盘没有分区。它可能有一个分区方案,但没有分区。如果出现“设备繁忙”错误,则表明磁盘仍在使用中或磁盘有分区。您可以使用 gpart delete 有条不紊地删除所有现有分区,然后销毁分区方案,但通过添加 -F 更容易将现有方案烧毁。

这会强制擦除所有分区和分区方案。运行 gpart show da3 将显示没有分区表。现在,您可以创建新的磁盘分区。

分配分区方案

在创建磁盘分区之前,您需要用您将使用的分区方案的类型标记磁盘。使用带有 -s标志和方案的 gpart create,如 gptmbr 。在这里,我将磁盘标记为使用GPT方案:

使用 gpart show 验证磁盘现在是否有GPT分区表。现在,您可以添加GPT分区,或使用MBR重新创建分区表并添加这些分区。但我们将从深入了解GPT开始。

GPT分区方案

GUID分区表(GUID Partition Table——GPT)是硬盘分区的现代标准。这是新安装的推荐标准。始终使用GPT分区方案,除非您有非常令人信服的理由不这样做,例如缺乏硬件支持。

GPT支持高达9.4ZB的磁盘。一泽字节(zettabyte)等于十亿兆兆字节(one billion terabytes)。虽然我们的技术最终将超过9.4ZB,但我预计GPT将持续我的职业生涯。

FreeBSD的GPT实现目前支持128个分区。每个分区都分配了一个GUID,这是一个128位的数字,显示为32个十六进制字符。虽然GUID不能保证在所有文明中都是唯一的,但它们在你的组织中肯定是唯一的。

大多数现代操作系统支持GPT及其前身主引导记录(MBR)。基于MBR的系统将分区记录放在磁盘的第一个扇区中。如果主机仅支持MBR,但磁盘的第一个扇区包含非MBR的内容,系统会感到困惑,并可能拒绝启动。GPT方案在每个磁盘的第一个扇区中放置一个保护性主引导记录(protective master boot record—— PMBR)。PMBR表示磁盘包含一个GPT类型的MBR分区。第二个扇区包含实际的GUID分区表。GPT还将分区表的备份副本放在磁盘的最后一个扇区上,这样您就可以更容易地从损坏中恢复。

GPT需要为引导代码分配一个分区。PMBR引导代码在磁盘中搜索FreeBSD引导分区。此引导分区必须大于引导代码,小于545KB,并保留给FreeBSD引导加载程序。FreeBSD有两个GPT引导加载程序,gptboot(8)gptzfsboot(8)。您必须在启动分区上安装其中一个。

使用 gptboot(8)启动基于UFS的系统。在系统启动时,gptboot 会搜索标记有 bootmebootonce 属性的FreeBSD分区。

在运行ZFS的系统上使用 gptzfsboot(8)

使用 gpart(8)及其许多子命令来查看、创建、编辑和销毁GPT分区。

GPT设备节点

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

许多系统将其分区放在上层geom上。我的一个系统使用SATA RAID,并提供 /dev/RAID/r0 磁盘。此驱动器上的分区是 /dev/raid/r0p1/dev/raid/r0p2等。您也可以通过设备的GUID或磁盘ID将分区放在设备上,得到 /dev/diskid/disk-WD-WCAW36477062p1 等分区。

GPT 分区类型

创建GPT分区时,必须用 partition type 标记它。类型表示分区的预期用途。FreeBSD根据分区类型做出决定,因此请正确分配它们。

严格来说,分区类型是另一个128位GUID。FreeBSD用前导感叹号标记用作分区类型的GUID,例如 !516e7cb5-6ecf-11d6-8ff8-00022d09712b 。这些分区类型在所有操作系统中都很常见,但大多数操作系统都为这些人类敌对的GUID提供了人类友好的名称。这本书使用了人性化的名字;检查 gpart(8)中是否存在人类敌意(human-hostile)。

你在FreeBSD系统上看到的最常见的分区类型包括以下几种:

您可能还会看到这些GPT分区类型。不要在现代FreeBSD中使用它们,但要知道它们的存在可能会帮助你识别出那个奇怪的磁盘是什么,以及如何破解它。

有关已识别分区类型的完整列表,请参阅 gpart(8)

创建 GPT 分区

分区磁盘很容易:找出你想要的分区,创建它们,然后开始。棘手的部分是与你的分区共存。在创建分区之前,请决定如何处理此磁盘。你有多少空间?你想怎么分配?在开始创建分区之前,写下你想要实现的目标。

在这里,我正在为UFS FreeBSD安装手动分区1TB磁盘。它需要一个512KB的启动分区(类型 freebsd-boot)和8GB的交换分区(类型 freebsd-swap)。其他分区将为 freebsd-ufs :5GB用于root,5GB用于 /tmp,100GB用于 /var ,其余用于 /usr 。我将为每个分区标记其预期角色。

使用 gpart(8)创建分区。使用 -t 标志指定分区类型,-s 表示大小,-l 为新分区分配GPT标签。我将从启动分区开始。

使用 gpart show检查您的工作。添加 -l标志以查看GPT标签。

这个磁盘有一个分区,一个标记为 boot 的512K分区。命令成功。现在添加交换空间:

此命令与添加引导分区的命令非常相似:我们给出分区类型、大小和标签。

不过,等等——这是什么——-a 1m-a 标志允许您设置分区对齐,使您能够设置分区相对于磁盘起点的开始和结束位置。还记得在本章开始时,我讨论过将文件系统与4K磁盘上的物理扇区错位可能会导致问题吗?-a 1m 命令告诉 gpart 从磁盘开始就在1MB的偶数倍上创建分区。分区1和分区2之间会有一些空白,正如我们在本章第215页的“查看分区”中看到的那样,但没关系。这为您提供了在必要时更改分区以支持UEFI的空间(请参阅本章稍后的“Unified Extensible Firmware Interface and GPT”)。

在创建5GB根和 /tmp 分区以及100GB /var分区时,保持1MB的对齐。

创建最后一个分区时,不要给出大小。这个命令告诉gpart使分区尽可能大。

您已经对磁盘进行了分区,可以安装系统了。

调整 GPT 分区大小

再想想,也许拥有一个巨大的 /usr 分区是不明智的。100GB左右的 /usr 分区将拥有您可能需要的操作系统文件的所有空间,同时为隔离的 /home 分区留下数百GB的空间。我信任我的大多数用户,但也有少数用户会将 /dev/random 转储到文件中,直到他们吸收所有可用空间。在这里,我将调整 /usr 的大小,为 /home 创建空间。

使用 gpart resize 更改分区的大小。您必须知道目标分区的分区号。运行 gpart show da3 告诉我们 /usr 是分区6。使用 -i 标志和分区号来调整分区大小:

运行 gpart show 查看新的磁盘大小:

此磁盘末尾有714GB的可用空间。我们现在可以为所有麻烦的用户创建一个宽敞的 /home

每个分区在磁盘上都分配了特定的扇区。如果分区两侧都没有可用空间,则无法增加分区的大小。虽然这个示例磁盘在分区6之后有一堆可用空间,但您不能使用它来增加分区1到5的大小。您必须删除并重新创建分区。

更改分区的大小不会更改该分区上文件系统的大小。用文件系统缩小分区将切断文件系统的一部分。增加分区大小不会扩展文件系统。UFS和ZFS都有工具来处理增加的分区大小,但您必须将其作为一个单独的过程来处理。

更改标签和类型

您可以使用 gpart modify 命令修改GPT分区的类型或GPT标签。用 -i表示分区号。用 -l 表示新标签。在这里,我更改了磁盘vtbd0分区2上的GPT标签:

同样,使用 -t 更改分区类型:

磁盘的GPT表现在声明分区2标记为 rootfs,类型为 freebsd-zfs

在旧硬件上启动

较旧的硬件希望在磁盘开始时看到主引导记录,并且无法识别GPT分区表。FreeBSD使用保护性MBR(PMBR)为遗留硬件提供可识别的分区表,并帮助该硬件引导GPT分区磁盘。使用GPT格式化的可引导磁盘需要保护性MBR和GPT引导加载程序。

使用 gpart bootcode 命令和 -b 标志安装PMBR。FreeBSD提供了一个名为 /boot/pmbr 的PMBR。

此磁盘将不再混淆寻找MBR的主机。

您还需要一个引导加载程序。UFS主机需要 gptboot 引导加载程序,而ZFS主机则需要 gptzfsboot 。为了方便起见,FreeBSD在 /boot 目录中提供了每个文件的副本。这些副本不是磁盘上的引导加载程序,只是该版本FreeBSD所需的引导加载版本。将所选的带有 -p标志的引导加载软件安装到 gpart bootcode 中。使用 -i 选项告诉 gpart(8)将引导加载程序复制到哪个分区。我们在上一节中使用的示例磁盘的分区1的类型为freebsd-boot,因此我们将使用它。

您可以将 -p-b 组合成一个命令。

统一的可扩展固件接口和GPT

Unified Extensible Firmware Interface (UEFI)——统一的可扩展固件接口,是一种新的标准,用于在不使用BIOS仿真的情况下引导amd64硬件。FreeBSD 10和更高版本早期支持UEFI引导到UFS,而FreeBSD 11可以从UEFI引导ZFS。

UEFI使用 efi 类型的分区,该分区必须为800KB或更大。使用 gpart create在新磁盘上创建efi分区。

FreeBSD提供了一个名为 /boot/boot1.efifat 的efi分区。使用 dd(1)将其复制到新的启动分区。

根据需要对磁盘的其余部分进行分区。

efi分区实际上是一个具有非常特定目录层次结构的FAT文件系统。请随意挂载 boot1.efifat 文件并探索它。

扩展GPT磁盘

我们已经看到了如何扩展分区,但磁盘呢?扩展磁盘通常发生在虚拟主机上。展开虚拟磁盘,gpart(8) 将抱怨磁盘的GPT无效。GPT和GEOM将信息存储在磁盘的第一个和最后一个扇区中。扩展虚拟磁盘意味着添加扇区。新的最后一个扇区将是空的。使用 gpart recover 为最后一个扇区创建新的元数据块。

现在,您可以在扩展的虚拟磁盘上创建或扩展分区。

现在您已经掌握了GPT分区,让我们来看看MBR,看看为什么GPT看起来像是一种改进。

MBR分区方案

旧硬件或新的但较小的硬件可能需要在其磁盘上进行主引导记录分区。几十年来,英特尔风格的硬件一直使用MBR分区,数百万运行大量操作系统的设备都使用它。MBR方案仅适用于2TB或更小的磁盘。较大的磁盘必须使用GPT分区。

什么是主引导记录?

主引导记录(master boot record ——MBR)是一个占用传统磁盘(也称为 零扇区——Sector 0)前512字节的文件。MBR包含分区信息和引导加载程序,以允许BIOS找到操作系统。术语MBR可能指磁盘上的实际第一个扇区或该格式使用的分区方案。

主引导记录描述了四个主要分区——primary partitions ,在BSD社区中称为切片(slices)。每个切片描述都包括分区中包含的磁盘扇区以及该切片上预期的文件系统类型。如果一个磁盘上只有一个切片,MBR仍然会列出四个切片,但其中三个切片没有分配扇区。虽然MBR格式支持最多20个扩展分区的链表,但由于BSD标签,FreeBSD不需要它们。

四个主要切片中的一个被认为是活动的。当系统开机时,引导代码会查找活动切片并尝试引导它。

MBR扇区还包含引导代码。您不需要专门为引导加载程序分配空间。在FreeBSD中,引导代码查找并执行内核。FreeBSD包括两个不同的引导加载程序,mbrboot0 。mbr加载器适用于具有单一操作系统的主机。如果您的硬件上安装了多个操作系统,请使用boot0加载器,或者更好的是,将您的主机专用于FreeBSD并虚拟化其他操作系统。

切片的主要功能是包含一个 bsdlabel(8)分区。

BSD标签

BSD在MBR或IBM PC之前就已经存在了。BSD使用自己的磁盘分区格式,称为 disklabel 。现在给磁盘贴标签更为常见,磁盘标签也被称为BSD labelsbsdlabels 。(如果你想开始一场激烈的讨论,问问FreeBSD开发人员,哪个更正确。)BSD系统有几个分区,包括至少/(root)、/usr/var/tmp 和交换空间,以及用于系统实际工作的单独分区。

当BSD移植到i386平台时,他们可以将磁盘切换到使用MBR分区。使用扩展的MBR分区,一个磁盘最多可以有24个分区。然而,磁盘标签分区嵌入了整个内核,通常在没有人敢碰的讨厌的地方。移植小组决定将MBR切片视为BSD磁盘,并用BSD磁盘标签对每个切片进行分区。系统管理员需要创建MBR分区,然后在这些MBR分区内嵌套磁盘标签分区。

这起作用了,但也使单词 partition 变得模糊。partition 是指MBR分区还是磁盘标签分区?FreeBSD去掉了MBR分区的词 slices 。每个MBR切片都有自己的磁盘标签,列出了切片中包含的BSD分区。如果你来自Linux或Microsoft Windows背景,你熟悉的MBR分区在这里被称为 slices

您无法为切片或磁盘分区添加标签。这些格式没有标签空间。相反,在分区上标记ZFS或UFS文件系统。

可以跳过磁盘切片,而是直接在硬盘上安装磁盘标签。一些硬件拒绝从这些磁盘启动,因此它们被称为 dangerously dedicated(危险专用)。随着GPT的出现,危险的专用磁盘不再被真正使用。

MBR 设备节点

每个磁盘、切片和分区都有一个设备节点。切片设备节点是底层磁盘的扩展,分区设备节点是设备节点的扩展。以下是基于MBR的系统的磁盘ada0上的设备节点:

磁盘的第一个细分是切片。设备节点用字母 s 和1到4之间的数字表示切片。第一个切片是s1,第二个切片是s2,以此类推。未使用的MBR分区无法获得设备节点。这里, /dev/ada0s1 是磁盘上的切片1。

第二层细分是切片内的磁盘标签分区。每个分区都有一个唯一的设备节点名称,该名称是通过在切片的设备节点上添加一个字母创建的。这里,我们有四个磁盘标签分区,/dev/ada0s1a/dev/ada0s1e。传统上,以 a/dev/ada0s1a)结尾的节点是根分区,而以 b/dev/ada0s1b)结尾的是交换空间。

请注意,设备节点列表不使用字母 c 。c分区表示整个切片。如今,您在切片条目上运行磁盘分区工具,而不是在切片的磁盘标签上运行。

以您喜欢的任何方式分配分区d到h。默认磁盘标签最多可以有七个可用分区。每个驱动器上最多有四个切片,一个驱动器上最多可以有28个分区。一个磁盘标签最多可以支持20个分区,但您必须在首次创建标签时表明您需要额外的分区。

MBR和磁盘标签对齐

切片有自己的磁盘扇区和文件系统块对齐问题。传统上,MBR分区在圆柱体边界上结束。圆柱体边界在现代硬件上没有任何意义,但即使是较新的驱动器也为较旧或功能较弱的硬件提供了一个安慰性的谎言。如果您创建的MBR分区不以圆柱体边界结束,并且将该磁盘放在需要尊重圆柱体边界的机器中,那么机器将出现某种神经崩溃。理论上,你今天切片的磁盘可以进入旧系统。因此,FreeBSD会排列切片,使其在圆柱体边界上结束。圆柱体边界不仅可能与4K磁盘扇区大小冲突,而且很可能确实存在冲突。如果没有别的,MBR本身会占用第一个柱面,即63个512字节的扇区!

幸运的是,您很少写入切片表,写入切片表的性能也很少成为问题。如果将切片内的磁盘标签分区对齐到1MB边界,则切片分区表和磁盘标签分区之间会丢失一些扇区,但您将获得适当的性能。

所以:对齐磁盘标签分区。不要对齐切片。

创建切片

使用 gpart(8)管理MBR切片。要创建切片,您需要一个分区类型和大小。FreeBSD切片使用类型 freebsd 。如果不指定大小,gpart(8) 将使用所有可用空间。在空磁盘上,这将整个磁盘专用于单个切片。

在这里,我擦除现有的分区,告诉磁盘使用MBR方案,并创建一个FreeBSD切片:

运行 gpart show,您将看到此磁盘现在只有一个切片。添加 -p标志以查看切片的设备节点。

我们的切片ada3s1现在已准备好用于磁盘标签分区。

要创建多个切片,请使用 -s 指定大小。小型嵌入式系统的常见配置是在磁盘上放置三个切片。两个较小的切片包含不同版本的操作系统,而第三个切片包含任何数据。在这里,我将这个1TB的磁盘分为两个150GB的切片,并将其余的切片交给第三个切片:

删除切片

使用 gpart delete 删除不需要的切片。用 -i给出切片编号。在这里,我从上一节中创建的多层磁盘中删除了第三个更大的切片:

激活切片

活动切片是BIOS尝试引导的切片。使用 -a 活动标志设置活动切片。使用 -i 给出活动切片的编号。

通过设置不同的活动切片来更改启动哪个切片。

引导盘还需要一个引导加载程序。虽然MBR引导加载程序与GPT或UEFI引导加载程序不同,但它使用相同的 gpart(8) -b 标志。FreeBSD提供了一个MBR引导加载程序的副本,名为 /boot/mbr

磁盘ada3上的切片1现在可以启动。现在您已经切片了磁盘,您可以在切片内创建BSD标签。

BSD 标签

在切片内创建BSD标签(或磁盘标签)分区与创建切片或GPT分区非常相似。您必须告诉存储设备要使用的方案,创建和删除分区,直到您满意为止,并安装引导加载程序。

创建 BSD 标签

如果GPT和MBR专门为分区表提供空间,则必须创建一个BSD标签并将其写入切片的开头。与任何方案一样,使用-s和方案名称。将此方案安装在切片上,而不是磁盘上。

假设你想在切片ada3s1上创建一个BSD标签。使用BSD方案。

这是一个默认的磁盘标签,有8个磁盘标签分区的空间。通过使用 -n 标志,您可以将分区数量增加到20个。在这里,我在大型分区ada3s3上创建了一大堆分区。

此切片上没有实际的磁盘标签分区;只有一个标签可以包含磁盘标签分区。现在标签已经存在,您可以创建这些分区。

创建 BSD 标签分区

在盲目输入分区命令之前,请计划如何对磁盘进行分区。事先在纸上弄清楚事情比在命令行上弄清楚要容易得多。我将为UFS文件系统对这个磁盘上的第一个150GB切片进行分区。此切片将为/(root)、swap和 /tmp 获得5GB的分区。其余的将转到 /usr。为什么没有 /var ?我将把大切片ada3s3专用于 /var 。我不需要添加引导分区,因为MBR磁盘不需要。

要创建磁盘标签分区,您必须使用 -t指定类型,使用 -s 指定大小,这与GPT分区完全相同。FreeBSD UFS文件系统属于freebsd-ufs 类型。让我们从根分区开始。

要查看此分区,您必须向命令 gpart show 指定切片设备,而不是磁盘设备。使用磁盘设备显示切片。

第三行输出显示了我们的5GB分区。

在这个切片的一开始,我们有1985个空闲块,或993KB。我要求分区与1MB边界对齐,所以gpart浪费了一点空间来满足这个要求。我很乐意失去993KB,而不是将系统性能减半。

现在创建 freebsd-swap 类型的交换分区。

接下来是5GB /tmp 。然后,我通过省略大小将剩余的空间转储到 /usr 的分区中。

gpart show 显示,我们的磁盘标签分区在磁盘末尾浪费了63个块,即32KB。看着我不在乎。

这些分区现在已准备好接收文件系统。我们在第11章讨论UFS。

指定特定分区字母

在传统的BSD标签上,a 分区用于根文件系统,而 b 用于交换。c 分区代表整个切片。这不是强制性的,但我建议不要将这些字母用于任何其他目的。

为什么这很重要?我曾经在服务器上添加了一个硬盘,这样我们就有更多的空间来存储数据库。我们将数据库软件移动到分区 a ,将实际数据移动到分区 b。几个月后我去度假时,系统虚拟内存不足。我接到一个系统管理员的电话,他发现并激活了新驱动器上未配置的交换空间,但现在数据库数据丢失了。是的,该公司失去了几位客户和数千美元的收入,这很可悲,但更重要的是,它毁了我假期的一天,给剩下的日子蒙上了阴影。这是不可接受的。

不要费心去对抗这些传统,尤其是在越来越常见的磁盘格式上。除了伯克利长老们(Berkeley elders)规定的分区外,不要使用字母 abc 表示分区。

gpart 程序旨在处理分区号,而不是字母。然而,当您创建磁盘标签时,gpart add 会将索引号映射到字母上。分区1是 a,分区2是 b,以此类推。通过在创建分区时指定分区索引,您可以将字母分配给分区。

如果你没有指定分区号,gpart add 会分配以 a 开头的分区字母。你可能会分配第一个分区号18,但如果你没有为下一个分区指定一个数字,它最终会得到分区 a。为了避免使用abc,请为你创建的每个分区使用一个数字。您最多只能使用分区具有的磁盘标签插槽数量的字母。一个标准的磁盘标签只能使用字母A到h,而一个20分区的标签可以使用at

在我的三切片系统中,我想在ada3s3上添加 /var。我想使用abc以外的字母,所以我随机选择索引18。它几乎与 /usr 的分区完全相同,但我们将其添加到不同的切片中。

要查看磁盘标签分区,您需要运行 gpart show ada3s3 。添加 -p 以查看设备名称。

你知道什么?我们字母表的第18个字母是 R 使用分区,我们可以开始查看文件系统。