(此章也是机翻)
ZFS卷或zvol是由ZFS池支持的一块空间,用作块设备。
zvol通常被用作文件备份文件系统,并通过iSCSI导出到其他设备。
zvol没有正常的数据集文件、目录和权限,而是依赖于使用卷提供文件系统的任何东西。
zvol通常用作其他网络设备的iSCSI目标,使你可以在文件系统不太灵活的操作系统上访问ZFS支持的存储。
还可以将zvol用作虚拟机的存储,即使客户端操作系统无法使用ZFS,也可以让任何客户操作系统访问ZFS的完整性功能。此外,可以在整个网络上复制zvol。
本章将揭示一些常见的zvol陷阱,但要先从zvol的基础知识开始。
-V选项告诉zfs create创建一个zfs卷。给出所需的大小和卷的完整路径。以下示例在vm池创建一个2TB的zvol。由于此卷将导出到web服务器,我们将其命名为www1:
xxxxxxxxxx
# zfs create -V 2T vm/www1
Zvols必须是数据集的子对象。在这个例子中,zvol是池根数据集的子数据集。您不能将zvol创建为zvol的子对象。我们的体积显示在数据集列表中。
xxxxxxxxxx
# zfs list -r vm
NAME USED AVAIL REFER MOUNTPOINT
vm 2.06T 563G 31.8K /vm
vm/db1 2.06T 2.61T 15.9K -
zvol会立即占用您为其分配的所有空间。我们创建了一个2 TB的卷,因此它使用了2 TB的空间以及一些额外的元数据空间。一个全新的卷还没有使用这么多空间——它还没有将一堆占位符数据写入池或类似的东西。它只是通过重新保存来声称空间。
使用zfs destroy命令销毁卷:
xxxxxxxxxx
# zfs destroy vm/www1
您可以在zvols上使用大多数其他ZFS命令,例如重命名和移动。这个卷实际上是用于数据的,所以我们给它起了一个更有意义的名字:
xxxxxxxxxx
# zfs rename vm/www1 vm/db1
zvol具有许多与其他ZFS数据集相同的属性,但并非全部。zvol具有独特的属性,如volmode和volblocksize,而您不能在zvol上设置sharenfs或atime。
通过设备节点访问zvol。大多数zvol在/dev/zvol中都有设备节点,位于以其池命名的目录中。我们的示例zvol的设备节点vm/db1将是/dev/zvol/vm/db1。根据其模式,zvol可能有其他设备节点。
ZFS允许您创建一个大于可用空间的ZFS卷,从而过度占用空间。保留一些空间但不够,称为精简配置。精简配置在较旧的文件系统上是相当危险的,因为您可以轻松地配置比文件系统包含的空间更多的空间。您可以通过添加更多硬盘来轻松扩展ZFS池,因此在这里没有那么大的风险。refreservation属性控制一个卷为它保留了多少空间。在这里,我们创建了2 TB的zvol db5,但告诉ZFS只为它保留100 MB。
xxxxxxxxxx
# zfs create -V 2T -o refreservation=100M db/db5
我们这些有几个空的SAS机架并且已经计划添加更多硬盘驱动器的人甚至可能使用稀疏卷。稀疏卷仅使用卷上使用的空间量。使用-s标志创建稀疏卷。
xxxxxxxxxx
# zfs create -V 2T -s db/db5
如果要将iSCSI卷导出到其他主机,并且客户端的文件系统不如ZFS灵活,则可以使用较小的保留。当底层磁盘扩展时,扩展NTFS或UFS文件系统可能会导致长期问题。使用稀疏卷意味着您可以告诉Windows主机iSCSI设备具有特定的大容量,即使底层池没有那么多可用空间。支持它的zvol会消耗设备上文件使用的空间量,以及任何文件系统元数据。 如果您准备支持,这可以让您创建真正令人印象深刻的卷。在这里,我们创建一个2EB的稀疏卷。它下面的池只有500GB也没关系。
xxxxxxxxxx
# zfs create -V 2E -s db/db5
使用gpart show/dev/zvol/db/db5,您将看到这个磁盘设备实际上是2 EB。如果您真的需要在单个iSCSI卷上使用2 EB的空间,您可能可以负担得起一个软盘,以足够快的速度解压缩和装载硬盘,以满足需求。 当你用完空间时,克服困难会变得非常丑陋。当您的iSCSI客户端被告知这些卷空间不足时,即使操作系统实例坚持认为它们只有10%的空间,他们也可能完全失去冷静。许多iSCSI堆栈都能很好地应对这些问题。其他人…没有。 如果您没有足够的物理硬件容量来添加存储,请让ZFS卷占用与其大小相等的空间。不要占用过多空间。
在为您的应用程序创建卷之前,请考虑其预期用途以及哪些主机将访问它。FreeBSD的默认ZFS设置假定托管zvol的系统完全控制它。但是,如果您将zvol用作虚拟机的存储,客户操作系统希望完全控制它。这很重要,因为FreeBSD的GEOM层会自动配置存储。主机已配置的存储会给虚拟化客户机带来问题。 使用volmode属性控制哪个系统配置卷。 默认卷模式geom表示卷所在的系统控制它。如果我们在主机a上创建一个zvol,主机a将通过geom配置和管理卷。除了ZFS卷的设备节点外,它还获取/dev/label等文件中的设备节点。当您在本地使用zvol时,请使用geom-volmode。 volmode dev意味着这个zvol只能通过/dev/zvol中的单个设备节点使用。GEOM不会尝试自动配置此卷。您可以为节点分配标签,但FreeBSD甚至不会尝试查看它。对虚拟机存储使用dev volmode,如bhyve(8)主机。
volmode none意味着这个zvol甚至没有获得设备节点。您可以克隆此卷、快照或复制它。此模式仅适用于备份。 您无法更改实时zvol的模式——虽然您可以更改volmode属性的值,但卷的实际模式不会改变。要使卷模式更改生效,请导出并重新导入卷。(您还可以重命名卷,这实际上是导出卷并以其他名称导入。) 通过在命令行中指定模式或设置全局默认值,使用所需模式创建卷。
与任何其他属性一样,在创建zvol时使用-o标志设置volmode。
xxxxxxxxxx
# zfs create -V 10G -o volmode=dev vm/swap0
这个新的zvol只能由设备节点/dev/zvol/vm/swap0访问。
如果主机通常需要使用geom以外的volmode,则更改默认volmode是有意义的。sysctl vfs.zfs.vol.mode控制新zvol的默认volmode。 默认值1告诉ZFS使用geom的volmode。设置为2表示dev-volmode,而设置为3表示无volmode。使用sysctl(8)更改默认值,或在下次重新启动时使用/etc/sysctl.conf条目使更改永久有效。这里有一个/etc/sysctl.conf条目,用于让虚拟化服务器创建volmode为dev的新zvol。
xxxxxxxxxx
vfs.zfs.vol.mode=2
没有必要明确定义geom volmode。
你不能像挂载文件系统数据集那样挂载zvol。zvol的全部意义在于它是一个块设备。要访问它,您必须访问设备节点或其GEOM提供程序。最常见的可能是设备节点。 zvol在/dev/zvol中获取一个设备节点,该节点位于以池命名的子目录中。我们的示例zvol的设备节点vm/db1将是/dev/zvol/vm/db1。 我们可能会将此zvol指定为bhyve虚拟机的存储,在这种情况下,我们可能会让虚拟机对磁盘进行分区。 对于其他用途,我们可能希望在本地对其进行分区。在这里,我们在zvol上创建一个GPT分区方案,并将其设置为一个大分区,GEOM标签为db1。我们还为它分配了一个GEOM标签。
xxxxxxxxxx
# gpart create -s gpt /dev/zvol/vm/db1
zvol/vm/db1 created
# gpart add -t freebsd-ufs -l db1 /dev/zvol/vm/db1
zvol/vm/db1p1 added
# glabel create db1 /dev/zvol/vm/db1
由于此zvol是使用默认volmode geom创建的,因此现在也可以通过设备节点/dev/label/db1访问它。 一旦分区存在,您就可以在其上创建文件系统。
xxxxxxxxxx
# newfs -j /dev/zvol/vm/db1
/dev/zvol/vm/db1: 2097152.0MB (4294967296 sectors) block size 32768, fragment size 4096
using 3350 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
with soft updates
…
等等,为什么我们可能想在zvol上使用UFS? 也许我们的iSCSI客户端或VM客户机没有足够的资源来有效地运行ZFS。通过为客户端提供一个由ZFS支持的卷和它可以支持的文件系统,客户端可以获得ZFS的额外保护,即使客户端不能直接使用ZFS。然而,我使用-j启用UFS软更新日志记录,因为ZFS数据完整性和UFS文件系统日志记录保护的内容完全不同。ZFS完整性检查确保写入是安全的,但文件系统日志记录会验证所有写入是否完成。 既然zvol有一个文件系统,您就可以挂载它了。
xxxxxxxxxx
# mount /dev/gpt/db1 /media/
瞧!我有一个由ZFS支持的UFS文件系统,可以随时使用。 zvols最常见的用途是作为虚拟机的后备存储。大量的虚拟机需要大量的硬件。接下来我们来看看。