第零章:介绍

Z文件系统(ZFS)是一个复杂的怪兽,但它也是系统管理员的蝙蝠侠式实用工具带中最强大的工具。本书试图揭开ZFS如此强大的魔力的神秘面纱,并在您与存储巨龙战斗时为您提供坚实、可操作的信息。

ZFS包含行业中一些最优秀的人才100多年的“工程年”努力。虽然它有竞争对手,如B-Tree文件系统(BTRFS),但这些竞争对手还有许多要赶上来的事情。

本书将带您进入管理ZFS的一些更复杂和更深奥的部分。如果您想知道为什么单个GB的数据填充您的2GB驱动器,如果您想自动更新灾难恢复设施,或者如果您只想在笔记本电脑上使用引导环境,《FreeBSD Mastery:Advanced ZFS》适合您。

本书中的几乎所有内容都适用于OpenZFS。我们使用FreeBSD作为参考平台,但使用OpenZFS的机制在平台之间没有太大变化。

第零章:介绍前置条件ZFS 最佳实践空间管理选择VDEV类型标签的重要性为磁盘添加标签GPT 标签(手动)GPTID 标签(自动)磁盘ID 标签(自动)glabel(手动)DTrace各章速览

前置条件

这本书的标题包括“高级”这个词。我们希望你在使用它之前知道一些事情。简单的答案是,您应该阅读并吸收两个早期的《FreeBSD Mastery》标题:《Storage Essentials》和《ZFS》。但你可能已经知道这些书中有什么,所以这里有一些关于你需要随身携带的东西的细节。

您需要熟悉FreeBSD的存储管理层——GEOM。在非FreeBSD平台上,您可以为ZFS使用磁盘和分区设备。始终在磁盘或分区设备上使用ZFS,而不是在RAID或其他软件设备上。

我们假设您熟悉ZFS池和数据集。您知道如何将VDEV添加到池中,并理解为什么不能将单独的磁盘添加到RAID-Z中。您可以拍摄快照并创建克隆。

如果您想使用FreeBSD的加密ZFS支持,您必须了解FreeBSD的GELI加密。(如果您依赖加密来保护人类生命,则可以使用GBDE,但内置的GELI支持足以满足我们大多数人的需要。此外,GELI还利用了现代CPU中的AES-NI硬件加密加速。)

ZFS 最佳实践

虽然您可以从公开可用的文档中获得所有所需的ZFS知识,但这不会为您提供我们在早期书籍中讨论的ZFS最佳实践。与技术中的许多其他东西一样,最佳实践的好处是有许多可供选择。

我们在这里讨论一些最佳实践。也许这些做法比你的好,你会高兴地采用它们。也许它们会激发您现有最佳实践的一些改进。即使您的最佳做法让我们大吃一惊,但这些至少显示了我们的偏见,因此您可以知道我们是如何解决存储管理问题的。

空间管理

对于写时复制文件系统,删除文件会占用空间。习惯于传统文件系统的系统管理员在开始使用ZFS时可能会听到这一点,但不要真正将其内部化(internalize),直到他们第一次用完磁盘并遭受严重的冲击。随着池接近容量,ZFS需要越来越多的时间来存储额外的数据块。性能下降。虽然ZFS开发人员不断减少碎片对性能的影响,但随着池的利用率接近100%,这变得越来越成问题。

从完全满的池中恢复非常困难。要防止使用所有空间,或者至少提前提供警告,请创建保留(reservation)。

理想情况下,您应该为池容量的20%创建预订。在添加更多容量或删除旧数据时,您始终可以降低预订以争取时间。最后一件事是意外地耗尽空间。这可以为您提供Unix文件系统(UFS)提供的软着陆,其中只有root用户可以使用最后百分之几的可用磁盘空间。

在这个1 TB池上,我们创建了一个具有200 GB refreservation的新数据集。

每当您在ZFS数据集上探索空间问题时,请记住 zfs get space 命令。您将在一个方便的显示中看到所有与空间相关的属性。

虽然 zfs get space 不会腾出空间,但这是找出所有空间去向的最快方法。

选择VDEV类型

正如在《FreeBSD Mastery:ZFS》中详细讨论的那样,在创建池时选择正确的VDEV类型是您做出的最重要的决定。它会影响池的性能以及扩展可能性。

