第五章:ZFS卷

ZFS卷或称 zvol ,是由ZFS池支持的空间块,用作块设备。zvol通常像文件支持的文件系统一样使用,并通过iSCSI导出到其他设备。zvol没有正常的数据集文件、目录和权限,而是依赖于使用卷提供文件系统的任何内容。Zvol通常用作其他网络设备的iSCSI目标,使您能够访问具有不太灵活的文件系统的操作系统上支持ZFS的存储。您还可以将zvols用作虚拟机的存储,使任何来宾操作系统都可以访问ZFS的完整性功能,即使客户端操作系统不能使用ZFS。此外,您可以跨网络复制zvol。

我们在《FreeBSD Mastery:ZFS》中谈到了zvols。本章揭示了一些常见的zvol陷阱。但让我们从zvol基础开始。

第五章:ZFS卷创建、销毁和操作 ZFS卷稀疏(Sparse)卷卷模式命令行上的 volmode默认 volmode访问 zvols

创建、销毁和操作 ZFS卷

-V 选项告诉 zfs create 创建一个ZFS卷。给出所需的大小和卷的完整路径。以下示例在 vm 池创建一个2TB的zvol。由于此卷将导出到web服务器,我们将其命名为 www1

Zvols必须是数据集的子对象。在这个例子中,zvol是池根数据集的子数据集。您不能将zvol创建为zvol的子对象。我们的体积显示在数据集列表中。

zvol会立即占用您为其分配的所有空间。我们创建了一个2 TB的卷,因此它使用了2 TB的空间以及一些额外的元数据空间。一个全新的卷还没有使用这么多空间——它还没有将一堆占位符数据写入池或类似的东西。它只是通过重新保存来声称空间。

使用 zfs destroy 命令销毁卷:

您可以在zvols上使用大多数其他ZFS命令,例如重命名和移动。这个卷实际上是用于数据的,所以我们给它起了一个更有意义的名字:

zvol具有许多与其他ZFS数据集相同的属性,但并非全部。zvol具有独特的属性,如 volmodevolblocksize ,而您不能在zvol上设置 sharenfsatime

通过设备节点访问zvol。大多数zvol在 /dev/zvol 中都有设备节点,位于以其池命名的目录中。我们的示例zvol的设备节点 vm/db1 将是 /dev/zvol/vm/db1 。根据其模式,zvol可能有其他设备节点。

稀疏(Sparse)卷

ZFS允许您创建一个大于可用空间的ZFS卷,从而过度占用空间。保留一些空间但不够,称为精简配置(thin provisioning)。精简配置在较旧的文件系统上是相当危险的,因为您可以轻松地配置比文件系统包含的空间更多的空间。您可以通过添加更多硬盘来轻松扩展ZFS池,因此在这里没有那么大的风险。refreservation 属性控制一个卷为它保留了多少空间。在这里,我们创建了2 TB的zvol db5 ,但告诉ZFS只为它保留100 MB。

我们中的一些人有几个空的SAS机架,并且已经计划添加更多硬盘驱动器,甚至可以使用稀疏卷(sparse volumes)。稀疏卷仅使用卷上使用的空间量。使用 -s 标志创建稀疏卷。

如果要将iSCSI卷导出到其他主机,并且客户端的文件系统不如ZFS灵活,则可以使用较小的保留。当底层磁盘扩展时,扩展NTFS或UFS文件系统可能会导致长期问题。使用稀疏卷意味着您可以告诉Windows主机iSCSI设备具有特定的大容量,即使底层池没有那么多可用空间。支持它的zvol会消耗设备上文件使用的空间量,以及任何文件系统元数据。

如果您准备支持,这可以让您创建真正令人印象深刻的卷。在这里,我们创建一个2EB的稀疏卷。它下面的池只有500GB也没关系。

使用 gpart show/dev/zvol/db/db5 ,您将看到这个磁盘设备实际上是2 EB。如果您真的需要在单个iSCSI卷上使用2 EB的空间,您可能可以负担得起一个仆人(flunky),以足够快的速度解压缩和挂载硬盘,以满足需求。

当你用完空间时,克服困难会变得非常丑陋(ugly)。当您的iSCSI客户端被告知这些卷空间不足时,即使操作系统实例坚持认为它们只有10%的空间,他们也可能完全失去冷静。许多iSCSI堆栈都能很好地应对这些问题。其他人…没有。

如果您没有足够的物理硬件容量来添加存储,请让ZFS卷占用与其大小相等的空间。不要占用过多空间。

卷模式

在为您的应用程序创建卷之前,请考虑其预期用途以及哪些主机将访问它。FreeBSD的默认ZFS设置假定托管zvol的系统完全控制它。但是,如果您将zvol用作虚拟机的存储,客户操作系统希望完全控制它。这很重要,因为FreeBSD的GEOM层会自动配置存储。主机已配置的存储会给虚拟化客户机带来问题。

使用 volmode 属性控制哪个系统配置卷。

您无法更改实时zvol的模式——虽然您可以更改 volmode 属性的值,但卷的实际模式不会改变。要使 volmode 更改生效,请导出并重新导入卷。(您还可以重命名卷,这实际上是导出卷并以其他名称导入。)

通过在命令行中指定模式或设置全局默认值,使用所需模式创建卷。

命令行上的 volmode

与任何其他属性一样,在创建zvol时使用 -o 标志设置 volmode

这个新的zvol只能由设备节点 /dev/zvol/vm/swap0 访问。

默认 volmode

如果主机通常需要使用geom以外的 volmode ,则更改默认 volmode 是有意义的。sysctl vfs.zfs.vol.mode 控制新zvols的默认 volmode

使用 sysctl(8) 更改默认值,或在下次重新启动时使用 /etc/sysctl.conf 条目使更改永久有效。这里有一个 /etc/sysctl.conf 条目,用于让虚拟化服务器创建 volmodedev 的新zvol。

没有必要明确定义geom volmode

访问 zvols

你不能使用 zfs mount 像挂载文件系统数据集那样挂载zvol。zvol的全部意义在于它是一个块设备。要访问它,您必须访问设备节点或其GEOM提供程序。最常见的可能是设备节点。

zvol在 /dev/zvol 中获取一个设备节点,该节点位于以池命名的子目录中。我们的示例zvol的设备节点 vm/db1 将是 /dev/zvol/vm/db1

我们可能会将此zvol指定为 bhyve 虚拟机的存储,在这种情况下,我们可能会让虚拟机对磁盘进行分区。

对于其他用途,我们可能希望在本地对其进行分区。在这里,我们在zvol上创建一个GPT分区方案,并将其设置为一个大分区,GEOM标签为 db1 。我们还为它分配了一个GEOM标签。

由于此zvol是使用默认 volmode ,geom创建的,因此现在也可以通过设备节点 /dev/label/db1 访问它。

一旦分区存在,您就可以在其上创建文件系统。

等等,为什么我们可能想在zvol上使用UFS?

也许我们的iSCSI客户端或VM客户机没有足够的资源来有效地运行ZFS。通过为客户端提供一个由ZFS支持的卷和它可以支持的文件系统,客户端可以获得ZFS的额外保护,即使客户端不能直接使用ZFS。然而,我使用 -j 启用UFS软更新日志记录,因为ZFS数据完整性和UFS文件系统日志记录保护的内容完全不同。ZFS完整性检查确保写入是安全的,但文件系统日志记录会验证所有写入是否完成。

既然zvol有一个文件系统,您就可以挂载它了。

瞧!我有一个由ZFS支持的UFS文件系统,可以随时使用。

zvols最常见的用途是作为虚拟机的后备存储。大量的虚拟机需要大量的硬件。接下来我们来看看。