Páris、Amer、Long和Schwarz的研究(http://arxiv.org/ftp/arxiv/papers/1501/1501.00513.pdf)发现要构建一个可以在无人交互的情况下生存四年的磁盘阵列,需要三重奇偶校验(triple parity)RAID。即使具有无限数量的备件,双奇偶校验也无法在四年内保持99.999%(五个9)的可靠性。

将这一考虑与您的硬件和预期的未来存储需求相结合。

标签的重要性

通过标记驱动器,您为未来的自己节省了许多麻烦。在将磁盘和分区添加到ZFS池之前,或者实际上以任何方式使用它们之前,请标记它们,原因我们将在本节中讨论。

以Jude的一个不幸的朋友为例,他用原始设备名称创建了一个池。当设备出现故障时,他会在更换磁盘之前重新启动。他的池看起来和他想象的有点不一样。

最初,池由两个镜像组成:da1da15mirror-0da2da14mirror-1 。磁盘 da1 出现故障。

FreeBSD在引导时动态分配磁盘设备节点。由于缺少 da1 ,FreeBSD对剩余的磁盘设备进行了编号,以将编号降低一个。磁盘 da15 变成了 da14da14 变成了 da13,最糟糕的是,da2 变成了 da1

因此,mirror-1 包含的 da1 与故障磁盘的 da1 不同。mirror-0 正在使用其备用(da7)来代替以前称为 da1 的内容。然而,有一次Jude的不幸朋友为失败的 da1 放回了一个磁盘,那个 da7 就变成了 da8

ZFS不使用FreeBSD磁盘名称来查找每个VDEV的成员,而是依赖于其自己的具有全局唯一标识符(GUID)的磁盘标签。ZFS可以识别磁盘,无论操作系统将其设备节点放在何处。操作系统也不关心它为您找到了磁盘并挂载了文件系统;你还想要什么?

然而,这很容易混淆人工操作员。突然间,da1 并不是故障设备,而是另一个VDEV中的完美设备!在操作员更换设备并重新启动机器后,被更换的驱动器几乎肯定会再次变为 da1 。所有设备节点都将移回其原始值。在所有这些结束时,系统管理员不知道哪个磁盘是哪个。他心里唯一的想法是需要一杯烈性饮料。

为磁盘添加标签

FreeBSD提供了几种标记磁盘或分区的方法。有些是自动的,有些是由用户管理的。每一种都有优点和缺点。一个设备可以有多个标签。

一旦访问标签,指向同一设备的其他标签就会萎缩(wither)并无法访问。这可以防止通过多个名称访问单个设备。

默认情况下,将激活所有自动生成的标签。如果希望使用手动标签,最好禁用手动方法。

GPT 标签(手动)

如果使用GUID分区表(GPT)对磁盘进行分区,则每个分区都可以包含您选择的文本标签。这是两位作者首选的标记磁盘的方法。

使用 gpart(8) 创建并标记新分区。

在这里,我们更改现有第二个分区上的标签。

手动标签允许您通过物理位置或序列号等特征来标识磁盘。

如果使用GPT标签,建议禁用GPTID和磁盘ID标签。

GPTID 标签(自动)

在GPT分区方案中,每个分区都有一个唯一的GUID。GPT ID标记系统使用GUID来标识分区。问题是GUID对人类来说意义不大。通过查看几个示例,您可以看到,很难发现差异。

如果只有第一段的最后几个字符实际上不同,那么很容易混淆自己。

如果ZFS在GPTID标签下看到池的一部分,然后在不同的标签下看到相同的池,则它使用GPTID标记。这会隐藏您精心手工制作的标签。通过将以下内容添加到 /boot/loader.conf ,在引导时禁用GPTID标签。

FreeBSD默认启用GPT ID标签。

磁盘ID 标签(自动)

虽然GPT和GPTID标签标识分区,但磁盘标识(Disk Ident,或称 diskid)标签标识整个磁盘。设备名称基于磁盘的序列号,这很方便。不幸的是,序列号中的任何特殊字符(特别是空格)都会被编码。这会创建非常难看的设备名称。此外,由于标签标识磁盘而不是分区,因此附加了设备名称(p3)的分区部分,并且很难从设备名称中选择出来。

可以禁用这些自动生成的标签,以阻止ZFS使用它们而不是GPT标签。将以下内容添加到 /boot/loader.conf

许多人都强烈支持磁盘ID标签。作者不会说这些论点是不正确的。我们会说,磁盘ID标签让我们俩都头痛。

默认情况下,FreeBSD启用磁盘ID标签。

【此处存疑,我手上的几个系统(从11.1到15)的/boog/loader.conf中都有以下设置:

glabel(手动)

除了所有其他类型的标签外,您还可以创建存储在磁盘或分区的最后一个扇区中的GEOM标签。这些标签采用特定于GEOM的格式,称为 glabel。这些定制glabel的优点是不需要使用GPT格式,因此它们可以与MBR格式的磁盘和没有分区的原始磁盘一起工作。glabel使用提供商的最后一个扇区。

使用 glabel(8) 创建和查看glabels。

现在有了一个 /dev/label/mylabel 设备。

所有标签都必须唯一。虽然可以将同一标签应用于多个磁盘,但只显示一个磁盘。

DTrace

一些ZFS功能的更高级别调优需要使用DTrace,这是一个用于跟踪软件行为和性能的程序。

在ZFS中熟悉地使用DTrace需要了解内核内部。这不是一本关于DTrace或内核内部的书。获取现有脚本并运行它既不需要也不需要。

我们鼓励您使用这些DTrace脚本的输出来解决ZFS问题,并将其作为选择了解内核内部构件的入口点。您可能不需要是程序员,但专业的系统管理员应该了解系统如何工作。

盲目运行的脚本正是Lucas咆哮和斥责的那种“神秘IT”。也就是说,下面就是您如何盲目地运行DTrace脚本。

DTrace将内核模块用于监视软件行为的软件探测:dtrace.kodtraceall.ko 。您可以在 loader.conf 中的引导时自动加载这些模块。如果找不到内核模块,dtrace(1) 程序会在您第一次运行时自动加载它们。

必须以 root 身份运行 dtrace

将脚本复制到文件中。然后运行 dtrace -s ,将脚本作为参数。

点击 CTRL-C 中断脚本。

您可以从Lucas的GitHub回购(从zfsbook.com链接)下载本书中给出的所有DTrace脚本。

了解内核如何工作的FreeBSD系统管理员可以更快、更正确地解决问题。有关ZFS内部的概述,请阅读最新版本的《The Design and Implementation of the FreeBSD Operating System》(Addison-Wesley Professional,2014)。同样,DTrace是一个非常值得学习和理解的强大工具。我们推荐Gregg和Mauro的书《DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X, and FreeBSD》(Prentice Hall,2011)。

各章速览

对于那些阅读书籍介绍的人:祝贺你们。我们希望您学到了一些东西,或者至少提醒了您一些重要的细节。让我们继续讨论引导环境!